У меня есть 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;
}
}
}