避开障碍物(Obstacle)行为
避开障碍物行为是指操控AI角色避开路上的障碍物,例如动物奔跑时,避免与树、墙碰撞。当AI角色的行进路线上发现比较近的障碍时,产生一个排斥力,是AI角色远离这个障碍物。
C#脚本代码
using UnityEngine;
namespace AI.Steering
{
public class SteeringForEvadeObstacle : Steering
{
//字段
//障碍物标记
public string obstacleTag = "obstacle";
//探头的位置
public Transform probePos;
//探头的长度
public float probeLength = 15;
//最小推力
public float minPushForce = 30;
//方法
public override Vector3 GetForce()
{
//使用探头检测前方,如果有障碍物
RaycastHit hit;
//bool b1 = Physics.Raycast(probePos.position, probePos.forward,
// out hit, probeLength);
//bool b2 = false;
//if (hit.collider != null)
//{
// b2 = hit.collider.tag == obstacleTag;
//}
if (Physics.Raycast(probePos.position, probePos.forward,
out hit, probeLength) && hit.collider.tag == obstacleTag)
{
//由障碍物向碰撞点 产生一个推力,这个推力就是操控力
expectForce = hit.point - hit.transform.position;
//操控力 如果很小 则将操控力放大
if (expectForce.magnitude < minPushForce)
{
expectForce = expectForce.normalized * minPushForce;
}
//返回操控力
return expectForce * weight;
}
//没有障碍物
return Vector3.zero;
}
}
}
测试:
- 创建一个Cube,一个Cube2作为障碍物,一个Cylinder作为目标。
- 给Cube身上加入LocomotionController脚本、SteeringForArrival和SteeringForEvadeObstacle脚本。
- Cube2标记设置为“obstacle”
- 把Cylinder拖给Cube身上的SteeringForArrival脚本。
- 运行
运行:
观察Cube的运动轨迹。