Unity 使用物理射线(Physics.Raycast),实现扇形区域碰撞检测三种方法(借鉴大神,仅作为笔记用)

时间:2019-11-01 21:26:33   收藏:0   阅读:245

Unity 使用物理射线(Physics.Raycast),实现扇形(Fan-Shaped)区域碰撞检测。
参考之前的制作简单AI: Unity 有限状态机(Finite State Machine)的理解 与 实现简单的可插拔(Pluggable)AI脚本对象。
源码:GentleTank/PluggableAI/Scripts/Decision/LookDecision.cs

方法一:

实现原理:(lookAngle / 2) / lookAccurte

  很简单,就是射多几条角度平均的射线。可以设置角度,精度(射线数量),来调节扇形区域的检测。每条射线夹角是总夹角处于2,再除于精度。
  

1. 默认是射出一条向前的射线,精度为0。

技术分享图片

 

 

2. 设置角度为90,精度为1,就会多出两条相对正前方45度的射线。

技术分享图片

 

 

3.设置精度为2。

技术分享图片

 

 

实现代码

//
// LookDecision
//


//放射线检测
private bool Look(StateController controller)
{
var defaultStats = controller.defaultStats;

//一条向前的射线
if (LookAround(controller, Quaternion.identity, Color.green))
return true;

//多一个精确度就多两条对称的射线,每条射线夹角是总角度除与精度
float subAngle = (defaultStats.lookAngle / 2) / defaultStats.lookAccurate;
for (int i = 0; i < defaultStats.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(StateController controller, Quaternion eulerAnger,Color DebugColor)
{
Debug.DrawRay(controller.eyes.position, eulerAnger * controller.eyes.forward.normalized * controller.defaultStats.lookRange, DebugColor);

RaycastHit hit;
if (Physics.Raycast(controller.eyes.position, eulerAnger * controller.eyes.forward, out hit, controller.defaultStats.lookRange) && hit.collider.CompareTag("Player"))
{
controller.chaseTarget = hit.transform;
return true;
}
return false;
}

最终效果

查找角度:90、精度:6,追杀角度15、精度2。

技术分享图片

 

 

原文:https://www.cnblogs.com/Damon-3707/p/11779192.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!