public float speed = 20.0f;
public float mass = 5.0f;
public float force = 50.0f;
public float minimumDistToAvoid = 20.0f;
private float curSpeed;
private Vector3 targetPoint;
// Use this for initialization
void Start () {
targetPoint = Vector3.zero;
mass = 5.0f;
}
在Update方法中,我们基于AvoidObstacles方法返回的方向向量更新agent实体的位置并对其进行旋转。我们在update方法中所做的第一件事就是获取鼠标点击的位置,以移动我们的AI实体,我们向它正在观察的方向发出一条射线,然后获取这条射线
与地平面的交点,作为目标位置,一旦获取到了目标位置向量,就可以用目标位置向量减去当前位置的向量来计算出目标向量。最后调用AvoidObstacles方法,并将这个目标向量作为参数传入。 void Update () {
RaycastHit hit;
var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Input.GetMouseButtonDown(0) && Physics.Raycast(ray,out hit,100.0f))
{
targetPoint = hit.point;
}
Vector3 dir = targetPoint - transform.position;
dir.Normalize();
AvoidObstacles(ref dir);
if (Vector3.Distance(targetPoint,transform.position) <3.0f)
{
return;
}
curSpeed = speed * Time.deltaTime;
var rot = Quaternion.LookRotation(dir);
transform.rotation = Quaternion.Slerp(transform.rotation, rot, 5.0f * Time.deltaTime);
transform.position += transform.forward * curSpeed;
}
接着在Update方法中,在避开障碍物之后,我们使用这个新的方向对AI实体进行旋转并根据速度值更新位置。
public void AvoidObstacles(ref Vector3 dir)
{
RaycastHit hit;
int layerMask = 1 << 8;
if (Physics.Raycast(transform.position,transform.forward,out hit, minimumDistToAvoid, layerMask))
{
Vector3 hitNormal = hit.normal;
hitNormal.y = 0;
dir = transform.forward + hitNormal * force;
}
}