Unity射击游戏手榴弹笔记

发布于:2025-03-27 ⋅ 阅读:(24) ⋅ 点赞:(0)

数据

  1. 在物品系统增加一个新的物品类,手榴弹类,定义手榴弹依附物体的类、配表数据类、背包内物品数据类、新建配表、在背包增加手榴弹数组;
  2. 手榴弹的预制体需要可拾取的、扔出的;
  3. 背包界面增加背包内的手榴弹、场景里的手榴弹、别人背包的手榴弹格子;
  4. 人物有一个int grenadeIndex记录当前拿着的手榴弹在背包手榴弹列表的索引,没拿手榴弹时是-1;

逻辑

  1. 在交互系统的拾取物品分支增加对手榴弹类的判断;
  2. GetNextGrenade():在背包的手榴弹列表遍历,有和grenadeIndex类型不同的手榴弹则返回索引,没有则返回-1;
    public int GetNextGrenade(){
            if(grenadeInHandIndex==-1){//手里没有手榴弹
                if(backpack.itemsInPack.grenadesInPack.Count>0){//背包里有,拿第一个
                    return 0;
                }
                else{
                    return -1;//背包里没有,不拿
                }
            }
            for(int i=0;i<backpack.itemsInPack.grenadesInPack.Count;i++){//手里有手榴弹,切换下一种
                if(backpack.itemsInPack.grenadesInPack[i].id!=
                backpack.itemsInPack.grenadesInPack[grenadeInHandIndex].id){
                    return i;
                }
            }
            return -1;
        }
  3. UseGrenade(),先执行grenadeIndex=GetNextGrenade(),在右手实例化手榴弹,没有则回到空手;
public void UseGrenade(){
        grenadeInHandIndex=GetNextGrenade();//去背包拿手榴弹
        if(grenadeInHandIndex==-1){//没拿到
            PutAwayGun();
            return;
        }
        animator.SetInteger(gunStatusPara,3);
        GrenadeDataBin grenadeDataBin=ItemDataManager.Instance.GetGrenadeData(
            backpack.itemsInPack.grenadesInPack[grenadeInHandIndex].id);
        grenadeInHand=Instantiate(grenadeDataBin.prefab,weaponHolder).GetComponent<Grenade>();
        grenadeInHand.grenadeDataBin = grenadeDataBin;
        grenadeInHand.owner=this;
    }
  1. 扔手榴弹方法通过动画事件执行
public void ThrowGrenade(){
        grenadeInHand.Throwed(aimAxis.forward*throwSpeed);
        backpack.TakeOutGrenade(grenadeInHandIndex);
        grenadeInHand=null;
        grenadeInHandIndex=-1;
        UseGrenade();//拿下一个或空手
    }
public class Grenade : ItemBase{
    public GrenadeDataBin grenadeDataBin;
    Collider _collider;
    Rigidbody _rigidbody;
    public CharacterBase owner;
    int explodeDelay=3;
    int lifeTime=10;
        void Start(){
            grenadeDataBin=ItemDataManager.Instance.GetGrenadeData(id);
            _collider=GetComponent<Collider>();
            _rigidbody=GetComponent<Rigidbody>();
        }
        public void Throwed(Vector3 velocity){
            transform.SetParent(null);
            _rigidbody.isKinematic=false;
            _collider.isTrigger=false;
            _rigidbody.velocity=velocity;
            StartCoroutine(Explode());
            Destroy(gameObject,lifeTime);
        }
        IEnumerator Explode(){
            yield return new WaitForSeconds(explodeDelay);
            ParticleSystem effect=Instantiate(grenadeDataBin.explosionEffect,
            transform.position,Quaternion.LookRotation(Vector3.up));
            Destroy(effect.gameObject,effect.main.duration+effect.main.startLifetime.constant);
        }
    }

    动画

    1. 手榴弹动画放在上半身层,有一个空闲动画和投掷动画;