Добавить частицы по нажатию кнопки в единстве
Я новичок в Unity 3D, я должен сделать некоторые улучшения в выход из проекта... если пользователь выбрал правильный вариант, то я должен показать некоторые частицы вокруг кнопки во время выполнения. Мой код для добавления частиц ниже.. не работает:
ParticleSystem ps = GetComponent<ParticleSystem>();
ps.Play ();
Я также добавил компонент частиц из редактора единства..
заранее спасибо
Редактировать:
как @kardux предложил:
декларация:
[SerializeField] private ParticleSystem ps;
по методу:
ps.Play()
Скриншот от инспектора:
Ошибка:
I/Unity (23313): NullReferenceException
I/Unity (23313): at UnityEngine.ParticleSystem.<Play>m__0 (UnityEngine.ParticleSystem ps) [0x00001] in /Users/builduser/buildslave/unity/build/artifacts/generated/common/modules/ParticleSystem/ParticleSystemBindings.gen.cs:3666
I/Unity (23313): at UnityEngine.ParticleSystem.IterateParticleSystems (Boolean recurse, UnityEngine.IteratorDelegate func) [0x00003] in /Users/builduser/buildslave/unity/build/artifacts/generated/common/modules/ParticleSystem/ParticleSystemBindings.gen.cs:3780
I/Unity (23313): at UnityEngine.ParticleSystem.Play (Boolean withChildren) [0x00020] in /Users/builduser/buildslave/unity/build/artifacts/generated/common/modules/ParticleSystem/ParticleSystemBindings.gen.cs:3666
I/Unity (23313): at UnityEngine.ParticleSystem.Play () [0x00005] in /Users/builduser/buildslave/unity/build/artifacts/generated/common/modules/ParticleSystem/ParticleSystemBindings.gen.cs:3661
4 ответа
Прежде всего, если вы используете частицы внутри пользовательского интерфейса Unity, я настоятельно рекомендую вам обратиться к сценарию UIParticleSystem.cs из репозитория Unity UI Extension: это собрание сообщества многих полезных инструментов пользовательского интерфейса:)
(просто не забудьте добавить шейдер UI/Particles/Hidden, который вы можете найти здесь)
Вы можете изменить спрайт, который хотите использовать здесь:
Также имейте в виду, что при использовании этого скрипта вам придется масштабировать ваши частицы в соответствии с вашим экраном (частицы инициализируются размером 1, потому что это 1 метр в мире Unity 3D: но теперь вы, вероятно, окажетесь в пространстве холста, которое будет что-то вроде 1920x1080px, поэтому 1px будет очень маленьким). Вы можете найти некоторые базовые настройки ниже:
Теперь, подойдя к вашему сценарию, я подозреваю, что вы просто должны позвонить Stop()
до Play()
вот так (заметьте, я использовал тип выброса вспышки в настройках системы частиц):
ParticleSystem ps = GetComponent<ParticleSystem>();
ps.Stop ();
ps.Play ();
P.-S. Обратите внимание, что если вы используете скрипт UIParticleSystem, вам придется рассматривать вашу систему частиц как элемент пользовательского интерфейса (будет отображаться поверх других элементов в соответствии с порядком иерархии)
Надеюсь это поможет,
РЕДАКТИРОВАТЬ:
У вас есть два способа настройки GameObjects:
у вас есть все компоненты в одном GameObject (ParticleSystem, UIParticleSystem и YOUR_SCRIPT): таким образом, вы можете получить ссылку на ParticleSystem, вызвав
GetComponent<ParticleSystem>()
внутри вашего сценарияу вас есть один GameObject частицы (с ParticleSystem и UIParticleSystem), а YOUR_SCRIPT находится в другом GameObject: вы не можете вызвать
GetComponent<ParticleSystem>()
в вашем скрипте, так как он будет искать компоненты этого GameObject, поэтому вы объявляетеParticleSystem ps;
переменная (либоpublic
или же[SerializeField] private
), который вы назначаете через Инспектора, перетаскивая в него свой GameObject.
Обратите внимание, что неявно, GetComponent<ParticleSystem>()
равняется this.gameObject.GetComponent<ParticleSystem>()
: поэтому он будет искать компоненты из текущего GameObject.
РЕДАКТИРОВАТЬ 2:
Не уверен, почему ваш скрипт выдает это исключение NullReference: я только что попробовал с очень коротким скриптом, и он отлично работает...
public class TestScript: MonoBehaviour
{
[SerializeField]
private ParticleSystem ps;
void Start()
{
// This one is not even needed
ps.Stop();
}
public void PlayParticles()
{
ps.Stop();
ps.Play();
}
}
Используете ли вы новую систему Unity UI или графический интерфейс? Является ли UI worldspace?
- Создайте пустой игровой объект - прикрепите к нему частицу.
- Всякий раз, когда вы хотите испускать частицы, звоните
Gameobject.SetActive(true);
- Убедитесь, что опция Play on Awake включена в системе частиц.
Установите положение частицы в соответствии с вашим пользовательским интерфейсом.
Если у вас есть система частиц в том же gameObject, что и вызывающий ее скрипт, все должно быть в порядке.
Вы используете кнопку пользовательского интерфейса? Если это так, загляните сюда.. http://answers.unity3d.com/questions/852397/particle-system-in-46-ui.html
Это старо, но все еще актуально.
общедоступная частица GameObject;
// включаем частицу в игровой объект