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

时间:2017-09-24 18:13:16

标签: unity3d unity5

我有点问题。在我的游戏中,我需要我的整个地图能够向上或向下扩展,这意味着粒子系统也可以。有些是本地的,有些是世界空间。是否有任何方法可以使相同的系统缩放10倍,大小看起来与原始大小完全相同但是大小的10倍?这意味着速度,重力,阻尼等也会缩放

2 个答案:

答案 0 :(得分:0)

创建一个脚本并将其放在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类型类中,并在需要时检索它
  2. 将唤醒时的原始值缓存到某些浮点数中,然后执行originalStartSize *= sizeModifier
  3. 制作一些可以调用的函数ResizeParticles(float modifier),而不是在唤醒时调整大小。
  4. 这些改进使您可以随时调用ResizeParticles()并将'修饰符'应用于其原始大小(在清醒时可以从组件本身复制)

答案 1 :(得分:0)

根据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); }
    }
}