说明:
在Unity对模型进行缩放的时候,难免会涉及到对存在粒子特效的模型进行缩放,然后当直接修改粒子特效Scale时,并能对粒子特效进行有效的缩放,这里介绍一种,通过修改粒子系统部分可修改参数进行缩放的方式。
代码如下所示:
修改粒子特效
using UnityEngine;
using System.Collections;
/// <summary>
/// **********BruceXu*******16.11.17*********
/// </summary>
public class ParticlesSize : MonoBehaviour {
static ParticleSystem[] particles;
static float[] OldStartSize;
static float[] OldStartSpeed;
static float[] OldStartRotation;
static float[] OldgravityModifier;
static int particlesLength;
Use this for initialization
void Start()
{
particles=GetComponentsInChildren<ParticleSystem>(true);
particlesLength = particles.Length;
if (particlesLength == 0)
{
return;
}
InitParticlySystem();
}
/// <summary>
/// 初始化获取所有粒子
/// </summary>
void InitParticlySystem()
{
OldStartSize = new float[particlesLength];
OldStartSpeed = new float[particlesLength];
OldStartRotation = new float[particlesLength];
OldgravityModifier = new float[particlesLength];
for (int idx = 0; idx < particlesLength; idx++)
{
var particle = particles[idx];
if (particle == null) continue;
OldStartSize[idx] = particle.startSize;
OldStartSpeed[idx] = particle.startSpeed;
OldStartRotation[idx] = particle.startRotation;
OldgravityModifier[idx] = particle.gravityModifier;
}
}
/// <summary>
/// 缩放粒子
/// </summary>
/// <param name="scale">绽放系数</param>
public static void ScaleParticleSystem(float scale)
{
for (int idx = 0; idx < particlesLength; idx++)
{
var particle = particles[idx];
if(particle==null) continue;
particle.startSize = scale * OldStartSize[idx];
particle.startSpeed = scale * OldStartSpeed[idx];
particle.startRotation = scale * OldStartRotation[idx];
particle.gravityModifier = scale * OldgravityModifier[idx];
}
}
}
测试脚本:
using UnityEngine; using System.Collections; public class Test_scale : GestureControl { //实时大小 Vector3 RealScale = new Vector3(1f, 1f, 1f); //原始大小 float InitialScale = 0; //缩放速度 public float ScaleSpeed = 0.1f; //缩放比例 public float MaxScale = 2.5f; public float MinScale = 0.5f; void Start() { //获取物体最原始大小 InitialScale = this.transform.localScale.x; if (GetComponentInChildren<ParticlesSize>() == null) { gameObject.AddComponent<ParticlesSize>(); } } void Update() { if (Input.GetKeyDown(KeyCode.A)) { if (RealScale.x < InitialScale * MaxScale) { this.transform.localScale += this.transform.localScale * ScaleSpeed; ParticlesSize.ScaleParticleSystem(this.transform.localScale.x / InitialScale); } } if (Input.GetKeyDown(KeyCode.D)) { if (RealScale.x > InitialScale * MinScale) { this.transform.localScale -= this.transform.localScale * ScaleSpeed; ParticlesSize.ScaleParticleSystem(this.transform.localScale.x / InitialScale); } } }
测试效果如下:
}