【Unity】【C#】《U3d人工智能编程精粹》学习心得--------操纵行为--追逐

增加Steering的派生类

----SteeringForPursuit类    追逐行为类

追逐行为解读图:

本案例的条件判断,通过判断

①物体朝向与目标朝向夹角的角度 ----------图中红色角度

②物体朝向与物体到目标当前位置向量所成的角度  ----------图中蓝色角度      

来让物体做出两种追逐行为:

①物体按靠近行为的方式追逐目标

②物体按预测目标移动位置来追逐目标

预测追逐行为解读图:

案例中:

判断条件①限制了物体朝向与目标朝向夹角少于180度---------即:控制目标与物体面向移动时不进行预测追逐

判断条件②限制了物体朝向以及目标在物体的相对方向的夹角少于90度-------即:目标不能处于物体身后

以上条件 使得目标只能在物体朝向前方的范围,以及物体与目标朝向者同一块移动区域。

目标应处于条纹区域才能触发预测追逐行为。

预测时间= 两目标距离矢量的长度/(物体最大速度+目标当前速度)   -----------当前还不知道是什么理论.. 案例中的公式

预测速度 = (目标位置矢量+目标速度矢量*预测时间 - 物体当前位置矢量)的标准化运算 *物体运动的最大速度

   预测速度是通过  计算出预测的目标运动后的位置,作为最终目标位置,减去物体位置向量,求出新的速度方向

通过最新的速度方向减去物体当前速度方向矢量,获得实际的操控力向量。

案例代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SteeringForPursuit : Steering {
    public GameObject target;
    private Vector3 desiredVelocity;
    private Vehicle m_vehicle;
    private float maxSpeed;

	// Use this for initialization
	void Start () {
        m_vehicle = GetComponent<Vehicle>();
        maxSpeed = m_vehicle.maxSpeed;
	}

    public override Vector3 Force()
    {
        Vector3 toTarget = target.transform.position - transform.position;

        float relativeDirection = Vector3.Dot(transform.forward, target.transform.forward);
        Debug.Log("relativeDirection:" + relativeDirection);
        //物体与目标朝向所成夹角的度数的范围的
        //以及物体朝向与 物体与目标距离所成向量的夹角的度数范围
        //来作为物体追逐目标时候是采取预测追逐还是靠近追逐的判断条件
        if((Vector3.Dot(transform.forward,toTarget)>0)&&relativeDirection<-0.95f)
        {
            desiredVelocity = (target.transform.position - transform.position).normalized * maxSpeed;
            return (desiredVelocity - m_vehicle.velocity);

        }

        //计算预测时间
        float lookaheadTime = toTarget.magnitude / (maxSpeed + target.GetComponent<Vehicle>().velocity.magnitude);

        //计算预测速度
        desiredVelocity = (target.transform.position + target.GetComponent<Vehicle>().velocity * lookaheadTime - transform.position).normalized * maxSpeed;

        //返回操控力向量
        return (desiredVelocity - m_vehicle.velocity);
    }
}

参考书籍:《unity3d人工智能编程精粹》 王洪源等著

猜你喜欢

转载自blog.csdn.net/Terrell21/article/details/82417110