使用Photon PUN创建简单对战游戏
前言:
photon PUN是一款用于實(shí)現(xiàn)聯(lián)網(wǎng)對(duì)戰(zhàn)的插件,通過(guò)簡(jiǎn)單的設(shè)計(jì),就可以實(shí)現(xiàn)加入大廳,加入房間,并且進(jìn)行對(duì)戰(zhàn),玩家可以同步動(dòng)畫和位置等參數(shù),同時(shí)可以通過(guò)RPC機(jī)制,廣播參數(shù),實(shí)現(xiàn)房間內(nèi)的玩家消息共享。
對(duì)戰(zhàn)實(shí)現(xiàn)
1.打開photon官網(wǎng),再打開賬號(hào),登錄。
2.點(diǎn)擊Your Applications,創(chuàng)建應(yīng)用,選擇PUN,按要求填寫,然后再?gòu)?fù)制Appid,打開unity創(chuàng)建項(xiàng)目。
3.在unity的資源商店中搜索photon PUN,下載導(dǎo)入。
4.粘貼剛才復(fù)制的appid,點(diǎn)擊setup project—close
5.新建一個(gè)場(chǎng)景,添加如下的UI組件,一個(gè)是名字輸入面板,點(diǎn)擊之后進(jìn)入大廳。
6.在場(chǎng)景中新建一個(gè)空物體,命名NetWorkManager,同樣新建一個(gè)腳本NetworkManager,填充命名空間PUN,更改繼承類為MonoBehaviourPunCallbacks,首先在start函數(shù)中啟動(dòng)。連接服務(wù)器,具體的代碼如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using Photon.Pun; using UnityEngine.UI; using Photon.Realtime;public class NetworkManager : MonoBehaviourPunCallbacks {#region 私有變量#endregion#region 公開變量public static NetworkManager _instance;//單例public InputField nameInputField;//名字輸入框public InputField RoomnameInputField;//房間名輸入框public GameObject readyBtn;//準(zhǔn)備按鈕public GameObject startBtn;//開始游戲按鈕public GameObject NamePanel;//名字設(shè)置面板public GameObject LobbyPanel;//大廳面板public GameObject RoomPanel;//房間面板public GameObject StartInitPanel;//開始初始化面板#endregion#region Mono函數(shù)private void Awake(){if (_instance == null){_instance = this;}}private void Start(){PhotonNetwork.ConnectUsingSettings();//初始化設(shè)置,連接服務(wù)器}private void Update(){if (PhotonNetwork.LocalPlayer.IsMasterClient)//判斷是否是房主,是就顯示開始游戲按鈕,不是就顯示準(zhǔn)備按鈕{readyBtn.SetActive(false);startBtn.SetActive(true);}else{readyBtn.SetActive(true);startBtn.SetActive(false);}}#endregion#region 按鈕函數(shù)/// <summary>/// 名字設(shè)置按鈕/// </summary>public void SetNicknameButton(){if (nameInputField.text.Length < 2)return;PhotonNetwork.NickName = nameInputField.text;//將輸入的名字上傳至網(wǎng)絡(luò)if(PhotonNetwork.InLobby)//判斷是否在大廳內(nèi),在就顯示大廳,隱藏名字面板{LobbyPanel.SetActive(true);NamePanel.SetActive(false);Debug.Log("已經(jīng)在大廳中");}}/// <summary>/// 創(chuàng)建或加入房間按鈕/// </summary>public void joinOrCreateRoomBtn(){if(RoomnameInputField.text.Length<=2){return;}LobbyPanel.SetActive(false);RoomOptions roomOptions = new RoomOptions { MaxPlayers = 4 };//房間最大人數(shù)4人PhotonNetwork.JoinOrCreateRoom(RoomnameInputField.text, roomOptions, default);RoomPanel.SetActive(true);}#endregion#region Photon函數(shù)public override void OnJoinedRoom(){if (PhotonNetwork.LocalPlayer.IsMasterClient)//判斷是否是房主,是就顯示開始游戲按鈕,不是就顯示準(zhǔn)備按鈕{readyBtn.SetActive(false);startBtn.SetActive(true);}else{readyBtn.SetActive(true);startBtn.SetActive(false);}}/// <summary>/// 當(dāng)成功連接該服務(wù)器/// </summary>public override void OnConnectedToMaster(){NamePanel.SetActive(true);//顯示名字面板StartInitPanel.SetActive(false);//隱藏開始初始化面板PhotonNetwork.JoinLobby();//加入大廳Debug.Log("加入大廳成功");}#endregion }7.新建一個(gè)RoomManagerList的空物體,同理新建一個(gè)RoomMnaager腳本,主要用來(lái)管理房間列表的顯示:
using Photon.Pun; using Photon.Realtime; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class RoomManager : MonoBehaviourPunCallbacks {public GameObject roomNamePrefab;//房間顯示的預(yù)制體public Transform gridLayout;//預(yù)制體的父物體/// <summary>/// 房間更新的函數(shù),每次房間消失或者增加,就會(huì)進(jìn)行調(diào)用,所以要對(duì)消失的時(shí)候進(jìn)行特殊處理/// </summary>/// <param name="roomList">返回的房間參數(shù)</param>public override void OnRoomListUpdate(List<RoomInfo> roomList){Debug.Log("roomlist:" + roomList.Count);for (int i = 0; i < gridLayout.childCount; i++)//遍歷父物體下的子物體{if (gridLayout.GetChild(i).gameObject.GetComponentInChildren<Text>().text == roomList[i].Name)//有相同的物體{Destroy(gridLayout.GetChild(i).gameObject);//銷毀if (roomList[i].PlayerCount == 0)//如果房間玩家為0{roomList.Remove(roomList[i]);//移除該房間}}}foreach (var room in roomList)//遍歷生成房間的顯示{GameObject newRoom = Instantiate(roomNamePrefab, gridLayout.position, Quaternion.identity, gridLayout);//生成房間按鈕newRoom.GetComponent<RoomBtn>().roomName = room.Name;//設(shè)置房間名字newRoom.GetComponentInChildren<Text>().text = room.Name + "(" + room.PlayerCount + "/4)";//顯示參數(shù)}} }8.為了點(diǎn)擊房間按鈕,可以進(jìn)入該房間,所以給按鈕添加腳本事件,新建一個(gè)腳本RoomBtn,房間按鈕是一個(gè)預(yù)制體,需要事先進(jìn)行設(shè)置,在scroll view里面的content下新建按鈕,然后記得給content添加Vertical layout group和content size fitter組件,同理在玩家面板,也需要設(shè)計(jì)玩家對(duì)應(yīng)的預(yù)制體,方法類似,代碼如下:
using Photon.Pun; using Photon.Realtime; using System.Collections; using System.Collections.Generic; using UnityEngine;public class RoomBtn : MonoBehaviourPunCallbacks {public string roomName;void Start(){}/// <summary>/// 點(diǎn)擊按鈕,加入該房間/// </summary>public void JoinRoomBtn(){PhotonNetwork.JoinRoom(roomName);//加入房間NetworkManager._instance.RoomPanel.SetActive(true);//顯示房間面板NetworkManager._instance.LobbyPanel.SetActive(false);//隱藏大廳面板}}9.在進(jìn)入房間后,需要對(duì)玩家進(jìn)行更新,同時(shí)要判斷是不是房主,如果是,房主則可以進(jìn)行開始游戲,如果不是,則顯示一個(gè)準(zhǔn)備按鈕。這里其實(shí)也可以做一個(gè)聊天的聯(lián)機(jī),添加以下組件,作為聊天的輸入和顯示。
腳本InRoom代碼:
這里還添加了一個(gè)代碼,綁定給玩家的按鈕,
代碼內(nèi)容:
10.新建一個(gè)場(chǎng)景,記得添加在build setting里面。在這個(gè)場(chǎng)景中,搭一個(gè)簡(jiǎn)單的地面,同時(shí)新建一個(gè)膠囊體,作為玩家的預(yù)制體Player。添加以下組件,將他拖到以下的文件夾中,刪除場(chǎng)景中的Player:
11.新建一個(gè)腳本,命名為GameManager,主要是用來(lái)生成玩家,記得在場(chǎng)景中添加,代碼如下:
12.新建mPlayer腳本,用來(lái)控制玩家移動(dòng)
using Photon.Pun; using System.Collections; using System.Collections.Generic; using UnityEngine;public class mPlayer : MonoBehaviourPunCallbacks {void Update(){if (photonView.IsMine){MoveController();}}public void MoveController(){float h = Input.GetAxis("Horizontal");float v = Input.GetAxis("Vertical");transform.Translate(new Vector3(h, 0, v) * 10 * Time.deltaTime);} }13.這樣,一個(gè)基礎(chǔ)的聯(lián)機(jī)機(jī)制的小demo就完成了。其實(shí)整體來(lái)說(shuō),photon這套聯(lián)機(jī)機(jī)制,入門很簡(jiǎn)單,但是后期拓展和優(yōu)化需要花點(diǎn)時(shí)間。
最后是項(xiàng)目源碼:源碼地址
總結(jié)
以上是生活随笔為你收集整理的使用Photon PUN创建简单对战游戏的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MySQL year函数
- 下一篇: 标准Modbus通讯协议格式