Изменение начальной скорости частиц через скрипт

Программирование на Юнити.

Изменение начальной скорости частиц через скрипт

Сообщение neigenoir 24 апр 2018, 17:17

Добрый день

только начал осваивать unity и c#, прошу не ругаться если вопрос будет глупый

пытаюсь управлять направлением и скоростью появления частиц через скрипт
вот в таком коде

Синтаксис:
Используется csharp
       
        private ParticleSystem ps;
        public void ChangeDirection(Vector3 v)
        {
                if (ps)
                {
                        ps.transform.rotation = Quaternion.FromToRotation(Vector3.forward, v);
                        ps.main.startSpeed = v.magnitude;
                }
        }
 


направление меняется, а вот со скоростью возникает такая ошибка
error CS1612: Cannot modify a value type return value of `UnityEngine.ParticleSystem.main'. Consider storing the value in a temporary variable
насколько я понял, подсказка предлагает решать эту ошибку так

Синтаксис:
Используется csharp
        private ParticleSystem ps;
        public void ChangeDirection(Vector3 v)
        {
                if (ps)
                {
                        ps.transform.rotation = Quaternion.FromToRotation(Vector3.forward, v);
                        ParticleSystem.MainModule psMain = ps.main;
                        psMain.startSpeed = v.magnitude;
                        ps.main = psMain;
                }
        }
 


но тогда возникает другая ошибка
error CS0200: Property or indexer `UnityEngine.ParticleSystem.main' cannot be assigned to (it is read-only)
и вот тут я в тупике

вопроса два:

1. как из скрипта изменить начальную скорость частиц в системе частиц, если модуль в котором она находится - рид онли?

2. в чем смысл этого CS1612? зачем такое усложнение простого кода? сталкивался с этой же проблемой даже при простой попытке изменить одну координату позиции, например "transform.position.x = 10f;". Как в таком случае писать простой и понятный код? есть ли варианты кроме ужасных
Синтаксис:
Используется csharp
transform.position = new Vector3( 10f, transform.position.y, transform.position.z );
// или
pos = transform.position;
pos.x = 10f;
transform.position = pos;
 

? чувствую, что эта ошибка еще долго меня преследовать будет. И чтобы сразу привыкать писать правильно, прошу поделиться опытом и посоветовать что-то.
neigenoir
UNец
 
Сообщения: 2
Зарегистрирован: 24 апр 2018, 16:38

Re: Изменение начальной скорости частиц через скрипт

Сообщение Anonymyx 24 апр 2018, 18:48

1. Назначать обратно не надо, получили модуль - меняйте как хотите.
Но это же структура, крикните вы! Ответ: https://blogs.unity3d.com/ru/2016/04/20 ... dules-faq/


2. position - Vector3, свойство класса Transform.
Свойство - это 2 метода: Get() и Set(). И когда мы обращаемся к свойству position, метод Get() возвращает копию структура Vector3, потому что это структурный тип, и возвращается значение, а не ссылка. Следовательно, если мы поменяем координату этой структура, к Transform'у который ее вернул она уже не имеет отношения, т.е. нет обратной связи.
Поэтому, как вы уже поняли, получаем структуру меняем значение, и присваиваем обратно новую структуру. Можно и сразу создать и присвоить через = new Vector3();
А систему частиц можно считать исключением в данном случае.
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: Изменение начальной скорости частиц через скрипт

Сообщение neigenoir 26 апр 2018, 00:04

большое спасибо!
буду читать про структуры - это совершенно новое для меня понятие
neigenoir
UNец
 
Сообщения: 2
Зарегистрирован: 24 апр 2018, 16:38


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9