如何在 2D 游戏中正确设置对象池?

How to set Object pooling correctly in 2D game?

我的 2D 游戏在 Unity 中的对象池有几个问题,炮弹在与墙壁碰撞时不想停下来,其中 1 个连发射击,另外 9 个一起射击彼此相连,我的大炮是现场的静态物体。有人可以帮忙或给我一些提示吗?

这是我的代码,3 个脚本:

ObjectPooling.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjectPooling : MonoBehaviour
{

    public static ObjectPooling instance;
    [SerializeField] public GameObject objectToPool;
    private List<GameObject> cannonBalls = new List<GameObject>();
    private int numberOfObjects = 20;


    private void Awake()
    {
        instance = this;
    }

    // Start is called before the first frame update
    void Start()
    {
        for (int i = 0; i < numberOfObjects; i++)
        {
            GameObject gameObject = Instantiate(objectToPool);
            gameObject.SetActive(false);
            cannonBalls.Add(gameObject);
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }


    public GameObject GetCannonBallObject()
    {
        for (int i = 0; i < cannonBalls.Count; i++)
        {
            if (!cannonBalls[i].activeInHierarchy)
            {
                return cannonBalls[i];
            }
        }
        return null;
    }

}

Cannon.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Cannon : MonoBehaviour
{
    
        [SerializeField] private Rigidbody2D rb;
        [SerializeField] private GameObject cannonBall;
        [SerializeField] private Transform cannonBallPosition;
        void Start()
        {

        }

        private void Update()
        {
            Fire();
        }

        private void Fire()
        {
            cannonBall = ObjectPooling.instance.GetCannonBallObject();

            if(cannonBall != null)
            {
            cannonBall.transform.position = cannonBallPosition.position;
            cannonBall.SetActive(true);
            }

        }

    }

CannonBall.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CannonBall : MonoBehaviour
{

    private float speed = 10f;
    [SerializeField] private Rigidbody2D rb;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        rb.velocity = Vector2.left * speed;
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.CompareTag("FloorAndWall"))
        {
          // Destroy(this.gameObject);
            gameObject.SetActive(false);
        }
    }
}

为什么你的炮弹是静止的?您是否尝试过不将其标记为静态?此外,此问题与对象池无关。确保在启用对象时,所有组件都处于活动状态。最后,在处理刚体时,您应该在 FixedUpdate() 中处理它们,而不是在 Update() 中。