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;
}
}
您可以通过几种方式改进它..
- 将 sizeModifier 存储在某些
GameManager
类型 class 中,并在需要时检索它
- 将唤醒时的原始值缓存到一些浮点数中,然后执行
originalStartSize *= sizeModifier
- 创建一些可以调用的函数
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); }
}
}
我有点问题。在我的游戏中,我需要我的整个地图能够按比例放大或缩小,这意味着粒子系统也是如此。有些是本地的,有些是世界的 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;
}
}
您可以通过几种方式改进它..
- 将 sizeModifier 存储在某些
GameManager
类型 class 中,并在需要时检索它 - 将唤醒时的原始值缓存到一些浮点数中,然后执行
originalStartSize *= sizeModifier
- 创建一些可以调用的函数
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); }
}
}