- 问题描述
- 一、检测一个物体
- 二、检测多个物体
我们通常要检测主体周围是否有其他物体,就是主体的视线内是否能看到周围的物体。如果前方有障碍物则判断障碍物的高低,高于射线的障碍物会遮住主体的视线,而矮的障碍物就不会遮挡。如果要实现这种场景,我们就要用到unity种的射线检测。
一、检测一个物体创建射线,并显示;
Ray ray = new Ray(transform .position , transform.forward);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, Mathf.Infinity))
{
if (hit.collider.gameObject.CompareTag("Obstacles"))
{
Debug.Log("检测到物体");
}
}
float distance = 0f;
if (hit.collider == null)
{
distance = 100f;
}
else
{
distance = Vector3.Distance(transform.position, hit.collider.gameObject.transform.position);
}
Debug.DrawRay(ray.origin, transform.forward*distance, Color.red);
主体前面没有物体,射线无限延长
射线前方有物体,则投射到物体上:
障碍物后方的物体无法检测到,而前方的物体可以检测到:
如果周围有很多需要检测到的物体,就像是人的眼睛一样,视野范围内的物体都能看到,并被检测到。所以我们就用多条射线组成的扇形面来检测,即扇形射线检测。
代码如下:
void Update()
{
if (Look(this.gameObject) == true)
{
Debug.Log("检测到物体");
}
}
//放射线检测
private bool Look(GameObject controller)
{
float lookAngle = 90f;
float lookAccurate = 70f;
//一条向前的射线
if (LookAround(controller, Quaternion.identity, Color.green))
return true;
//多一个精确度就多两条对称的射线,每条射线夹角是总角度除与精度
float subAngle = (lookAngle / 2) / lookAccurate;
for (int i = 0; i < lookAccurate; i++)
{
if (LookAround(controller, Quaternion.Euler(0, -1 * subAngle * (i + 1), 0), Color.green)
|| LookAround(controller, Quaternion.Euler(0, subAngle * (i + 1), 0), Color.green))
return true;
}
return false;
}
//射出射线检测是否有Player
static public bool LookAround(GameObject attacker, Quaternion eulerAnger, Color DebugColor)
{
float distance;
RaycastHit hit;
if (Physics.Raycast(attacker.transform.position, eulerAnger * attacker.transform.forward, out hit, 100) && hit.collider.CompareTag("Player"))
{
//controller.chaseTarget = hit.transform;
return true;
}
if (hit.collider == null)
{
distance = 100f;
}
else
{
distance = Vector3.Distance(attacker.transform.position, hit.collider.gameObject.transform.position);
}
Debug.DrawRay(attacker.transform.position, eulerAnger * attacker.transform.forward.normalized * distance, DebugColor);
return false;
}
}
效果如下:
[以上部分参考网络]
·
·
·
·
·
·
·
·
·
·
流水不争先,争的是滔滔不绝。



