AI学习(二)基础类---------个体操控(1)

个体AI角色的操控行为de实现


2.1    Seek 靠近

[csharp] view plain copy
print ?
  1. using System.Collections;  
  2. using System.Collections.Generic;  
  3. using UnityEngine;  
  4.   
  5. /*靠近 
  6.  *指定一个目标位置,根据当前的运动速度向量,返回一个操控AI角色到达该目标位置的“操控力” 
  7.  * 使AI角色自动向该位置移动 
  8.  */  
  9.   
  10. public class SteeringForSeek : Steering {  
  11.   
  12.     //目标物体  
  13.     public GameObject target;  
  14.     //预期速度  
  15.     private Vector3 desiredVelocity;  
  16.     //获得被操控AI角色,以便查询这个AI角色的最大速度等信息  
  17.     private Vehicle m_vehicle;  
  18.     //最大速度  
  19.     private float maxSpeed;  
  20.     //是否仅在二维平面上运动  
  21.     private bool isPlanar;  
  22.   
  23.     // Use this for initialization  
  24.     void Start () {  
  25.         //获取AI角色,并读取属性  
  26.         m_vehicle = GetComponent<Vehicle>();  
  27.         maxSpeed = m_vehicle.maxSpeed;  
  28.         isPlanar = m_vehicle.isPlanar;  
  29.     }  
  30.       
  31.     //计算操控向量(操控力)  
  32.     public override Vector3 Force()  
  33.     {  
  34.         //计算预期速度  
  35.         desiredVelocity = (target.transform.position - transform.position).normalized * maxSpeed;  
  36.         if (isPlanar)  
  37.             desiredVelocity.y = 0;  
  38.   
  39.         //返回操控向量,即预期速度与当前速度的差  
  40.         return (desiredVelocity - m_vehicle.velocity);  
  41.     }  
  42.     // Update is called once per frame  
  43.     void Update () {  
  44.           
  45.     }  
  46. }  
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/*靠近
 *指定一个目标位置,根据当前的运动速度向量,返回一个操控AI角色到达该目标位置的“操控力”
 * 使AI角色自动向该位置移动
 */

public class SteeringForSeek : Steering {

    //目标物体
    public GameObject target;
    //预期速度
    private Vector3 desiredVelocity;
    //获得被操控AI角色,以便查询这个AI角色的最大速度等信息
    private Vehicle m_vehicle;
    //最大速度
    private float maxSpeed;
    //是否仅在二维平面上运动
    private bool isPlanar;

	// Use this for initialization
	void Start () {
        //获取AI角色,并读取属性
        m_vehicle = GetComponent<Vehicle>();
        maxSpeed = m_vehicle.maxSpeed;
        isPlanar = m_vehicle.isPlanar;
    }
	
    //计算操控向量(操控力)
    public override Vector3 Force()
    {
        //计算预期速度
        desiredVelocity = (target.transform.position - transform.position).normalized * maxSpeed;
        if (isPlanar)
            desiredVelocity.y = 0;

        //返回操控向量,即预期速度与当前速度的差
        return (desiredVelocity - m_vehicle.velocity);
    }
	// Update is called once per frame
	void Update () {
		
	}
}

2.2    Flee 离开

[csharp] view plain copy
print ?
  1. using System.Collections;  
  2. using System.Collections.Generic;  
  3. using UnityEngine;  
  4.   
  5. /*离开 
  6.  *指定一个目标位置,根据当前的运动速度向量,返回一个操控AI角色离开该目标位置的“操控力” 
  7.  * 与靠近行为相反,唯一区别是DesiredVelocity具有相反的方向,使AI角色自动向位置相反方向移动 
  8.  */  
  9.   
  10. public class SteeringForFlee : Steering {  
  11.   
  12.     public GameObject target;  
  13.     //设置使AI角色意识到危险并开始逃跑的范围  
  14.     public float fearDistance = 20;  
  15.     private Vector3 desiredVelocity;  
  16.     private Vehicle m_vehicle;  
  17.     private float maxSpeed;  
  18.   
  19.     // Use this for initialization  
  20.     void Start () {  
  21.         m_vehicle = GetComponent<Vehicle>();  
  22.         maxSpeed = m_vehicle.maxSpeed;  
  23.     }  
  24.   
  25.     public override Vector3 Force()  
  26.     {  
  27.         Vector3 tmpPos = new Vector3(transform.position.x, 0, transform.position.z);  
  28.         Vector3 tmpTargetPos = new Vector3(target.transform.position.x, 0, target.transform.position.z);  
  29.         //如果AI角色与目标距离大于逃跑距离,那么返回0向量  
  30.         if (Vector3.Distance(tmpPos, tmpTargetPos) > fearDistance)  
  31.             return new Vector3(0, 0, 0);  
  32.         //如果AI角色与目标距离小于逃跑距离,那么计算逃跑所需的操控向量  
  33.         desiredVelocity = (transform.position - target.transform.position).normalized * maxSpeed;  
  34.         return (desiredVelocity - m_vehicle.velocity);  
  35.     }  
  36.   
  37.     // Update is called once per frame  
  38.     void Update () {  
  39.           
  40.     }  
  41. }  
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/*离开
 *指定一个目标位置,根据当前的运动速度向量,返回一个操控AI角色离开该目标位置的“操控力”
 * 与靠近行为相反,唯一区别是DesiredVelocity具有相反的方向,使AI角色自动向位置相反方向移动
 */

public class SteeringForFlee : Steering {

    public GameObject target;
    //设置使AI角色意识到危险并开始逃跑的范围
    public float fearDistance = 20;
    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 tmpPos = new Vector3(transform.position.x, 0, transform.position.z);
        Vector3 tmpTargetPos = new Vector3(target.transform.position.x, 0, target.transform.position.z);
        //如果AI角色与目标距离大于逃跑距离,那么返回0向量
        if (Vector3.Distance(tmpPos, tmpTargetPos) > fearDistance)
            return new Vector3(0, 0, 0);
        //如果AI角色与目标距离小于逃跑距离,那么计算逃跑所需的操控向量
        desiredVelocity = (transform.position - target.transform.position).normalized * maxSpeed;
        return (desiredVelocity - m_vehicle.velocity);
    }

    // Update is called once per frame
    void Update () {
		
	}
}

2.3    Arrival 抵达

[csharp] view plain copy
print ?
  1. using System.Collections;  
  2. using System.Collections.Generic;  
  3. using UnityEngine;  
  4.   
  5. /*抵达 
  6.  *AI角色能够减速并停到目标位置,避免冲过目标,前段和靠近的行为状态是一样的,通过设置停止半径,开始逐渐减小预期速度,直到减小至0 
  7.  * 使利用Itween插件实现的也不错 
  8.  */  
  9.   
  10. public class SteeringForArrive : Steering {  
  11.   
  12.     public bool isPlanar = true;  
  13.     public float arrivalDistance = 0.3f;  
  14.     public float characterRadius = 1.2f;  
  15.   
  16.     //当与目标小于这个距离时,开始减速  
  17.     public float slowDownDistance;  
  18.     public GameObject target;  
  19.     private Vector3 desiredVelocity;  
  20.     private Vehicle m_vehicle;  
  21.     private float maxSpeed;  
  22.      
  23.     // Use this for initialization  
  24.     void Start () {  
  25.         m_vehicle = GetComponent<Vehicle>();  
  26.         maxSpeed = m_vehicle.maxSpeed;  
  27.         isPlanar = m_vehicle.isPlanar;  
  28.     }  
  29.   
  30.     public override Vector3 Force()  
  31.     {  
  32.         //计算AI角色与目标之间的距离  
  33.         Vector3 toTarget = target.transform.position - transform.position;  
  34.         //预期速度  
  35.         Vector3 desiredVelocity;  
  36.         //返回的操控向量  
  37.         Vector3 returnForce;  
  38.   
  39.         if (isPlanar)  
  40.             toTarget.y = 0;  
  41.         float distance = toTarget.magnitude;  
  42.         //如果与目标之间的距离大于所设置的减速半径  
  43.         if (distance > slowDownDistance)  
  44.         {  
  45.             //预期速度时AI角色与目标点之间的距离  
  46.             desiredVelocity = toTarget.normalized * maxSpeed;  
  47.             //返回与预期速度与当前速度的差  
  48.             returnForce = desiredVelocity - m_vehicle.velocity;  
  49.         }  
  50.         else  
  51.         {  
  52.             //计算预期速度,并返回预期速度与当前速度的差  
  53.             desiredVelocity = toTarget - m_vehicle.velocity;  
  54.             //返回预期速度与当前速度的差  
  55.             returnForce = desiredVelocity - m_vehicle.velocity;  
  56.         }  
  57.         return returnForce;  
  58.     }  
  59.   
  60.     private void OnDrawGizmos()  
  61.     {  
  62.         //在目标周围画白色线框球,显示出减速范围  
  63.         Gizmos.DrawWireSphere(target.transform.position, slowDownDistance);  
  64.     }  
  65.     // Update is called once per frame  
  66.     void Update () {  
  67.           
  68.     }  
  69. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值