今天简单注释下PlayerShooting脚本
void Update ()
{
timer += Time.deltaTime; //结合下一句和Shoot函数中第一句,每帧+一定时间,超过一定时间间隔才可能执行Shoot
if(Input.GetButton ("Fire1") && timer >= timeBetweenBullets && Time.timeScale != 0) //Fire1按下,默认左键同时每隔一定时间才能进入一次Shoot
{
Shoot ();
}
if(timer >= timeBetweenBullets * effectsDisplayTime) //超过时间没有开火,取消开火效果,没判断支持,超过时间会执行很多次
{
DisableEffects ();
}
}
public void DisableEffects ()
{
gunLine.enabled = false; //跟据前面,使Player中LineRenderder组件停止作用
gunLight.enabled = false; //跟据前面,使Player中Light组件停止作用,合起来就是停止开枪的效果
}
void Shoot ()
{
timer = 0f; //重置timer
gunAudio.Play (); //Player中AudioSource中的声音源
gunLight.enabled = true; //跟据前面,使Player中Light组件作用,枪发光
gunParticles.Stop ();
gunParticles.Play (); //枪的上次粒子效果停止和本次启动,和Player上ParticleSystem组件相关
gunLine.enabled = true; //跟据前面,使Player中LineRenderder组件作用,枪有射线
gunLine.SetPosition (0, transform.position); //设置gunLine的一端
shootRay.origin = transform.position; //设定光束Ray的起始点
shootRay.direction = transform.forward; //设定光束Ray的方向,player正向
if(Physics.Raycast (shootRay, out shootHit, range, shootableMask)) //计算shootRay和shootable层(shootableMask掩码下)的交点,在range限定的长度内,返回第一个交点给shootHit
{
EnemyHealth enemyHealth = shootHit.collider.GetComponent <EnemyHealth> (); //令shootHit的碰撞体也就是第一击中的物体上脚本组件EnemyHealth赋值给enemyHealth
if(enemyHealth != null) //成功取得正确击中物体的脚本的话
{
enemyHealth.TakeDamage (damagePerShot, shootHit.point); //执行EnemyHealth脚本中对应函数
}
gunLine.SetPosition (1, shootHit.point); //设定gunLine的另一点为Ray第一命中的点,两点之间的线
}
else
{
gunLine.SetPosition (1, shootRay.origin + shootRay.direction * range); //否则设置gunLine另一端在shootRay方向上距离起始点Range长度的位置上,就是shootRay 100长度的LineRenderer表现
}
}