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

道具游戏制作

综述

本次主要介绍小组最后一个游戏,本人主要参与部分道具的开发。
下面介绍这些道具信息以及代码实现。

内容

道具

在该游戏中,道具是随机生成的,有地雷、导弹、随机(里面有疾跑和隐身)和血瓶。他们的控制都是由一个脚本来决定的。

//生成道具
            if(PhotonNetwork.IsMasterClient && PropsGameManager.instance.isGameStart)
            {
    
    
                //计时
                if(currentTime > 0)
                {
    
    
                    currentTime -= Time.deltaTime;
                }
                else
                {
    
    
                    //判断道具数是否到达上限
                    if (currentCountInScene < maxSpawnCountPermit)
                    {
    
    
                        for (int i = 0; i < spawnCountOneTime; i++)
                        {
    
    

                            Vector3 pos = new Vector3(Random.Range(-18f, 18f), 1, Random.Range(-18f, 18f));
                            PhotonNetwork.Instantiate(Const.PUN_PROPS_GAME_PREFABS_BASEPATH 
                                + propsPrefabNameWithRandom[Random.Range(0, propsPrefabNameWithRandom.Length)]
                                , pos
                                , Quaternion.identity);
                            currentCountInScene++;
                        }
                    }
                    currentTime = spawnInterval;
                }
            }

通过一个属性来判断是哪一种类型的道具

public enum PropsType
        {
    
    
            None,
            MissileProp,  //炮弹
            LandmineProp, //地雷
            CloakProp,
            HealthBottleProp, //血瓶
            SpeedUpProp,//疾步
            FlashSkill
        }

对于每个随机生辰的道具,上面都有一个脚本,来控制道具的动画以及类型。

public PropsManager.PropsType propType = PropsManager.PropsType.HealthBottleProp;

另一个就是悬浮控制

  //悬浮
        private void Move()
        {
    
    
            startPos = transform.position;
            transform.DOPath(new Vector3[] {
    
     startPos, transform.position + new Vector3(0, 0.5f, 0), startPos }, 2)//Vector3.up//new Vector3(0,0.5f,0)
                .SetLoops(-1, LoopType.Restart);
            transform.DOBlendableLocalRotateBy(new Vector3(0, 360, 0), 4f, RotateMode.FastBeyond360);
                .SetLoops(-1, LoopType.Restart);//循环设置为-1为一直
        }

对于每一个道具都需要拾取,这个逻辑在人物的道具控制器中来完成。

 public void OnTriggerEnter(Collider other)//TODO:同步背包
        {
    
    
            //IsPickingPropUp
            if (!other.gameObject.tag.Equals("DroppedProps"))
            {
    
    
                return;
            }
            if(other.gameObject.GetComponent<DroppedProps>() != null)
            {
    
    
                if (other.gameObject.GetComponent<DroppedProps>().propType == PropsManager.PropsType.HealthBottleProp)//血瓶不参与背包计算,且血瓶一个单独脚本执行逻辑
                {
    
    
                    return;
                }
            }

            //是否销毁(是否捡的起来)由玩家拥有者的背包判决。
            int index = 0;
            //***:主要用以通知主机,因为只有主机控制着销毁悬浮道具,可换为PhotonNetwork.IsMasterClient
            if (!photonView.IsMine)
            {
    
    
                if (PhotonNetwork.IsMasterClient)
                {
    
    
                    PhotonNetwork.Destroy(other.gameObject);
                    PropsManager.DecreaseCurrentCount();//场上数量-1
                }
                else
                {
    
    
                    other.gameObject.SetActive(false);
                }
            }
            else//自己
            {
    
    
                index = FindVacantIndex();
                DroppedProps dp = other.gameObject.GetComponent<DroppedProps>();
                DroppedRandomProps drp = other.gameObject.GetComponent<DroppedRandomProps>();
                if (dp != null)
                {
    
    
                    itemBag[index] = dp.propType; //添加背包里捡的道具的类型
                    //UI
                    bagItemsPanel.GetChild(index).GetComponent<Image>().sprite
                        = GetSpriteByPropType(dp.propType);
                }
                else if(drp != null)
                {
    
    
                    itemBag[index] = drp.propType; //添加背包里捡的道具的类型
                    //UI
                    bagItemsPanel.GetChild(index).GetComponent<Image>().sprite
                        = GetSpriteByPropType(drp.propType);
                }
                other.gameObject.SetActive(false);
            }
            
            AudioManager.instance.PropsGamePickUp();
        }

对于每个拾取都是由音效来提示的。

其次,使用道具

首先是地雷,地雷拾取后,如果要是用,需要3秒的时间进行放置,期间不能被打断,然后就是放置后,会有一些粒子效果进行提示,该地区有地雷。

扫描二维码关注公众号,回复: 15117370 查看本文章
 private void UseProp(PropsManager.PropsType type)//TODO:E技能计时UI
        {
    
    
            switch (type)
            {
    
    
                case PropsManager.PropsType.None:
                    AudioManager.instance.NoProps();
                    break;
                case PropsManager.PropsType.LandmineProp:
                    //先判断当前执行的动画是不是站立idel
                    if (animator.GetCurrentAnimatorStateInfo(0).IsName("IdleNormal02_AR_Anim"))
                    {
    
    
                        Debug.Log("执行放置地雷的操作1");
                        DoAnimationWithEffect(2);
                        //创建地雷的方法
                        StartCoroutine(CreateLandMine(this.gameObject.transform.position));
                    }
                    else//不在空闲状态无法放置
                    {
    
    
                        tipText.text = "放置被打断";
                        Invoke("EmptyTipText", 1.5f);
                    }
                    break;

                default:
                    break;
            }
        }

使用rpc进行生成地雷

        //生成地雷
        private IEnumerator CreateLandMine(Vector3 v) 
        {
    
    
            AudioManager.instance.SetLandmine(v);
            yield return new WaitForSeconds(3); //等待3秒
            v.y = 0.001f;
            photonView.RPC("LandMineCreate", RpcTarget.AllViaServer, v);
       
        }

        [PunRPC]
        public void LandMineCreate(Vector3 pos) //使用rpc进行生成地雷,同步其他所有的人,都会生成地雷。
        {
    
    
            GameObject landmine = Instantiate(landminePrefab, pos, Quaternion.identity);
        }

总结

本次主要介绍的是地雷的生成和放置,后续介绍地雷的销毁和其他道具。

猜你喜欢

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