项目实训----Unity多人游戏开发----第十篇

综述

本次主要针对具体代码实现多人化游戏。

介绍

同步

对于如何实现同步,这就涉及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的一些回调函数,以及游戏的一些初始化操作。

猜你喜欢

转载自blog.csdn.net/qq_53259920/article/details/125242446
今日推荐