日志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