日志2025.1.29
1.修改了子弹拖尾的bug
子弹销毁不要用对象池跟携程混合写!!
private void Update()
{
if(Time.time - createdTime > flyTime)
{
DestroyBullet();
}
}
private void DestroyBullet()
{
gameObject.GetComponent
ObjectPool.instance.ReturnObject(gameObject);
}
2.重新修改了对象池的写法,使其不仅可以用于子弹
public class ObjectPool : MonoBehaviour
{
public static ObjectPool instance;
[SerializeField] private int poolSize = 10;
private Dictionary
private void Awake()
{
//只能存在一个instance
if(instance == null)
{
instance = this;
}
else
{
Destroy(gameObject);
}
}
//从队列中获取子弹
public GameObject GetObject(GameObject prefab)
{
//如果没有这个对象的对象池,则初始化一个对象池
if (!poolDictionary.ContainsKey(prefab))
{
InitializeNewPool(prefab);
}
//如果当前子弹池没有对象了,那么再创建新的对象进入子弹池
if(poolDictionary[prefab].Count == 0)
{
CreateNewObject(prefab);
}
GameObject objectToGet = poolDictionary[prefab].Dequeue();
objectToGet.transform.parent = null;
objectToGet.SetActive(true);
return objectToGet;
}
//将对象返回队列中
public void ReturnObject(GameObject objectToReturn)
{
GameObject prefab = objectToReturn.GetComponent
objectToReturn.SetActive(false);
objectToReturn.transform.parent = transform;
poolDictionary[prefab].Enqueue(objectToReturn);
}
private IEnumerator WaitToReturn(GameObject objectToReturn, float delay)
{
yield return new WaitForSeconds(delay);
ReturnObject(objectToReturn);
}
public void ReturnObject(GameObject objectToReturn, float delay)
{
StartCoroutine(WaitToReturn(objectToReturn, delay));
}
//创建最初的对象池
private void InitializeNewPool(GameObject prefab)
{
poolDictionary[prefab] = new Queue
for (int i = 0; i < poolSize; i++)
{
CreateNewObject(prefab);
}
}
//创建子弹进入子弹池
private void CreateNewObject(GameObject prefab)
{
GameObject newObject = Instantiate(prefab, transform);
//用PooledObject中的originalPrefab记录字典的key值
newObject.AddComponent
newObject.SetActive(false);
poolDictionary[prefab].Enqueue(newObject);
}
}
3.将特效也改为对象池写法
//创建子弹击中特效
private void CreateImpactFX(Collision collision)
{
if (collision.contacts.Length > 0)
{
ContactPoint contact = collision.contacts[0];
GameObject newImpactFX = ObjectPool.instance.GetObject(bulletImpactFX);
newImpactFX.transform.position = contact.point;
ObjectPool.instance.ReturnObject(newImpactFX, 0.9f);
}
}
4.创建了Weapon_Data这个ScriptableObject,用来存储武器数据
[CreateAssetMenu(fileName = "Weapon_Data", menuName = "Scriptable Objects/Weapon_Data")]
public class Weapon_Data : ScriptableObject
{
[Header("general")]
public WeaponType weaponType;
public float reloadSpeed = 1f;
public float equipSpeed = 1f;
public float visualDistance = 6;
[Header("Shoot Details")]
public ShootType shootType;
public float fireRate = 1;//一秒能射几发子弹
public int bulletsPerShoot = 1;
public float bulletFlyTime = 0.5f;
[Header("Magazine Details")]
public int magazineCapacity;
public int totalReserveAmmo;
[Header("Spread")]
public float baseSpread = 0f;
public float maxSpread = 4f;
public float spreadIncreaseRate = 0.2f;
public float spreadDecreaseRate = 2f;
}
在Weapon类里进行构造
public Weapon() { }
public Weapon(Weapon_Data weapon_Data)
{
shootType = weapon_Data.shootType;
fireRate = weapon_Data.fireRate;
bulletsPerShoot = weapon_Data.bulletsPerShoot;
bulletFlyTime = weapon_Data.bulletFlyTime;
magazineCapacity = weapon_Data.magazineCapacity;
bulletsInMagzine = magazineCapacity;
totalReserveAmmo = weapon_Data.totalReserveAmmo;
baseSpread = weapon_Data.baseSpread;
currenSpread = baseSpread;
maxSpread = weapon_Data.maxSpread;
spreadDecreaseRate = weapon_Data.spreadDecreaseRate;
spreadIncreaseRate = weapon_Data.spreadIncreaseRate;
weaponType = weapon_Data.weaponType;
reloadSpeed = weapon_Data.reloadSpeed;
equipSpeed = weapon_Data.equipSpeed;
visualDistance = weapon_Data.visualDistance;
}
5.改进了一下拾取武器
public class ItemPickUp : MonoBehaviour
{
[SerializeField] private Weapon_Data weaponData;
private void OnTriggerEnter(Collider other)
{
other.gameObject.GetComponent
}
}
//捡起武器
public void PickUpWeapon(Weapon_Data weapon_Data)
{
if(weaponSlots.Count >= maxSlots)
{
return;
}
weaponSlots.Add(new Weapon(weapon_Data));
player.weaponVisuals.SwitchOnBackupWeaponModel();
}