1、点“开始连接”,进入房间
2、将你的用户名发送到PUN,实现同步
类似游戏中能看到其他用户名字
3、点击开始连接,开始连接隐藏,出现正在连接中的字样。
a、界面
完成目标中UI的设置与逻辑。代码自行编写。
b、脚本绑定
实现点击“开始连接”,进入房间。
告诉PUN你的名字,用于后面进行显示。
using UnityEngine;
using UnityEngine.UI;
using Photon.Pun;
public class PlayerNameInputField : MonoBehaviour
{
#region Parameters
public InputField inputField;
const string playerNamePrefKey = "PlayerName";
string defaultName = string.Empty;
#endregion
#region Mono CallBacks
void Start()
{
if (inputField != null)
{
if (PlayerPrefs.HasKey(playerNamePrefKey))
{
defaultName = PlayerPrefs.GetString(playerNamePrefKey);
inputField.text = defaultName;
}
}
PhotonNetwork.NickName = defaultName;
}
#endregion
#region Public Methods
//设置玩家的名字,并将其保存在PlayerPrefs中以备将来使用。
//在OnEndEdit绑定动态
public void SetPlayerName(string value)
{
if (string.IsNullOrEmpty(value))
{
Debug.LogError("输入框应输入玩家名字");
return;
}
PhotonNetwork.NickName = value;
PlayerPrefs.SetString(playerNamePrefKey, value);
}
#endregion
}
注意:在连接服务器失败OnDisconnected() 时,显示开始连接和输入名字:
Launcher最终代码:
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
public class Launcher : MonoBehaviourPunCallbacks
{
#region Parameters
[Tooltip("连接服务器失败后要显示的物体")]
public GameObject[] failedShow;
//此客户端的版本号。用户之间通过gameVersion(允许你做出破坏性的改变)进行隔离。
string gameVersion = "1";
[SerializeField]
[Tooltip("最大连接人数")]
byte maxPlayersPerRoom = 4;
bool isPressPlay = false;
#endregion
#region Mono CallBacks
void Awake()
{
// 这确保我们可以在主客户端和同一房间的所有客户端上使用photonnet . loadlevel()自动同步它们的级别
PhotonNetwork.AutomaticallySyncScene = true;
}
void Start()
{
ConnectServer();
}
#endregion
#region Public Method
//绑定到开始连接上:连接到服务器房间
public void Skode_JoinRoom()
{
isPressPlay = true;
//若还未连接服务器,则先连接服务器,再加入房间
if (!PhotonNetwork.IsConnected)
ConnectServer();
else
LoadRoom();
}
#endregion
#region Private Methods
//连接到服务器
void ConnectServer()
{
// 检查是否连接了服务器
if (!PhotonNetwork.IsConnected)
{
//首先连接到光子在线服务器。
PhotonNetwork.GameVersion = gameVersion;
PhotonNetwork.ConnectUsingSettings();
}
}
void LoadRoom()
{
PhotonNetwork.JoinRandomRoom();
}
void LoadScene()
{
PhotonNetwork.LoadLevel("Room for " + PhotonNetwork.CurrentRoom.PlayerCount);
}
#endregion
#region Pun Callbacks
// 连接服务器成功回调
public override void OnConnectedToMaster()
{
if (isPressPlay)
LoadRoom();
}
//连接服务器失败回调
public override void OnDisconnected(DisconnectCause cause)
{
Debug.LogWarningFormat("OnDisconnected() was called by PUN with reason {0}", cause);
for (int i = 0; i < failedShow.Length; i++)
{
failedShow[i].SetActive(true);
}
}
// 加入房间成功回调
public override void OnJoinedRoom()
{
//主客户端加载场景即可。其他客户端进入房间后,会自动加载主客户端的场景
if (PhotonNetwork.IsMasterClient)
LoadScene();
}
//加入房间失败回调
public override void OnJoinRandomFailed(short returnCode, string message)
{
Debug.Log("we failed to join a random room, maybe none exists or they are all full. No worries, we create a new room.");
//创建房间后,会自动加入房间。从而触发加入房间成功的回调。
PhotonNetwork.CreateRoom(null, new RoomOptions { MaxPlayers = maxPlayersPerRoom });
}
#endregion
}
那么,我们来想一下:
完成服务器房间属性、自定义属性的设置、更改。
大家还有什么问题,欢迎在下方留言!