我们要在敌人跟随玩家代码后面写上检测玩家进入一定范围内的时候敌人自动开火。
我们声明一个 GameObject对象为bullet,声明一个Transform对象为bulletstartpoint
检测机制:通过小于某个夹角值进行判断
首先在敌人里设置一个Bulletstartpoint,将其放到合适的位置
如下图所示:

在Player组件里设置一个Enemyfirecheckpoint空对象,调整其到合适的位置
我们需要在Ryun_PlayerController里写进这个transform;
新建一个float类型的夹角Angle
在下面新建一个FireControler函数,在里面写入敌人开火的控制
设置一个局部变量var direction,返回向量方向
var direction = (PlayerController.Enemyfirecheckpoint.position - bulletstartpoint.position).normalized;
//它返回向量方向,保证结果向量的大小为 1,(它保留方向信息但丢失大小信息)。小写normalize 只是一个属性,只能get不能set
private void FireController() {
var direction = (PlayerController.Enemyfirecheckpoint.position - bulletstartpoint.position).normalized;
print(Vector3.Angle(direction, bulletstartpoint.position));//将角度输出,方便观测
if (Vector3.Angle(direction, bulletstartpoint.forward) <minAnlge)
{
if (!isFire)//开始设置isFire为false
{
StartCoroutine("Fire",direction);//调用实参
isFire = true;
}
}
else
{
if (isFire)
{
StopCoroutine("Fire");
isFire = false;
}
}
}
//利用协程函数写一个生成新子弹以及发射子弹的代码:
IEnumerator Fire(Vector3 direction)//形参
{
while (isFire)
{
Quaternion rotation = Quaternion.LookRotation(direction);//将生成一个四元数表示的三维朝向
GameObject newbullet = Instantiate(bullet, bulletstartpoint.position, bulletstartpoint.rotation);
newbullet.GetComponent<Rigidbody>().velocity = newbullet.transform.forward * bulletstartspeed;
yield return new WaitForSeconds(fireinterval);//让其在 public float fireinterval = 0.2f间隔后循环执行。
}
}