Ошибка при установке родительского объекта Pooled GameObject в пул контейнер - PullRequest
0 голосов
/ 08 мая 2018

У меня есть GameObject, который я порождаю из пула, и когда я пытаюсь вернуть его в пул, я получаю сообщение об ошибке:

Установка родительского элемента преобразования, находящегося в префабе, отключен для предотвращения повреждения данных.

Я использовал ObjectPooler во многих проектах и ​​никогда не сталкивался с этой ошибкой.

Я создал простой тестовый GameObjects, и он по-прежнему выдает эту ошибку, используя приведенный ниже код.

У меня есть Bomb абстрактный класс. У меня есть класс PowerBomb, который наследуется от Bomb. Bomb соответствует интерфейсу IExplodable.

Когда мой игрок порождает бомбу, я помещаю ее в качестве дочернего объекта объекта игрока, чтобы игрок мог перемещаться с бомбой.

Мой ObjectPool имеет правильный сборный объект-бомбу (PowerBomb). и мой игрок имеет тот же сборный, что и ссылка на спавна. У игрока также есть ссылка, поэтому он знает, что держит.

Большую часть двух дней я потратил, пытаясь выяснить, почему моя 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);
    }
}

PowerBomb.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;
        }
    }
}

1 Ответ

0 голосов
/ 09 мая 2018

Вы не можете и не можете изменить префаб. Он может работать в редакторе, если вы используете какой-либо редактор 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);
...