Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 设置共用游戏对象时出错';将父对象返回到池容器_C#_Unity3d_Gameobject - Fatal编程技术网

C# 设置共用游戏对象时出错';将父对象返回到池容器

C# 设置共用游戏对象时出错';将父对象返回到池容器,c#,unity3d,gameobject,C#,Unity3d,Gameobject,我有一个从池中生成的游戏对象,当我尝试将其返回到池中时,会出现错误: 设置驻留在预置中的变换的父级是 已禁用以防止数据损坏 我在许多项目中使用过ObjectPooler,从未遇到过此错误 我已经创建了简单的测试游戏对象,它仍然抛出这个错误,使用下面的代码 我有一个Bomb抽象类。我有一个从Bomb继承的PowerBomb类炸弹符合接口IExplodable 当我的玩家产生炸弹时,我将其作为玩家对象的子对象,以便玩家可以携带炸弹四处移动 我的对象池有正确的炸弹游戏对象预置(一个炸弹)。而我的玩家拥

我有一个从池中生成的游戏对象,当我尝试将其返回到池中时,会出现错误:

设置驻留在预置中的变换的父级是 已禁用以防止数据损坏

我在许多项目中使用过ObjectPooler,从未遇到过此错误

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

我有一个
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)实现什么?将我所有的预制件保存在一个游戏对象下,以保持整洁。