В вашем случае может происходить несколько вещей, но я бы сказал, что либо ваша переменная "pickupEffect" как-то становится недействительной, либо это происходит из-за вызова:
tempPickupEffect.GetComponent<ParticleSystem>().Play();
Я разбью оба случая более подробно ниже.
Во-первых, вы можете добавить проверку, чтобы убедиться, что для переменной «pickupEffect» задано значение NULL или какой-то скрипт уничтожает этот GameObject / prefab (вызывая для него Destroy ()). Добавьте эту проверку прямо перед вызовом Instantiate(pickupEffect, ...)
внутри вашего OnTriggerEnter2D(...)
метода. Это можно сделать, сравнив pickupEffect == null
(оператор ==
переопределен и проверит, был ли уничтожен GameObject / prefab, как указано в в этом ответе ).
Если объект разрушается, простой способ определить , где он уничтожается , сделать следующее: создать небольшой скрипт, содержащий функцию OnDisable()
, и добавить вызов Debug.Log()
с любым текстом на нем. Вызов Debug.Log()
зарегистрирует ваш текст, а также добавит трассировку стека к сообщению журнала, которое вы можете использовать, чтобы проверить, где был сделан вызов функции Destroy()
(и, таким образом, обнаружить где ваш GameObject уничтожается).
// This script should be added to the "pickupEffect" gameobject
void OnDisable()
{
Debug.Log("Object destroyed!");
}
Когда объект уничтожается, генерируется вывод, подобный следующему:
Object destroyed!
UnityEngine.Debug:Log(Object)
MyObjectBeingDeleted:OnDisable() (at
Assets/MyObjectBeingDeleted.cs:10) UnityEngine.Object:Destroy(Object)
MyDestroyerObject:Update() (at Assets/MyDestroyerObject.cs:11)
Приведенная выше трассировка стека говорит мне, что метод Destroy()
был вызван в строке 11 сценария MyDestroyerObject.cs .
С другой стороны, проблема на самом деле может быть в этой части вашего кода:
tempPickupEffect.GetComponent<ParticleSystem>().Play();
Destroy(tempPickupEffect, 3f);
Здесь вы даете команду ParticleSystem на игру, но сразу после того, как вы отправите эту команду, вы уничтожаете GameObject, который содержит эту систему Particle System. На самом деле это плохая практика (и может привести к исключениям, которые трудно отладить). Я рекомендую вам создать сценарий с методом Update()
, который проверяет, завершила ли система Particle свое выполнение, и уничтожает объект после того, как это выполнение завершилось.