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

Я новичок в 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, который вы можете найти здесь)

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

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

Теперь, подойдя к вашему сценарию, я подозреваю, что вы просто должны позвонить 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?

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

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

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

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

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

общедоступная частица GameObject;

// включаем частицу в игровой объект

Другие вопросы по тегам