我有一个GameObject,我从池中产生,当我尝试将它返回到池中时,我得到错误:
设置驻留在预制件中的变换的父级是 禁用以防止数据损坏。
我在许多项目中使用过我的ObjectPooler,并且从未遇到过这个错误。
我已经创建了简单的测试GameObjects,但仍然使用下面的代码抛出此错误。
我有一个Bomb
抽象类。我有一个继承自PowerBomb
的{{1}}类。 Bomb
符合接口Bomb
。
当我的玩家生成炸弹时,我把它作为玩家对象的孩子,这样玩家就可以随身携带炸弹。
我的ObjectPool拥有正确的炸弹游戏对象预制(PowerBomb)。而且我的玩家有相同的预制件作为产卵的参考。他们的玩家也有一个参考,所以它知道它持有什么。
我花了2天的大部分时间试图找出为什么我的PowerBomb不会返回对象池。
有任何帮助吗?
Bomb.cs
IExplodable
PowerBomb.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);
}
}
BombManager.cs
public class PowerBomb : Bomb {
[SerializeField]
private AudioClip sfxSpawn;
}
Player.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();
}
ObjectPool.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;
}
答案 0 :(得分:2)
您没有也无法修改预制件。如果您使用某些编辑器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);