综述
本次主要针对具体代码实现多人化游戏。
介绍
同步
对于如何实现同步,这就涉及pun的同步,主要需要3步。
首先需要将道具添加组件。我们以角色为例子。
首先我们需要给人物添加Photon组件,第一个就是PhotonView组件,其次就是transform组件,对于use local要取消勾选。
然后如果这个角色有动画,需要添加下面的那个组件,同时,需要注意,对于trigger的条件控制需要放到最后一位,同时,所有的条件都需要修改为如上的属性。
然后再将角色放到photon的resource的目录下,pun会自动读取,方便生成和销毁。
可以在这个资源路径下分设其他的包,方便管理。
基本使用
以下两个方法,主要用于直接连接pun开始游戏,没有大厅匹配
public override void OnConnectedToMaster()
{
base.OnConnectedToMaster();
Debug.Log("Lianjie");
//创建房间-----------------后期需要改
PhotonNetwork.JoinOrCreateRoom("Room", new Photon.Realtime.RoomOptions()
{
MaxPlayers = 4
}, default);
}
public override void OnJoinedRoom()
{
base.OnJoinedRoom();
OnCountdownTimerIsExpired();
}
其他的一些方法
//加入名为"Room"的房间
PhotonNetwork.JoinRoom("Room");
//如果没有开放的游戏就会失败。错误回调: OnPhotonJoinRoomFailed,可以进行逻辑的编写。
//尝试加入任何随机游戏:
PhotonNetwork.JoinRandomRoom();
//如果没有开放的游戏就会失败。错误回调: OnPhotonRandomJoinFailed
//创建名为"room1"的房间。
PhotonNetwork.CreateRoom("room1");
//如果名为"room1"的房间已存在就会失败并调用:OnPhotonCreateRoomFailed,可以在这个回调进行重写
大厅匹配
pun中有许多回调函数,通过这些函数来实现一些特殊的情况的匹配。
下面主要针对游戏说明。
扫描二维码关注公众号,回复:
15117373 查看本文章
public override void OnDisable()
{
base.OnDisable();
CountdownTimer.OnCountdownTimerHasExpired -= OnCountdownTimerIsExpired;
}
public override void OnLeftRoom()
{
PhotonNetwork.Disconnect();
}
public override void OnMasterClientSwitched(Player newMasterClient)//*****************************************
{
if (PhotonNetwork.LocalPlayer.ActorNumber == newMasterClient.ActorNumber)
{
//StartCoroutine(SpawnPlatforms());
}
}
public override void OnPlayerLeftRoom(Player otherPlayer)
{
CheckEndOfGame();
}
实现一些玩家离开房间的回调判断。
判断玩家都加载了场景
private bool CheckAllPlayerLoadedLevel()//检查是否都加载了场景
{
foreach (Photon.Realtime.Player p in PhotonNetwork.PlayerList)
{
object playerLoadedLevel;
if (p.CustomProperties.TryGetValue(Const.PLAYER_LOADED_LEVEL, out playerLoadedLevel))
{
if ((bool)playerLoadedLevel)
{
continue;
}
}
return false;
}
return true;
}
判断加载游戏
public override void OnPlayerPropertiesUpdate(Player targetPlayer, Hashtable changedProps)//判断游戏结束(通过生命数)||全员加载进来(然后开始倒计时)
{
if (changedProps.ContainsKey(Const.PLAYER_LIVES))
{
CheckEndOfGame();
return;
}
if (!PhotonNetwork.IsMasterClient) //不是主机不用管
{
return;
}
if (!isGameStart && changedProps.ContainsKey(Const.PLAYER_LOADED_LEVEL))//有人加载进来了
{
if (CheckAllPlayerLoadedLevel())//判断是不是都加载进来了
{
CountdownTimer.SetStartTime();
}
else
{
InfoText.text = "等待其他玩家...";
}
}
}
加载下一个游戏,并进行初始化操作
Hashtable props = new Hashtable//下一关生命,设置下一关的属性
{
{
Const.PLAYER_LIVES, 1},
{
Const.WIN_COUNT, 0},
{
Const.PLAYER_LOADED_LEVEL, false}
};
PhotonNetwork.LocalPlayer.SetCustomProperties(props);
if (PhotonNetwork.LocalPlayer.GetPlayerNumber() == winner.GetPlayerNumber())
{
Hashtable hashtable = new Hashtable
{
{
Const.WIN_COUNT, 1}
};
PhotonNetwork.LocalPlayer.SetCustomProperties(hashtable);
}
总结
通过本次学习,主要是介绍pun的一些回调函数,以及游戏的一些初始化操作。