C# 设置共用游戏对象时出错';将父对象返回到池容器
我有一个从池中生成的游戏对象,当我尝试将其返回到池中时,会出现错误: 设置驻留在预置中的变换的父级是 已禁用以防止数据损坏 我在许多项目中使用过ObjectPooler,从未遇到过此错误 我已经创建了简单的测试游戏对象,它仍然抛出这个错误,使用下面的代码 我有一个C# 设置共用游戏对象时出错';将父对象返回到池容器,c#,unity3d,gameobject,C#,Unity3d,Gameobject,我有一个从池中生成的游戏对象,当我尝试将其返回到池中时,会出现错误: 设置驻留在预置中的变换的父级是 已禁用以防止数据损坏 我在许多项目中使用过ObjectPooler,从未遇到过此错误 我已经创建了简单的测试游戏对象,它仍然抛出这个错误,使用下面的代码 我有一个Bomb抽象类。我有一个从Bomb继承的PowerBomb类炸弹符合接口IExplodable 当我的玩家产生炸弹时,我将其作为玩家对象的子对象,以便玩家可以携带炸弹四处移动 我的对象池有正确的炸弹游戏对象预置(一个炸弹)。而我的玩家拥
Bomb
抽象类。我有一个从Bomb
继承的PowerBomb
类<代码>炸弹符合接口IExplodable
当我的玩家产生炸弹时,我将其作为玩家对象的子对象,以便玩家可以携带炸弹四处移动
我的对象池有正确的炸弹游戏对象预置(一个炸弹)。而我的玩家拥有与繁殖参考相同的预设。他们还持有一个参考,这样它就知道它持有的是什么
我花了两天的大部分时间试图弄明白为什么我的PowerBomb不会返回到对象池
有什么帮助吗
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);
}
}
public class PowerBomb : Bomb {
[SerializeField]
private AudioClip sfxSpawn;
}
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();
}
[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;
}
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;
}
}
}
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);
}
}
public class PowerBomb : Bomb {
[SerializeField]
private AudioClip sfxSpawn;
}
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();
}
[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;
}
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;
}
}
}
BombManager.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);
}
}
public class PowerBomb : Bomb {
[SerializeField]
private AudioClip sfxSpawn;
}
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();
}
[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;
}
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;
}
}
}
ObjectPool.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);
}
}
public class PowerBomb : Bomb {
[SerializeField]
private AudioClip sfxSpawn;
}
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();
}
[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;
}
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;
}
}
}
私有游戏对象容器对象;
私有列表[]池对象;
//为简洁起见,删除了代码。从游泳池出来很好。
公共空池对象(游戏对象obj){
for(int i=0;i
您不能也不能修改预制件。如果您使用一些编辑器API来修改它,它可能会在编辑器中工作,但在运行时不会,也不会更改更改。出现此错误是因为obj是一个预置,您正试图在obj.transform.SetParent(containerObject.transform)处修改它代码>
你甚至不在游泳池里使用预制板。这不正常。您要做的是使用实例化
函数实例化预置,然后将实例化的对象放入池中
GameObject obj = Instantiate(prefab, new Vector3(i * 2.0F, 0, 0), Quaternion.identity);
//Add instantiated Object to your pool List
pooledObjects[i].Add(obj);
您不能也不能修改预设。如果您使用一些编辑器API来修改它,它可能会在编辑器中工作,但在运行时不会,也不会更改更改。出现此错误是因为obj是一个预置,您正试图在obj.transform.SetParent(containerObject.transform)处修改它代码>
你甚至不在游泳池里使用预制板。这不正常。您要做的是使用实例化
函数实例化预置,然后将实例化的对象放入池中
GameObject obj = Instantiate(prefab, new Vector3(i * 2.0F, 0, 0), Quaternion.identity);
//Add instantiated Object to your pool List
pooledObjects[i].Add(obj);
使用obj.transform.SetParent(containerObject.transform)您想要实现什么代码>?将我所有的预设都放在一个游戏对象下以保持整洁。你想用obj.transform.SetParent(containerObject.transform)实现什么代码>?将我所有的预制件保存在一个游戏对象下,以保持整洁。