说明:
在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);
}
}
}
测试效果如下:
}