Photon与Unity核心技术之角色更换武器

    在单机游戏开发中,角色的武器是经常可以更换的,角色更换武器的基本原理是将武器挂接到角色的骨骼动画的虚拟点上,这样角色做动作时,武器也会随着骨骼进行运动,完成了角色挂接武器,这个挂接武器流程是固定的。而在网络游戏中,做挂接武器时就要注意了,下面就以Photon服务器为例给读者介绍如何实现在网络游戏中给角色挂接武器,当然其他网络游戏的挂接方式类似。

    在网络游戏中更换角色武器需要注意以下几点:

    一、玩家自身更换武器,其他玩家NPC更换武器,实现方式是不一样的。

    二、玩家更换的武器或者其他玩家NPC更换的武器,彼此都是可见的。

下面开始具体实现:

        首先我们程序在写逻辑时,玩家自身的武器一般是存放到背包里面,需要玩家打开背包从里面把武器取出来挂接到角色的骨骼动画的虚拟挂节点上,这个是固定的流程。网络游戏就要涉及到玩家相互之间是可见的,这就要求挂接的武器彼此都能看到。需要对武器挂接脚本。先分析一下,武器挂接到角色的骨骼上后,角色要播放动作,动作上下左右会有一个位移也就是位置的变换,当然不同的招式也会涉及到武器的方向的变换,更有甚者会有武器的大小变换。这些变换对其玩家都是可见的,这就需要我们对武器的实例化模型做一些处理,如下图所示:


    这个是武器的实例化模型上面的脚本,一个是Photon View该组件就是实现彼此可见的,另一个是PhotonTransformView脚本,这个是同步武器的位置,方向和大小的。有一点很重要就是将PhotonTransformView组件拖到Observed Components里面作为一个观察对象,时刻监听武器的一举一动,这样就完成了武器同步的设置。

    下面再生成其他玩家武器的同步,我们自己的玩家是通过背包挂接,要想在你的场景中生成其他玩家以及武器的挂接就需要通过服务器接收消息完成了。在Photon中接收服务器的消息是通过NetworkingPeer脚本中的函数public void OnEvent(EventData photonEvent)实现的,在这个函数中有一条语句:

            case PunEvent.Instantiation:
                this.DoInstantiate((Hashtable)photonEvent[ParameterCode.Data], originatingPlayer, null);
                break;

就是服务器广播消息使用的,我们可以通过这个函数拿到角色信息,将其实例化出来,大家还要清楚一点,武器是与角色息息相关的,换句话说,我们可以将武器作为角色的一个属性处理。实现代码如下所示:

            object[] objs = new object[] { "vAssaultRifle"};
 
            GameObject playerobj =  PhotonNetwork.Instantiate("ShooterMeleeTopDown", new Vector3(Random.Range(1f, 8f), 0.0f, -35f), Quaternion.identity, 0, objs);

调用的函数接口是带有object[]参数的实例化函数,这样就可以把角色的武器名字传进去了,传进去后,我们还应该能拿到,目的是将其实例化出来,让其他玩家可以看到,再看一下拿到该武器信息的代码,如下所示:

 PhotonView photonView = PhotonView.Get(this);
        if (!photonView.isMine)
        {
            object[] objs = photonView.instantiationData;

            Invector.ItemManager.EquipPoint equipoint = transform.GetComponent<Invector.ItemManager.vItemManager>().equipPoints.Find(p => p.equipPointName == "RightArm");
            GameObject obj = Resources.Load(objs[0].ToString()) as GameObject;
            var equipedObject = Instantiate(obj, equipoint.handler.defaultHandler.position, equipoint.handler.defaultHandler.rotation);
            if(equipoint.handler.defaultHandler.childCount == 0)
            {
                equipedObject.transform.parent = equipoint.handler.defaultHandler;
                equipoint.equipmentReference.equipedObject = transform.gameObject;
                equipoint.onInstantiateEquiment.Invoke(equipedObject);
             
            }
            else
            {
                Destroy(equipoint.handler.defaultHandler.GetChild(0));
            }
            
        }
第一行代码是获取PhotonView组件,这个主要是用于同步使用的,然后判断一下,武器是不是用户玩家自身的,因为自身玩家不需要走这个流程,所以要排除掉,我们同步的是其他玩家NPC。通过
photonView.instantiationData
拿到武器信息,当然这里可以不知武器信息,其他血条什么的都可以放在里面处理。
equipoint = transform.GetComponent<Invector.ItemManager.vItemManager>().equipPoints.Find(p => p.equipPointName == "RightArm");

是武器挂节点,实例化出来的武器要挂接到骨骼动画上,设置一下武器的父节点,这样就完成了武器的挂接,实现效果如下所示:


这样我们就完成了角色武器的更换,各个角色利用Photon实现了武器的同步处理,教程完成,下一篇介绍角色动作同步处理。







     

猜你喜欢

转载自blog.csdn.net/jxw167/article/details/79531463
今日推荐