适用场景:
无人机向前飞行同时探测,在探测区域内检测到了带有指定标记的敌方,则向敌方发射射线
实现思想:
结合射线Ray功能,判断后发射
两个关键点需要注意下:
1.传入DetectEnemy的对象才是具有探测能力的,也就是主动发射射线的一方
2.本程序中将检测的敌人的layer设置为enemy_thing,可根据实际情况修改也可删除
代码如下:
public float EyeViewDistance = 500; //视野距离
public float viewAngle = 500f; //视野角度
private Collider[] SpottedEnemies; //附近的敌人
// 传入的detector_uav就是具有探测功能的对象
void DetectEnemy(GameObject detector_uav) //探测敌人
{
//OverlapSphere内的敌人
// 设定敌人有指定的layer:enemy_thing,只有碰到该layer才会发射射线
SpottedEnemies = Physics.OverlapSphere(detector_uav.transform.position, EyeViewDistance, LayerMask.GetMask("enemy_thing"));
for (int i = 0; i < SpottedEnemies.Length; i++) //检测每一个敌人是否在视野区中
{
Vector3 EnemyPosition = SpottedEnemies[i].transform.position; //敌人的位置
if (Vector3.Angle(detector_uav.transform.forward, EnemyPosition - detector_uav.transform.position) <= viewAngle / 2) //这个敌人是否在视野内
{
//如果在视野内
RaycastHit info = new RaycastHit();
// 设定敌人有指定的layer:enemy_thing,只有碰到该layer才会发射射线
int layermask = LayerMask.GetMask("enemy_thing"); //指定射线碰撞的对象
Physics.Raycast(detector_uav.transform.position, EnemyPosition - detector_uav.transform.position, out info, EyeViewDistance, layermask); //向敌人位置发射射线
if (info.collider == SpottedEnemies[i]) //如果途中无其他障碍物,那么射线就会碰撞到敌人
{
Debug.DrawRay(detector_uav.transform.position, EnemyPosition - detector_uav.transform.position, Color.yellow); //玩家位置到敌人位置的向量
DiscoveredEnemy(SpottedEnemies[i]);
}
}
}
}
void DiscoveredEnemy(Collider Enemy) //发现敌人
{
//Do something
Debug.Log("发现敌军:" + Enemy.gameObject.name);
/*
可增加后序发现敌军的相关操作
*/
}