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

时间:2018-05-08 18:07:25

标签: c# unity3d gameobject

我有一个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;
}

1 个答案:

答案 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);