Добавить частицы при нажатии кнопки в единстве

Я новичок в единстве 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 

person Nibha Jain    schedule 08.06.2017    source источник


Ответы (3)


Прежде всего, если вы используете частицы внутри пользовательского интерфейса Unity, я настоятельно рекомендую вам обратиться к UIParticleSystem.cs скрипт из Репозиторий расширений пользовательского интерфейса Unity: это собрание множества полезных инструментов пользовательского интерфейса :)
(просто не забудьте добавить UI/Particles/Hidden шейдер, который вы можете найти здесь)

Вы можете изменить спрайт, который хотите использовать, здесь: Настройки компонента UIParticleSystem

Также имейте в виду, что при использовании этого скрипта вам придется масштабировать свои частицы в соответствии с вашим экраном (частицы инициализируются с размером 1, потому что это 1 метр в мире Unity 3D: но теперь вы, вероятно, будете в пространстве холста, которое будет что-то вроде 1920x1080 пикселей, поэтому 1 пиксель будет очень маленьким). Вы можете найти некоторые базовые настройки ниже: Настройки компонента ParticleSystem

Теперь, перейдя к вашему сценарию, я подозреваю, что вам просто нужно вызвать Stop() перед Play() вот так (обратите внимание, что я использовал тип выброса всплеска в настройках системы частиц):

ParticleSystem ps = GetComponent<ParticleSystem>();
ps.Stop ();
ps.Play ();

P.-S. Обратите внимание, что если вы используете скрипт UIParticleSystem, вам придется рассматривать вашу систему частиц как элемент пользовательского интерфейса (будет отображаться поверх других элементов интерфейса). элементы на основе иерархического порядка)

Надеюсь, это поможет

EDIT:
У вас есть два способа настройки GameObjects:

  • у вас есть все компоненты в одном и том же GameObject (ParticleSystem, UIParticleSystem и YOUR_SCRIPT): таким образом вы можете получить ссылку ParticleSystem, вызвав GetComponent<ParticleSystem>() внутри вашего скрипта

  • у вас есть одна частица GameObjectParticleSystem и 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();
    }
}
person Kardux    schedule 08.06.2017
comment
Небольшое замечание по этому поводу: похоже, проблема связана со свойством Play On Awake системы частиц. Если вы проверите значение ps.isPlaying перед вызовом Stop() в моем скрипте, оно будет истинным даже в первый раз (с снятым флажком Play On Awake). - person Kardux; 12.06.2017
comment
Спасибо @Kardux. Я получаю NullReferenceException: ссылка на объект не указывает на экземпляр объекта в ps.Stop().. у вас есть идеи по этому поводу? - person Nibha Jain; 14.06.2017
comment
Находится ли скрипт на том же объекте, что и ваш компонент ParticleSystem? Если нет, вам нужно объявить [SerializeField] private ParticleSystem ps; как переменную вашего скрипта и назначить ее через Инспектор (или вы можете просто переместить скрипт в тот же объект, что и ваша ParticleSystem). - person Kardux; 14.06.2017
comment
Я создал игровой объект ParticleSystem, затем добавил этот скрипт UIParticleSystem.cs к этому объекту... и назначил ParticleSystem частицам под панелью из редактора... не упомянутый выше код, который я добавил в требуемый метод... Я совершенно новичок в единстве ..это правильный путь? - person Nibha Jain; 14.06.2017
comment
Я только что отредактировал свой ответ, чтобы немного объяснить вам, как вы можете получить рабочую ссылку на ваш компонент ParticleSystem: скажите, можете ли вы заставить его работать :) - person Kardux; 14.06.2017
comment
Я разместил краткий тестовый скрипт: можете ли вы его попробовать? Помимо этого, вы уверены, что не переопределяете ссылку ps где-либо еще (например, вызывая ps = GetComponent<ParticleSystem>())? Вы можете проверить это, проверив значение вашей переменной ps в Инспекторе после возникновения исключения NullReference. - person Kardux; 14.06.2017

Если у вас есть система частиц на том же игровом объекте, что и скрипт, который ее вызывает, все должно быть в порядке.

Вы используете кнопку пользовательского интерфейса? Если да, посмотрите здесь. /answers.unity3d.com/questions/852397/particle-system-in-46-ui.html

Это старо, но все еще актуально.

person Ben Brookes    schedule 08.06.2017

Используете ли вы новую систему пользовательского интерфейса Unity или графический интерфейс? Является ли мировое пространство пользовательского интерфейса?

  1. Создайте пустой игровой объект — прикрепите к нему частицу.
  2. Всякий раз, когда вы хотите испускать частицы, вызывайте Gameobject.SetActive(true);
  3. Убедитесь, что опция Play on Awake отмечена в системе частиц.

Установите положение частицы в соответствии с вашим пользовательским интерфейсом.

person rohankad    schedule 08.06.2017
comment
Я использую редактор Unity 5.6.. Я добавил к нему игровой объект и систему частиц, опция воспроизведения при пробуждении отмечена.. поэтому мне просто нужно вызвать Gameobject.SetActive(true); на сценариях желаемое состояние во время выполнения? - person Nibha Jain; 08.06.2017
comment
Да, изначально отключите игровой объект системы частиц. Всякий раз, когда вам нужно испускать частицы, просто включите его на необходимое время. Добавьте частицу в отдельный игровой объект не для пользовательского интерфейса. Вы уверены, что система частиц работает нормально, воспроизведите ее в редакторе, чтобы проверить, работает ли она. - person rohankad; 08.06.2017
comment
Я могу добавлять частицы к статическим элементам... или на домашнюю страницу... но не туда, куда мне нужно во время выполнения! - person Nibha Jain; 08.06.2017
comment
Иметь систему частиц, излучающую все время, и просто отключать ее — плохая практика. Вместо этого используйте ParticleSystem.Play и ParticleSystem.Stop. - person Dávid Florek; 08.06.2017
comment
Над кодом мой вопрос не работает ... есть предложения по этому поводу? - person Nibha Jain; 08.06.2017
comment
Создайте префаб игрового объекта с частицей и создайте его экземпляр во время выполнения. - person rohankad; 09.06.2017