最开始的时候,想制作沿着路劲运动的闪光箭头,由于对于粒子的应用有一些简单的了解,在制作中,首先想到是使用粒子的特性。来制作,苦于unity3D的粒子系统particleSystem没有沿路径运动的选项,遂决定自己动手,丰衣足食。
具体代码如下
<pre>
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(ParticleSystem))]
public class MyPartileFlow : MonoBehaviour
{
// 粒子系统
ParticleSystem _particleSystem;
// 粒子
ParticleSystem.Particle[] _particle;
// 粒子个数
int arrCount = 0;
// 粒子运动路径
public Transform[] target;//运动路径
// 粒子速率
public float speed = 5;
// 到中转点的距离检测
public float nearClose = 0.1f;
void Awake()
{
_particleSystem = GetComponent<ParticleSystem>();
_particleSystem.simulationSpace = ParticleSystemSimulationSpace.World;
_particle = new ParticleSystem.Particle[_particleSystem.maxParticles];
}
void Update()
{
if (target.Length != 0 && _particleSystem && _particleSystem.isPlaying)
{
arrCount = _particleSystem.GetParticles(_particle);//获取到当前激活的粒子
//Debug.Log(arrPar[0].lifetime);
for (int i = 0; i < arrCount; i++)
{
for(int j = 0; j < target.Length; ++j)
{
if (j < target.Length - 1)
{
Vector3 dir = target[j + 1].position - target[j].position;
dir = dir.normalized;
// 如果粒子刚刚被发射出来,赋予粒子指向第一个目标点的速度
if ((target[0].position - _particle[i].position).magnitude < nearClose)
_particle[i].velocity = (target[1].position - target[0].position).normalized * _particleSystem.startSpeed;
if (_particle[i].velocity.normalized == dir)
{
// 如果粒子靠近了某个目标点
if((target[j + 1].position - _particle[i].position).magnitude <= nearClose )
{
// 如果到了最后的目标点,粒子保持当前速度一直向前
if ((j + 2) >= target.Length)
continue;
// 如果没有,改变粒子的速度指向下一个目标点
dir = target[j + 2].position - target[j + 1].position;
dir = dir.normalized;
_particle[i].velocity = dir * _particle[i].velocity.magnitude;
_particle[i].position = target[j + 1].position;
}
}
}
}
}
_particleSystem.SetParticles(_particle, arrCount);//再把更新过的粒子数据设置回去
}
}
}
</pre>
在制作的过程中,原本是想用粒子的生命值,来判定粒子是否刚出生,可是在实际的使用中,发现粒子的生命值变化较为诡异,达不到想要的效果,不知是自己的使用的方式不对,还是对粒子生命的理解有偏差,如果有前辈大能,能指点一二,小生当铭感于心。