本文主要是介绍Unity 利用ParticleSystem 制作简易导弹效果。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这是利用改变粒子的位置而获得导弹效果的代码(参数声明部分略):
void Start()
{
missileArray = new ParticleSystem.Particle[Missile_MissileParticleSystem.main.maxParticles];
InvokeRepeating(nameof(OldWayMissile), 0, 0.1f);//每0.1秒运行一次
}
void OldWayMissile(){missileArrayCount = Missile_MissileParticleSystem.GetParticles(missileArray);for (var i = 0; i < missileArrayCount; i++){MN_targetDir = (targetObjectTransform.position - missileArray[i].position).normalized;//敌人的方向MN_angle = Vector2.SignedAngle(MN_targetDir, Vector2.up);if (MN_angle < 0){MN_angle = 360 + MN_angle;}missileArray[i].rotation = MN_angle;//设置导弹的朝向missileArray[i].position = Vector2.Lerp(missileArray[i].position, targetObject.transform.position, 0.1f);//设置导弹位置}Missile_MissileParticleSystem.SetParticles(missileArray, missileArrayCount);//再把更新过的导弹数据传回}
这个方法可能会出现如下问题,InvokeRepeating频率高,则导弹轨迹平滑,但是速度就会变快,低则导弹轨迹不平滑。还会出现如下问题:
所以改进这种方法:
将下面这条代码修改
missileArray[i].position = Vector2.Lerp(missileArray[i].position, targetObject.transform.position, 0.1f);//设置导弹位置
修改后的代码
missileArray[i].velocity = MN_targetDir* missileSpeed;//新的
新的方法:
void NewWayMissile(){missileArrayCount = Missile_MissileParticleSystem.GetParticles(missileArray);for (var i = 0; i < missileArrayCount; i++){MN_targetDir = (targetObjectTransform.position - missileArray[i].position).normalized;//敌人的方向MN_angle = Vector2.SignedAngle(MN_targetDir, Vector2.up);if (MN_angle < 0){MN_angle = 360 + MN_angle;}missileArray[i].rotation = MN_angle;//设置导弹的朝向missileArray[i].velocity = MN_targetDir* missileSpeed;//新的}Missile_MissileParticleSystem.SetParticles(missileArray, missileArrayCount);//再把更新过的导弹数据传回}
利用粒子的矢量速度velocity可以很好的解决导弹的飞行方向。
最后可以吧NewWayMissile方法放入Update中。
这篇关于Unity 利用ParticleSystem 制作简易导弹效果。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!