Здравствуйте дорогие читатели!
Сегодня я хочу рассказать о том как можно расширить возможности Particle Systems в Unity3D используя скрипты.
Для примера я на пустую сцену добавил Particle System из меню GameObject
Теперь нужно его немного отредактировать для наглядности. Я изменил Start Speed на 0, чтобы частицы не имели начальной скорости, а просто оставались на месте, а также в Simulation Space выбираю World, чтобы частицы не привязывались к родительскому объекту, а стали независимыми.
Теперь наш Particle System больше похож на облако. Добавим к его GameObject скрипт. Для этого выделяем GameObject нашего Particle System и нажимаем в его свойствах в самом низу кнопку Add Component.
Называете его как вам захочется. Я назвал его Circle.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
using UnityEngine; using System.Collections; public class Circle : MonoBehaviour { private float _tick = 0; private Vector3 _startLocation; void Start() { _startLocation = transform.localPosition; } void FixedUpdate() { _tick += 0.1f; float x = (float)Mathf.Sin(_tick); float z = (float)Mathf.Cos(_tick); Vector3 addVector = new Vector3(x, 0, z) * 5; transform.localPosition = _startLocation + addVector; } } |
Теперь немного усложним задачу и заставим двигаться объект по спирали. Для этого создадим ещё одну переменную y, которой присвоим значение _tick/10. Если оставить просто _tick, то скорость «взлета» будет слишком большой.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using UnityEngine; using System.Collections; public class Circle : MonoBehaviour { private float _tick = 0; private Vector3 _startLocation; void Start() { _startLocation = transform.localPosition; } void FixedUpdate() { _tick += 0.1f; float x = (float)Mathf.Sin(_tick); float z = (float)Mathf.Cos(_tick); float y = _tick/10; Vector3 addVector = new Vector3(x, y, z) * 5; transform.localPosition = _startLocation + addVector; } } |
Всем спасибо за внимание!
Спасибо за статью. А как сделать, чтобы движение было не по часовой, а против часовой стрелки? И как организовать движение по спирали вниз?
На вашем сайте часть интерфейса не переведена. И текст в кнопке «Добавить комментарий» вылезает за её пределы
Спасибо за ваш комментарий! Сайт свежий и пока доводится до ума.
Для того, чтобы двигаться против часовой стрелки нужно в строчке
Vector3 addVector = new Vector3(x, y, z) * 5;
поменять местами x и z. То есть будет выглядеть вот так:
Vector3 addVector = new Vector3(z, y, x) * 5;
А с движением по спирали вниз ещё проще. Уменьшать _tick:
_tick -= 0.1f;
Кстати, если _tick уменьшать, то направление движения тоже должно смениться на противоположное.
Здравствуйте, пробую использовать Ваш скрипт у себя в 2D игре. Particle System крутиться вокруг объекта, но я столкнулся с проблемой, что частицы отрисовываются перед объектом, даже тогда, когда партикл находится за объектом. Вы случай не сталкивались? Может подскажите как это вылечить?
Здравствуйте. Прошу прощения за задержку — в отпуске =) Поэтому Unity под рукой сейчас нет.
Попробую помочь по памяти.
Посмотрите настройки у вашего Sprite Renderer. Там есть свойство «Order in Layer». Если оно стоит выше 0 — то спрайт будет прорисовываться всегда над любыми 3D объектами, даже если они перед ним. Попробуйте использовать отрицательные значения. Если что — отпишитесь. Я постараюсь здесь найти Unity, либо после отпуска.
“Order in Layer” выставил у всех элементов == 0, но проблема актуальна.. если важно то использую юнити 4.6
«всегда над любыми 3D объектами» — может проблема в том чтоу меня 2D объекты?..
Хорошего отпуска!
Снова простите за задержку. Надо смотреть, конечно, более детально всё.. И я бы вам, всё-таки, рекомендовал бы обновиться до 5ой версии Unity3D. Хотя бы по причине того, что все «плюшки», закрытые у 4.6 станут доступны в 5ой версии =) Ну за редким исключением
Спасибо за статью. Подскажите пожалуйста а как уменьшить или увеличить радиус спирали по которой двигаются партиклы или обьект.
Попробуйте константу 5 в строке 19 вывести в переменную. Смотрите код ниже:
Единственное — в таком случае и скорость «поднятия» спирали будет выше. Но можно задавать в addVector y после умножения на Radius.
addVector.y = y;
Я сейчас в отпуске, поэтому, к сожалению, проверить работоспособность кода не могу =)