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

综述

上次我们主要讲述了道具的生成和拾取以及放置的功能以及代码的实现,本次主要介绍玩家触碰地雷以及其他道具的生成和销毁。

内容

触碰地雷

玩家触碰地雷,会造成范围伤害,同时,玩家会倒地,3秒不能控制角色。

 public void OnTriggerEnter(Collider collision)
        {
    
    
            if (!collision.gameObject.tag.Equals("Player"))
            {
    
    
                return;
            }
            float radius = 3.0f;
            Vector3 explosionPos = transform.position;
            Collider[] colliders = Physics.OverlapSphere(explosionPos, radius);

            foreach (Collider hit in colliders)
            {
    
    
                if (hit.gameObject.tag.Equals("Player"))//打到玩家
                {
    
    
                    
                    PropsPlayerController ppc = hit.gameObject.GetComponent<PropsPlayerController>();
                    PropsPlayerHealth pph = hit.gameObject.GetComponent<PropsPlayerHealth>();
                    PropsPlayerPropController pppc = hit.gameObject.GetComponent<PropsPlayerPropController>();
                    //玩家击飞
                    if (hit.attachedRigidbody)
                    {
    
    
                        hit.attachedRigidbody.AddExplosionForce(500, explosionPos, radius);
                    }
                    //掉血\动画\失控
                    if (ppc != null)
                    {
    
    
                        Debug.Log("调用switch方法");
                        pph.GetDamage(1, 2);
                        pppc.DoAnimationWithEffect(1);//动画与失控
                    }
                }
                
            }
            //音效
            AudioManager.instance.MissileBomb(transform.position);
            //TODO:爆炸特效
            GameObject go = Instantiate(explosionParticle, transform.position, Quaternion.identity);
            Destroy(go, 1);
            Destroy(gameObject);
            
        }

首先对于玩家收到伤害,这个方法有个参数,判断是哪种伤害,主要分为两种,一种是导弹,另一种是地雷,其次判断血量,受伤后是否能存活,如果不能存活,就执行死亡效果。

 public void GetDamage(int damageValue, int damageSource)
        {
    
    
            if (!photonView.IsMine)
            {
    
    
                return;
            }
            if (currentHealth <= 0)
            {
    
    
                return;
            }
            currentHealth--;
            photonView.RPC("DecreaseHealth", RpcTarget.All, currentHealth);
            if (currentHealth <= 0)//死亡
            {
    
    
                ppc.canControll = false;

                //RPC
                photonView.RPC("PlayerDie", RpcTarget.All, PhotonNetwork.LocalPlayer.NickName, damageSource);

                //摄像头位置
                Camera.main.gameObject.GetComponent<AutoFollow>().enabled = true;

                //玩家死亡
                PhotonNetwork.LocalPlayer.SetCustomProperties(new ExitGames.Client.Photon.Hashtable() {
    
     {
    
     Const.PLAYER_LIVES, 0 } });
                //仅取消渲染而不销毁,留着脚本执行rpc等
                ppc.SetInvisible();
            }
        }

另外需要进行动画的同步,同步动画以及失控3秒,然后起身,继续移动。

 public void DoAnimationWithEffect(int animationType)
        {
    
    
            if (!photonView.IsMine)
                return;
            switch (animationType)
            {
    
    
                case 2://地雷,失控2秒,后续可以实现取消放置
                    if (!ppc.canControll)
                    {
    
    
                        return;
                    }
                    ppc.canControll = false;
                    animator.SetBool("setLandMine", true);
                    Invoke("RestoreControl", 3);//两秒后恢复移动,放置地雷就两秒钟
                    Invoke("setLandMineFalse", 0.1f);
                    break;
            }
        }

血瓶道具

该道具主要功能就是加血,玩家触碰后,在道具脚本中进行执行逻辑,主要负责加血量和音效处理。同时实现同步的效果。

private void OnTriggerEnter(Collider collision)
        {
    
    
            if (collision.gameObject.tag.Equals("DroppedProps") || collision.gameObject.tag.Equals("Grass"))
            {
    
    
                return;
            }
            if (collision.gameObject.tag.Equals("Player"))//-------未处理音效
            {
    
    
                if (isPeng)
                {
    
    
                    return;
                }
                isPeng = true;

                PropsPlayerController ppc = collision.gameObject.GetComponent<PropsPlayerController>();
                PropsPlayerHealth pph = collision.gameObject.GetComponent<PropsPlayerHealth>();
                PropsPlayerPropController pppc = collision.gameObject.GetComponent<PropsPlayerPropController>();

                if (ppc != null)
                {
    
    
                    pph.healthAdd();
                }
                //只有自己听到音效
                if (collision.gameObject.GetComponent<PhotonView>().Owner.NickName.Equals(PhotonNetwork.LocalPlayer.NickName))
                {
    
    
                    AudioManager.instance.PropsGameAddHealth(transform.position);
                }
                if (PhotonNetwork.IsMasterClient)
                {
    
    
                    PhotonNetwork.Destroy(this.gameObject);
                    PropsManager.DecreaseCurrentCount();
                }
                else
                {
    
    
                    gameObject.SetActive(false);
                }
            }
        }

随机箱子

随机道具主要有两种,一种是疾跑,另一种是隐身,我主要负责疾跑,该效果主要是移动速度增加。
该箱子有一个脚本负责控制类型。

 public PropsManager.PropsType propType = PropsManager.PropsType.None;
        private Vector3 startPos;

        void Start()
        {
    
    
            if (Random.Range(0, 4) == 0)//1/4概率隐身
            {
    
    
                propType = PropsManager.PropsType.CloakProp;
            }
            else
            {
    
    
                propType = PropsManager.PropsType.SpeedUpProp;
            }

            if (PhotonNetwork.IsMasterClient)
            {
    
    
                TestCollision();
            }
            Move();
        }

另外,需要进行控制判断。

使用道具,移速增加。

 case PropsManager.PropsType.SpeedUpProp:
                    tipText.text = "速度提升";
                    Invoke("EmptyTipText", 1);
                    UpandDownSpeed(OldSpeed * 1.5f);
                    AudioManager.instance.PropGameSpeedUp(transform.position);
                    isSpeedUp = true;
                    break;
 private void UpandDownSpeed(float s) //控制移动速度
        {
    
    
            transform.gameObject.GetComponent<PropsPlayerController>().moveSpeed = s;
        }

然后记录秒数,在3秒加速过后,速度恢复。


            if (isSpeedUp) //判断是否加速中
            {
    
    
                if(currentSpeedUpTime < staySpeedUpTime)
                {
    
    
                    currentSpeedUpTime += Time.deltaTime;
                }
                else  //加速时间到了
                {
    
    
                    isSpeedUp = false;
                    currentSpeedUpTime = 0;
                    UpandDownSpeed(OldSpeed);
                }
            }

总结

本次主要介绍剩余的道具,包括血瓶和疾跑以及对于地雷的受伤效果。主要的实现是通过pun的rpc技术实现的同步和销毁,通过分模块进行管理,实现有序管理。

猜你喜欢

转载自blog.csdn.net/qq_53259920/article/details/125242984