Я не вижу код, где шары уничтожены, или ваши настройки, но в вашем вопросе это звучит для меня как в PrefabBall
, на который вы ссылались на оригинальный шар из Сцены .
Так что, когда вы Destroy()
, тогда PrefabBall
будет null
конечно.
Как насчет того, чтобы иметь фактический префаб в Assets
вместо ссылки на объект Scene? Я полагаю, вы этого не делали, потому что вы хотели напрямую клонировать его текущие свойства, полученные из бонусов вместе с ним. Но для этого есть и другие варианты (например, копирование их, как вы делали с настройками жесткого тела, или сохранение бонусов в виде значений static
)
В качестве альтернативы можно отключить только «потерянные» шары
ball.gameObject.SetActive(false);
вместо того, чтобы уничтожать их. Таким образом, он остается неизменным, но больше не доступен для игры. Вам только нужно убедиться, что включены инстанцированные шары, такие как
Doubleclone.gameObject.SetActive(true);
Как замечание, есть также некоторые проблемы с эффективностью, которые я хотел бы отметить здесь
Вы все время пользуетесь
ball ballscript = ArrayOfBalls[i].GetComponent<ball>();
Было бы гораздо эффективнее вместо этого напрямую использовать
ball[] ArrayOfBalls = FindObjectsOfType<ball>();
или в качестве полной альтернативы Find
используйте
public static readonly List<ball> ArrayOfBalls = new List<ball>();
сделать тип PrefabBall
скорее ball
, и теперь каждый раз, когда вы создаете новый шар, добавляйте его в список
ball Doubleclone = Instantiate(PrefabBall, ....);
ArrayOfBalls.Add(Doubleclone);
и каждый раз до вы Destroy()
мяч удаляете его из списка frist
ArrayOfBalls.Remove(ball);
Destroy(ball.gameObject);
Таким образом, ваш ArrayOfBalls
всегда обновляется сам по себе.
И Вы можете легко получить текущий глобальный счетчик шаров:
YourScriptType.ArrayOfBalls.Count