日志2025.1.31

日志2025.1.31
1.做了拾取武器,丢弃武器交互
public class Pickup_Weapon : Interactable
{
    [SerializeField] private Weapon_Data weaponData;
    [SerializeField] private Weapon weapon;
    
    private BackUpWeaponModel[] backUpWeaponModels;

    private bool isDroppedWeapon;

    protected override void Awake()
    {
        base.Awake();
        backUpWeaponModels = GetComponentsInChildren<BackUpWeaponModel>();
    }

    protected override void Start()
    {
        base.Start();
        ChangeGameObject();

        //在丢弃武器时,是先执行SetupPickupWeapon再执行Start,此时该武器的子弹会恢复为初始值,因此要判断其是否为丢弃的武器
        if (!isDroppedWeapon)
            weapon = new Weapon(weaponData);
    }


    //在丢弃武器之后,在地上创建该武器的Pickup_Weapon
    public void SetupPickupWeapon(Weapon weaponToSet, Transform transform)
    {
        isDroppedWeapon = true;

        weapon = weaponToSet;
        weaponData = weaponToSet.weaponData;

        this.transform.position = transform.position;
    }


    [ContextMenu("Change GameObject")] //能够在unity中直接调用该函数
    //改变拾取的武器对象
    public void ChangeGameObject()
    {
        gameObject.name = "Pickup_Weapon " + weapon.weaponType.ToString();
        SwitchWeaponModel();
    }


    //选择对应的模型
    private void SwitchWeaponModel()
    {
        foreach (BackUpWeaponModel model in backUpWeaponModels)
        {
            model.gameObject.SetActive(false);

            if (model.weaponType == weaponData.weaponType) 
            { 
                model.gameObject.SetActive(true);
                ChangeMeshRenderer(model.GetComponent<MeshRenderer>());
            }
        }
    }

    public override void Interaction()
    {
        base.Interaction();

        weaponController.PickUpWeapon(weapon);
        
        ObjectPool.instance.ReturnObject(gameObject);
    }

    protected override void OnTriggerExit(Collider other)
    {
        base.OnTriggerExit(other);

    }

}


    public void PickUpWeapon(Weapon newWeapon)
    {
        Weapon weaponInSlots = WeaponInslots(newWeapon.weaponType);

        //已经包含该武器,则增加该武器的子弹
        if(weaponInSlots != null)
        {
            weaponInSlots.totalReserveAmmo += newWeapon.bulletsInMagzine;
            return;
        }

        if(weaponSlots.Count >= maxSlots)
        {
            return;
        }

        weaponSlots.Add(newWeapon);
        player.weaponVisuals.SwitchOnBackupWeaponModel();
    }

    //丢弃武器
    private void DropWeapon()
    {
        //只有武器大于等于2的时候,才能丢武器
        if(weaponSlots.Count < 2)
        {
            return;
        }

        GameObject droppedWeapon = ObjectPool.instance.GetObject(weaponPickupPrefab);
        droppedWeapon.GetComponent<Pickup_Weapon>()?.SetupPickupWeapon(currentWeapon, transform);

        weaponSlots.Remove(currentWeapon);

        EquipWeapon(0);
    }


2.增加了子弹箱
public enum AmmoBoxType { SmallBox, BigBox}

public class Pickup_Ammo : Interactable
{
    [System.Serializable]
    public struct AmmoData
    {
        public WeaponType weaponType;
        public int minAmout;
        public int maxAmout;
    }


    [SerializeField]private AmmoBoxType boxType;
    [SerializeField] private List<AmmoData> smallBoxAmmo;
    [SerializeField] private List<AmmoData> bigBoxAmmo;
    [SerializeField] private GameObject[] boxModel;


    protected override void Start()
    {
        base.Start();

        SetupBoxModel();
    }


    //显示对应的箱子模型
    private void SetupBoxModel()
    {
        for (int i = 0; i < boxModel.Length; i++)
        {
            boxModel[i].SetActive(false);

            if (i == (int)boxType)
            {
                boxModel[i].SetActive(true);
            }

        }
    }

    public override void Interaction()
    {
        base.Interaction();

        List<AmmoData> currentAmmoList = smallBoxAmmo;
        if(boxType == AmmoBoxType.BigBox)
        {
            currentAmmoList = bigBoxAmmo;
        }

        foreach (AmmoData currentAmmo in currentAmmoList)
        {
            Weapon weapon = weaponController?.WeaponInslots(currentAmmo.weaponType);

            AddAmmoToWeapon(weapon, ReturnAmmoAmount(currentAmmo));
        }

        ObjectPool.instance.ReturnObject(gameObject);

    }

    //添加子弹到武器上
    private void AddAmmoToWeapon(Weapon weapon, int amout)
    {
        if (weapon != null)
        {
            weapon.totalReserveAmmo += amout;
        }
    }

    private int ReturnAmmoAmount(AmmoData ammo)
    {
        return Random.Range(ammo.minAmout, ammo.maxAmout);
    }


3.进行上面两个操作时,记得在ObjectPool里初始化,并在其对象上挂载PooledObject

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值