日志2025.1.29

日志2025.1.29
1.修改了子弹拖尾的bug
子弹销毁不要用对象池跟携程混合写!!
    private void Update()
    {
        if(Time.time - createdTime > flyTime)
        {
            DestroyBullet();
        }
    }

    private void DestroyBullet()
    {
        gameObject.GetComponent().enabled = false;
         ObjectPool.instance.ReturnObject(gameObject);
    }


2.重新修改了对象池的写法,使其不仅可以用于子弹
public class ObjectPool : MonoBehaviour
{
    public static ObjectPool instance;

    [SerializeField] private int poolSize = 10;

    private Dictionary> poolDictionary = new 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().originalPrefab;

        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().originalPrefab = prefab;

        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()?.PickUpWeapon(weaponData);
    }
}

    //捡起武器
    public void PickUpWeapon(Weapon_Data weapon_Data)
    {
        if(weaponSlots.Count >= maxSlots)
        {
            return;
        }

        weaponSlots.Add(new Weapon(weapon_Data));
        player.weaponVisuals.SwitchOnBackupWeaponModel();
    }

 

你可能感兴趣的:(unity,算法,游戏程序)