我有点问题。在我的游戏中,我需要我的整个地图能够向上或向下扩展,这意味着粒子系统也可以。有些是本地的,有些是世界空间。是否有任何方法可以使相同的系统缩放10倍,大小看起来与原始大小完全相同但是大小的10倍?这意味着速度,重力,阻尼等也会缩放
答案 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;
}
}
你可以通过几种方式改善这一点。
GameManager
类型类中,并在需要时检索它originalStartSize *= sizeModifier
ResizeParticles(float modifier)
,而不是在唤醒时调整大小。这些改进使您可以随时调用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); }
}
}