Unity Shuriken:让粒子系统完全缩放

Unity Shuriken: Make Particle System Completely Scale

我有点问题。在我的游戏中,我需要我的整个地图能够按比例放大或缩小,这意味着粒子系统也是如此。有些是本地的,有些是世界的 space。有没有什么办法可以让同一个系统放大 10 倍,看起来与原来的系统完全一样,但尺寸扩大了 10 倍?这意味着速度、重力、阻尼等也会缩放

制作脚本并将其放置在您的 ParticleSystem 游戏对象上。

class ParticleSystemScaler : Monobehaviour
{
    ParticleSystem _ps;
    public float sizeModifier = 1.0f;

    void Awake()
    {
        _ps = GetComponent<ParticleSystem>();
        //For each property you want to scale, just multiply it by the size modifier.
        _ps.startSize *= sizeModifier;
    }
}

您可以通过几种方式改进它..

  1. 将 sizeModifier 存储在某些 GameManager 类型 class 中,并在需要时检索它
  2. 将唤醒时的原始值缓存到一些浮点数中,然后执行originalStartSize *= sizeModifier
  3. 创建一些可以调用的函数 ResizeParticles(float modifier),而不是在唤醒时调整大小。

这些改进将使您能够随时调用 ResizeParticles() 并将 'modifier' 应用到它们的原始大小(这将在唤醒时从组件本身复制)

根据 Bejasc 的回答,我做了一个更全面和自动化的版本,但是肯定还有一些参数我还没有添加

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ParticleSystemScaler : MonoBehaviour
{
    private ParticleSystem ThisSystem;
    private ParticleSystem.MainModule ThisMain;
    private ParticleSystem.NoiseModule ThisNoise;
    private ParticleSystem.LimitVelocityOverLifetimeModule ThisLimitVelocity;

    private float CurrentScale;

    private float InitialGravity;
    private float InitialNoiseStrength;
    private float InitialNoiseFrequency;
    private float InitialMaxVelocity;

    private void Start()
    {
        Initialise();
        ResizeSystem(transform.lossyScale.x);
    }

    private void Initialise()
    {
        ThisSystem = GetComponent<ParticleSystem>();

        if (ThisSystem)
        {
            ThisMain = ThisSystem.main;
            ThisNoise = ThisSystem.noise;
            ThisLimitVelocity = ThisSystem.limitVelocityOverLifetime;

            InitialGravity = ThisMain.gravityModifierMultiplier;
            InitialNoiseStrength = ThisNoise.strengthMultiplier;
            InitialNoiseFrequency = ThisNoise.frequency;
            InitialMaxVelocity = ThisLimitVelocity.limitMultiplier;
        }
    }

    private void ResizeSystem(float NewScale)
    {
        CurrentScale = NewScale;

        if (ThisSystem)
        {
            ThisMain.gravityModifierMultiplier = InitialGravity * NewScale;
            if (ThisMain.simulationSpace == ParticleSystemSimulationSpace.World)
            {
                ThisNoise.strengthMultiplier = InitialNoiseStrength * NewScale;
                ThisNoise.frequency = InitialNoiseFrequency / NewScale;
                ThisLimitVelocity.limitMultiplier = InitialMaxVelocity * NewScale;
            }
        }
    }

    private void Update()
    {
        if (transform.lossyScale.x != CurrentScale) { ResizeSystem(transform.lossyScale.x); }
    }
}