添加重力并设置粒子与游戏地面的碰撞
设置好粒子系统基本参数后添加trigger组件
为玩家物体添加碰撞并移至粒子系统中,设置Enter的时候调用函数
之前试了使用粒子系统自带的kill来消除粒子,但是总会出现金币数与粒子数不统一的情况,所以应该把消除粒子的逻辑放在代码里实现
新建一个CoinTrigger脚本,挂载到粒子系统上
public class CoinTrigger : MonoBehaviour
{
//获取玩家对象
public GameObject player;
ParticleSystem ps;
//新建粒子数组,用于接收碰撞的粒子
List<ParticleSystem.Particle> enter = new List<ParticleSystem.Particle>();
void Start()
{
//调用粒子系统
ps = GetComponent<ParticleSystem>();
}
public void OnParticleTrigger()
{
int numEnter = ps.GetTriggerParticles(ParticleSystemTriggerEventType.Enter,enter);
//遍历碰撞的所有粒子
for (int i = 0; i < numEnter; i++)
{
GetCoin();
ParticleSystem.Particle p = enter[i];
//设置粒子剩余生命周期为0
p.remainingLifetime = 0f;
enter[i] = p;
}
ps.SetTriggerParticles(ParticleSystemTriggerEventType.Enter, enter);
}
public void GetCoin()
{
AudioManager.CoinAudioClip();
player.GetComponent<PlayerData>().Coin++;
}
}
总体思路是用unity的GetTriggerParticles获取碰撞的粒子,遍历所有触发碰撞的粒子并修改粒子的剩余生命周期,最后用SetTriggerParticles将修改后的粒子还给粒子系统
获取金币的逻辑放在for循环中执行,保证每一次碰撞都能触发拾取金币的逻辑
运行游戏,成功拾取金币,数量一致