Система частиц - установить сетку эмиттера через скрипт

Как я могу установить сетку, испускающую частицы, в компоненте «Система частиц» (Сюрикен)? Поиск в google возвращает мне учебники только для устаревшей системы частиц.

UPD: @gamedevelopmentgerm ответил на мой вопрос:

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


person lewis    schedule 26.08.2014    source источник
comment
Вы ищете настройку формы, представленную в редакторе? Насколько мне известно, это еще не было представлено в API, но я не играл с частицами какое-то время.   -  person Bart    schedule 26.08.2014
comment
@Bart, да, я хочу настроить параметры формы во время выполнения. Если у него нет API (через 1 год после релиза)... Плохо.   -  person lewis    schedule 26.08.2014
comment
Я не знаю, обнаружит ли он изменения в сетке. Возможно, вы могли бы попробовать подключить систему частиц к пустой сетке и посмотреть, сможете ли вы поменять эту сетку во время выполнения.   -  person Bart    schedule 26.08.2014


Ответы (1)


...

УП1. О, я вижу комментарий ниже. Нет, вы не можете изменить форму сетки из скрипта, хотя я видел обходной путь для этой проблемы. Это было что-то вроде настройки пустой сетки в качестве формы излучения ParticleSystem, а затем изменения геометрии сетки из скрипта.

УП2. Хорошо, я вижу дальнейшие подробности. Если вы хотите имитировать распространение огня, я рекомендую вам рассмотреть метод ParticleSystem.Emit. вместо любой формы излучения вообще. Я рекомендую его, потому что с ParticleSystem.Emit вы сможете контролировать форму излучения в гораздо более гибкий способ.

На самом деле, вы можете использовать ParticleSystem.Emit для испускания частиц из разных экземпляров меша как Что ж.

using UnityEngine;
using System.Collections;

[RequireComponent( typeof( ParticleSystem ) )]
public class CustomParticleSystem : MonoBehaviour 
{
    #region Properties
    public Mesh[] EmissionShapes;
    public float  EmissionShapeSwitchSpeed = 0.5f;
    public float  EmissionRate = 10f;
    #endregion

    float          _shapeIndex = 0f;
    float          _timeToEmission = 0f;
    ParticleSystem _particleSystem;

    float EmissionPeriod { get { return 1f / EmissionRate; } }

    void Awake () 
    {
        _particleSystem = GetComponent<ParticleSystem>();
        _particleSystem.emissionRate = 0f;
        _timeToEmission = EmissionPeriod;
    }

    void Start () 
    {   
    }

    void Update () 
    {
        _shapeIndex += EmissionShapeSwitchSpeed * Time.deltaTime;
        if( _shapeIndex > EmissionShapes.Length-1 ) _shapeIndex -= (EmissionShapes.Length-1);

        _timeToEmission -= Time.deltaTime;
        if( _timeToEmission <= 0f )
        {
            _timeToEmission = EmissionPeriod - _timeToEmission;

            Mesh currentShape = EmissionShapes[(int)_shapeIndex];

            int triangleIndex = Random.Range( 0, currentShape.triangles.Length/3 );

            int vertexIndex0 = currentShape.triangles[triangleIndex*3];
            int vertexIndex1 = currentShape.triangles[triangleIndex*3+1];
            int vertexIndex2 = currentShape.triangles[triangleIndex*3+2];

            Vector3 v0 = currentShape.vertices[vertexIndex0];
            Vector3 v1 = currentShape.vertices[vertexIndex1];
            Vector3 v2 = currentShape.vertices[vertexIndex2];

            Vector3 n0 = currentShape.normals[vertexIndex0];
            Vector3 n1 = currentShape.normals[vertexIndex1];
            Vector3 n2 = currentShape.normals[vertexIndex2];

            float u = Random.Range( 0f, 1f );
            float v = Random.Range( 0f, 1f );
            float w = Random.Range( 0f, 1f );
            float uvw = u+v+w;
            u /= uvw;
            v /= uvw;
            w /= uvw;

            Vector3 randomPosition = v0*u + v1*v + v2*w;
            Vector3 normalAtRandomPosition = n0*u + n1*v + n2*w;

            randomPosition = this.transform.localToWorldMatrix.MultiplyPoint( randomPosition );
            normalAtRandomPosition = this.transform.localToWorldMatrix.MultiplyVector( normalAtRandomPosition );

            _particleSystem.Emit( 
                randomPosition,
                normalAtRandomPosition * _particleSystem.startSpeed, 
                _particleSystem.startSize,
                _particleSystem.startLifetime,
                _particleSystem.startColor
            );
        }
    }
}
person game development germ    schedule 26.08.2014
comment
Разве это не сетка, испускаемая как частица? Я думаю, что @lewis ищет сетку, которая действует как эмиттер частиц? - person Bart; 26.08.2014
comment
Да, @Bart говорит правильно - мне нужно установить сетку как излучатель частиц для моделирования распространения огня (чтобы показать область горения). - person lewis; 26.08.2014
comment
@game_development_germ, как я могу использовать ParticleSystem.Emit для испускания частиц из сетки? Параметры (позиция Vector3, скорость Vector3, размер поплавка, время жизни поплавка, цвет Color32) не содержат настроек сетки. - person lewis; 26.08.2014
comment
@lewis, в Emit () вы можете указать свою собственную точку излучения, верно? Таким образом, вы можете сгенерировать случайное положение на поверхности сетки в своем скрипте, это довольно просто (выберите случайный треугольник, затем выберите случайную точку внутри этого треугольника, а затем преобразуйте эту точку в мировое пространство). - person game development germ; 26.08.2014
comment
И вы можете смоделировать точное распространение огня на произвольной сетке, если вы используете смежность треугольника. т.е. вместо замены форм излучения вы можете определить виртуальную форму излучения в скрипте, и, поскольку оно виртуальное, вы можете предоставить ему любую динамическую функцию (масштабирование, поворот, перемещение, добавление новой поверхности и т. д.) - person game development germ; 26.08.2014
comment
@gamedevelopmentgerm, вы имели в виду: 1) вызвать Emit() в точках моей сетки (с произвольным шагом). Другими словами, представлять сетку как группу точек и вызывать Emit() в каждой точке? 2) Как я могу установить дополнительные настройки эмиттера (масштабировать, вращать, перемещать, добавлять новую поверхность и т.д.) с помощью кода? - person lewis; 26.08.2014
comment
@lewis, на самом деле вам не нужно представлять сетку в виде точек. Просто попробуйте мыслить нестандартно. Например, если у вас есть треугольник, вам не нужна дополнительная информация, чтобы испустить частицу из случайной точки его поверхности (вы можете вычислить его нормаль с помощью перекрестного произведения двух его ребер, и вы можете выбрать случайную точку с помощью линейного интерполяция между его случайно взвешенными вершинами). Теперь сетка — это просто массив треугольников. Вы также можете выбрать случайный индекс массива. Следовательно, чтобы испустить частицу из поверхности меша, вам не нужно предварительно обрабатывать его структуры данных, вам просто нужно их использовать. - person game development germ; 27.08.2014
comment
Я добавил пример. Он испускает частицы из разных сеток, используя одну сетку за раз и меняя формы излучения по времени. - person game development germ; 27.08.2014
comment
@gamedevelopmentgerm, спасибо за пример кода. И, извините за другой вопрос - как я могу настроить в скрипте расширенные настройки ParticleSystem, например. Излучение, форма, размер в течение срока службы, вращение в течение срока службы и т. д.? - person lewis; 27.08.2014
comment
К сожалению, все, что вы можете изменить из скрипта в Shuriken, — это общедоступные поля компонентов ParticleSystem и ParticleSystemRenderer. Если вы хотите контролировать все аспекты системы частиц во время выполнения, вы должны использовать устаревшие частицы. - person game development germ; 27.08.2014