将 Pooled GameObject 的父级设置回池化容器时出错

Error on setting a Pooled GameObject's parent back to pooled container

我有一个从池中生成的游戏对象,当我尝试将其 return 放入池中时,出现错误:

Setting the parent of a transform which resides in a prefab is disabled to prevent data corruption.

我在很多项目中使用过我的 ObjectPooler,从来没有遇到过这个错误。

我已经创建了简单的测试游戏对象,它仍然抛出这个错误,使用下面的代码。

我有一个 Bomb 摘要 class。我有一个继承自 BombPowerBomb class。 Bomb 符合接口 IExplodable.

当我的玩家生成炸弹时,我将其作为玩家对象的子对象,这样玩家就可以带着炸弹四处移动。

我的 ObjectPool 具有正确的炸弹游戏对象预制件(PowerBomb)。我的播放器具有与 spawn 引用相同的预制件。他们的玩家也持有一个参考,所以它知道它持有什么。

我花了 2 天的大部分时间试图找出为什么我的 PowerBomb 不会 return 到对象池。

有什么帮助吗?

Bomb.cs

public abstract class Bomb : MonoBehaviour, IExplodable {

    //Interface
    public virtual void OnDetonate() {
        Die();
    }

    public virtual void Die() {
        Debug.Log("Bomb Die()");
        ObjectPool.instance.PoolObject(gameObject);
    }
}

功率Bomb.cs

public class PowerBomb : Bomb {
    [SerializeField]
    private AudioClip sfxSpawn;
}

BombManager.cs

public GameObject bomb;

public void SpawnBomb(){
    GameObject obj = ObjectPool.instance.GetObject(bomb);
    if (obj == null) return;
    obj.SetActive(true);
    PlayerInstance.HoldObject(obj);
}


public void DetonateBomb(){
    bomb.GetComponent<PowerBomb>().OnDetonate();
}

Player.cs

[SerializeField]
private bool isHolding = false;
public bool IsHolding {
    get { return isHolding; }
    set { isHolding = value; }
}

private GameObject holdingObject;
public GameObject HoldingObject {
    get { return holdingObject; }
    set { holdingObject = value;}
}

public void HoldObject(GameObject o) {
    HoldingObject = o;
    HoldingObject.transform.SetParent(transform);
    HoldingObject.transform.position = holdingArea.transform.position;
    IsHolding = true;
}

ObjectPool.cs

private GameObject containerObject;
private List<GameObject>[] pooledObjects;


//Code removed for brevity. Getting from the pool is fine.    


public void PoolObject(GameObject obj) {
    for (int i = 0; i < objectsToPool.Count; i++) {
        if (objectsToPool[i].objectToPool.name.Equals(obj.name)) {
            obj.SetActive(false);

//THIS LINE IS THROWING THE ERROR
            obj.transform.SetParent(containerObject.transform); 

            pooledObjects[i].Add(obj);
            return;
        }
    }
}

您不会也不能修改预制件。如果您使用某些编辑器 API 对其进行修改,它可能会在编辑器中工作,但在 运行 期间不会,并且不会更改更改。您收到此错误是因为 obj 是您尝试在 obj.transform.SetParent(containerObject.transform);.

处修改的预制件

你甚至不在游泳池中使用预制件。这不正常。你所做的是使用 Instantiate 函数实例化预制件,然后将实例化的对象放入池中。

GameObject obj =  Instantiate(prefab, new Vector3(i * 2.0F, 0, 0), Quaternion.identity);

//Add instantiated Object to your pool List
pooledObjects[i].Add(obj);