将 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。我有一个继承自 Bomb
的 PowerBomb
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);
我有一个从池中生成的游戏对象,当我尝试将其 return 放入池中时,出现错误:
Setting the parent of a transform which resides in a prefab is disabled to prevent data corruption.
我在很多项目中使用过我的 ObjectPooler,从来没有遇到过这个错误。
我已经创建了简单的测试游戏对象,它仍然抛出这个错误,使用下面的代码。
我有一个 Bomb
摘要 class。我有一个继承自 Bomb
的 PowerBomb
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);