Программисты должны быть осведомлены о системе частиц Unity

Предупреждение: Данная статья является блоггером оригинальной статьи, следовать CC 4.0 BY-SA авторского соглашения, воспроизведенный, пожалуйста , приложите ссылку первоисточника и это утверждение.
Эта ссылка: https://blog.csdn.net/s10141303/article/details/97005756

предисловие

Мы не привыкли иметь дело с системой частиц, которая является более художественными спецэффектами? Мы не привыкли, чтобы изменить положение частицы, которая не так долго, как преобразование Установочное положение? У нас есть программа, чтобы сделать большую часть системы частиц не работает, до тех пор, пока дисплей нагрузки в порядке? Мы хотим еще раз сыграть частицы эффекты не отображаются скрытыми и затем показать родитель? Мы хотим изменить, как только эффекты параметров частицы не первые компоненты ParticleSystem приобретения, а затем изменить параметры внутри? После того, как ... Теперь я знаю, что есть интерфейс ParticleSystem Испустит изменить эмиттер частиц. До глубокого понимания эффектов частиц возможно потому, что компания имеет художественные спецэффекты, возможно, из-за простой спрос, возможно, он не смотрел в глубине, но слишком поздно, слишком поздно. Все мы знаем, что очень частиц потребления Unity, потребляют меньше энергии менее, Unity также ввел новую систему частиц, вы должны использовать после Unity2018.3 версии. Новая система частиц представляет собой систему частиц, производительность и визуальный эффект и запустить на GPU значительно предъявления обвинения, но основана на HDRP HD рендеринга трубопровода, что означает, что большинство мобильных устройств могут не поддерживаться. Unity также посвященный ввести новую систему частиц из FPS Demo, особенно высокой четкости качество изображения, немного как пионер часы поймать ногу.

эффект

  • 1. Изменение положения эмиссии частиц
    Здесь Insert Picture Описание

Здесь Insert Picture Описание

  • 2. изменить углы вылета частиц
    Здесь Insert Picture Описание

Общие параметры системы частиц и интерфейсы

  • StartLifetime частица долгой жизни
  • Начальная скорость частиц StartSpeed
  • Четыре типа переменных
    Здесь Insert Picture Описание
    • Тип Значение Константа
    • Кривая Тип кривой
    • Случайные значения между этими двумя типами случайного между двумя константами
    • Введите случайное значение между двумя кривыми Randoom между двумя кривыми
  • Есть Play On Awake начать играть
  • Эмиссионные излучатели частиц на точке крюка может непосредственно увидеть эффект в Play Scene, если не проверено не будет увидеть эффект в целом мы хотим скрыть, когда система частиц непосредственно GameObejct установлен невидимым относительно крутой, предпочтительно с задержкой по времени, чтобы закрыть Эмиссия затем скрыть опыт будет гораздо лучше.
DOVirtual.DelayedCall(1, () =>
{
     for (int i = 0; i < psComponents.Length; i++)
     {
         var emition = psComponents[i].emission;
         emition.enabled = true;
     }
     mAttachedGameObject?.SetActive(activeState);
 });
  • Эмиссия / Врывается несколько частиц
  • Параметры EmitParams частиц для изменения
    Здесь Insert Picture Описание

Меры предосторожности

С желаемой величины фактического найденного не то же самое, только две кривые диапазон значений от -1 до 1, а затем умножают на коэффициенты должны SpeedCurve.curveMultiplier, другие модели должны не два тестовых кривых Curve, когда эта величина умножается на коэффициент значения кривые могут быть получены, и чувствовать, что существует та же ошибка, метод получения значения кривых четыре типа являются следующим:

    public float GetCurrentSpeed()
    {
        switch (mSpeedCurve.mode)
        {
            case ParticleSystemCurveMode.Constant:
                mCurrentSpeed = mSpeedCurve.constant;
                break;
            case ParticleSystemCurveMode.TwoConstants:
                mCurrentSpeed = Random.Range(mSpeedCurve.constantMin, mSpeedCurve.constantMax);
                break;
            case ParticleSystemCurveMode.Curve:
                mCurrentSpeed = mSpeedCurve.Evaluate(Random.value);
                break;
            case ParticleSystemCurveMode.TwoCurves:
                {
                    float t = Random.value;
                    mCurrentSpeed = Random.Range(mSpeedCurve.curveMin.Evaluate(t), mSpeedCurve.curveMax.Evaluate(t)) * mSpeedCurve.curveMultiplier;
                }
                break;
        }
        return mCurrentSpeed;
    }

код

  • ParticleEffectsEmitter
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ParticleEffectsEmitter : MonoBehaviour
{
    public Vector3 Position;
	XXX if UNITY_EDITOR
    public bool TestEmit;
    public Vector3 TestRotation;
    public Vector3 TestDirection;
	XXX endif

    protected Transform mTrans;
    protected SubParticle[] mSubParticleList;

	xxx if UNITY_EDITOR
    void Update()
    {
        if (TestEmit)
        {
            TestEmit = false;
            if (TestRotation == Vector3.zero)
            {
                Emit(Position, TestDirection);
            }
            else
            {
                Emit(Position, TestDirection, Quaternion.Euler(TestRotation));
            }
        }
    }
	XXX endif
    public void Emit(Vector3 pos, Vector3 dir, float lifetimeScale = 1.0f, float sizeScale = 1.0f)
    {
        if (mSubParticleList == null)
            return;
        for (int i = 0; i < mSubParticleList.Length; i++)
        {
            mSubParticleList[i].Emit(pos, dir, lifetimeScale, sizeScale);
        }
    }
    public void Emit(Vector3 pos, Vector3 dir, Quaternion rotation, float lifetimeScale = 1.0f, float sizeScale = 1.0f)
    {
        if (mSubParticleList == null)
            return;
        mTrans.rotation = rotation;
        Emit(pos, dir, lifetimeScale, sizeScale);
    }
    public float GetSubParticleSpeed(int idx)
    {
        if (mSubParticleList != null && mSubParticleList.Length > idx)
        {
            return mSubParticleList[idx].GetCurrentSpeed();
        }
        return 0;
    }
    public float GetSubParticleSpeed()
    {
        return GetSubParticleSpeed(0);
    }
    protected void Awake()
    {
        Init();
    }
    protected void Init()
    {
        ParticleSystem[] subParticles = transform.GetComponentsInChildren<ParticleSystem>();
        mSubParticleList = new SubParticle[subParticles.Length];
        mTrans = transform;
        for (int i = 0; i < subParticles.Length; i++)
        {
            mSubParticleList[i] = new SubParticle();
            ParticleSystem.EmissionModule em = subParticles[i].emission;
            em.enabled = false;
            ParticleSystem.MainModule main = subParticles[i].main;
            main.maxParticles = main.maxParticles * 50;
            mSubParticleList[i].Init(mTrans, subParticles[i]);
        }
    }
    protected class SubParticle
    {
        public Vector3 PosRelateToRoot;
        public ParticleEmitter Emitter;
        public void Init(Transform root, ParticleSystem ps)
        {
            Transform t = ps.transform;
            if (Emitter == null)
                Emitter = new ParticleEmitter();
            Emitter.Init(ps);
            Emitter.GetCurrentSpeed();
            PosRelateToRoot = root.InverseTransformPoint(t.position);
        }
        public void Emit(Vector3 rootPos, Vector3 dir, float lifetimeScale = 1.0f, float sizeScale = 1.0f)
        {
            Vector3 offset = rootPos + PosRelateToRoot;
            if (dir != Vector3.zero)
            {
                Emitter.UpdateDir(dir);
                Emitter.OverrideVelocity = true;
            }
            else
            {
                Emitter.OverrideVelocity = false;
            }
            Emitter.Emit(offset, lifetimeScale, sizeScale);
        }
        public float GetCurrentSpeed()
        {
            return Emitter.GetCurrentSpeed();
        }
    }
}

// определение макроса заменяется XXX # избежать конфликта с синтаксисом MD

  • эмиттер
using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ParticleEmitter
{
    protected ParticleSystem.EmitParams mParams;
    protected ParticleSystem mParticleSys;
    protected ParticleSystem.MinMaxCurve mLifeTimeCurve;
    protected ParticleSystem.MinMaxCurve mSizeCurve;
    protected ParticleSystem.MinMaxCurve mDelayTimeCurve;
    protected ParticleSystem.MinMaxCurve mSpeedCurve;
    protected ParticleSystem.Burst[] mBurstList;
    protected float mSizeScale = 1.0f;
    protected float mLifeTimeScale = 1.0f;
    protected Vector3 mDir;
    protected float mCurrentSpeed;
    protected bool mOverrideVelocity = false;
    protected bool mOverrideStartLifeTime = false;
    public bool OverrideVelocity
    {
        get { return mOverrideVelocity; }
        set { mOverrideVelocity = value; }
    }

    public bool OverrideStartLifeTime
    {
        get { return mOverrideStartLifeTime; }
        set { mOverrideStartLifeTime = value; }
    }
    public void UpdateDir(Vector3 endStartVector)
    {
        mOverrideVelocity = true;
        mDir = endStartVector.normalized;
    }

    public void UpdateLifeTime(ParticleSystem.MinMaxCurve lifeTime)
    {
        mOverrideStartLifeTime = true;
        mLifeTimeCurve = lifeTime;
    }

    public void UpdateLifeTimeConstant(Vector3 endStartVector)
    {
        mOverrideStartLifeTime = true;
        var speed = GetCurrentSpeed();
        var length = endStartVector.magnitude;
        var constant = length / speed;
        mLifeTimeCurve = new ParticleSystem.MinMaxCurve();
        mLifeTimeCurve.constant = constant;
    }

    public void UpdateStartSize(ParticleSystem.MinMaxCurve startSize)
    {
        mSizeCurve = startSize;
    }

    public float GetCurrentSpeed()
    {
        switch (mSpeedCurve.mode)
        {
            case ParticleSystemCurveMode.Constant:
                mCurrentSpeed = mSpeedCurve.constant;
                break;
            case ParticleSystemCurveMode.TwoConstants:
                mCurrentSpeed = Random.Range(mSpeedCurve.constantMin, mSpeedCurve.constantMax);
                break;
            case ParticleSystemCurveMode.Curve:
                mCurrentSpeed = mSpeedCurve.Evaluate(Random.value);
                break;
            case ParticleSystemCurveMode.TwoCurves:
                {
                    float t = Random.value;
                    mCurrentSpeed = Random.Range(mSpeedCurve.curveMin.Evaluate(t), mSpeedCurve.curveMax.Evaluate(t)) * mSpeedCurve.curveMultiplier;
                }
                break;
        }
        return mCurrentSpeed;
    }

    public void Init(ParticleSystem ps)
    {
        mParticleSys = ps;
        if (ps != null)
        {
            ParticleSystem.MainModule mm = ps.main;
            mm.simulationSpace = ParticleSystemSimulationSpace.World;
            mParams.startColor = mm.startColor.color;
            mParams.applyShapeToPosition = true;

            mLifeTimeCurve = mm.startLifetime;
            mSizeCurve = mm.startSize;
            mSpeedCurve = mm.startSpeed;
            mDelayTimeCurve = mm.startDelay;

            ParticleSystem.EmissionModule em = ps.emission;
            if (em.burstCount > 0)
            {
                mBurstList = new ParticleSystem.Burst[em.burstCount];
                em.GetBursts(mBurstList);
            }
        }
    }

    public void Emit(Vector3 startPos, float lifetimeScale = 1.0f, float sizeScale = 1.0f)
    {
        if (mParticleSys != null)
        {
            mParams.position = startPos;
            float delayTime = (mDelayTimeCurve.mode == ParticleSystemCurveMode.Constant ? mDelayTimeCurve.constant : mDelayTimeCurve.Evaluate(Random.value));

            if (OverrideVelocity)
            {
                mParams.velocity = mSpeedCurve.Evaluate(Random.value) * mDir;
            }
            mOverrideVelocity = false;
            if (mBurstList != null)
            {
                for (int i = 0; i < mBurstList.Length; i++)
                {
                    int count = mBurstList[i].count.mode == ParticleSystemCurveMode.Constant ? mBurstList[i].maxCount :
                        ((mBurstList[i].minCount == mBurstList[i].maxCount ? mBurstList[i].minCount :
                        Random.Range(mBurstList[i].minCount, mBurstList[i].maxCount)));

                    if (mOverrideStartLifeTime)
                    {
                        mParams.startLifetime = mLifeTimeCurve.constant;
                        mOverrideStartLifeTime = false;
                    }
                    else
                        mParams.startLifetime = (mLifeTimeCurve.mode == ParticleSystemCurveMode.Constant ? mLifeTimeCurve.constant : mLifeTimeCurve.Evaluate(Random.value)) * lifetimeScale;
                    mParams.startSize = (mSizeCurve.mode == ParticleSystemCurveMode.Constant ? mSizeCurve.constant : mSizeCurve.Evaluate(Random.value)) * sizeScale;

                    float t = delayTime + mBurstList[i].time;
                    Emit(t, 1);
                }
            }
            else
            {
                if (mOverrideStartLifeTime)
                {
                    mParams.startLifetime = mLifeTimeCurve.constant;
                    mOverrideStartLifeTime = false;
                }
                else
                    mParams.startLifetime = (mLifeTimeCurve.mode == ParticleSystemCurveMode.Constant ? mLifeTimeCurve.constant : mLifeTimeCurve.Evaluate(Random.value));
                mParams.startSize = (mSizeCurve.mode == ParticleSystemCurveMode.Constant ? mSizeCurve.constant : mSizeCurve.Evaluate(Random.value));
                Emit(delayTime, 1);
            }
        }
    }

    protected void Emit(float deltayTime, int count)
    {
        if (deltayTime > 0)
        {
            DOVirtual.DelayedCall(deltayTime, () => { mParticleSys.Emit(mParams, count); });
        }
        else
        {
            mParticleSys.Emit(mParams, count);
        }
    }
}

Новая система частиц

Здесь Insert Picture Описание

Подробнее ссылку для приглашений на новую систему частиц

Инжиниринг скачать

https://github.com/Unity-Technologies/FPSSample

Более отличный учебник

http://dingxiaowei.cn копируется в браузер, чтобы посетить

рекомендация

отblog.csdn.net/s10141303/article/details/97005756