Unity关于AI视野范围

2017-03-06  本文已影响0人  UnityLin

、、、
using UnityEngine;
using System.Collections;
public class AIBehaver : MonoBehaviour
{
//视野区域
public float HorSight = 120f;
public float VerSight = 60f;

//视野距离
public float sightDis = 100f;
//目标点
Transform target;

//视野方向
Vector3 leftDir,rightDir,upDir,downDir;

//射线
Ray ray;


void Start()
{
    target = GameObject.Find ("Player").transform;
}

void Update()
{
    Vector3 tempForward = transform.forward;


    //此处是计算相对于this的左右区域,必须用transform.up 而不能用vector3.up

    //自身为中心,向左旋转视野范围一半
    Quaternion left = Quaternion.AngleAxis(-HorSight/2, transform.up);
    //自身为中心,向右旋转视野范围一半
    Quaternion right =Quaternion.AngleAxis(HorSight / 2, transform.up);
    //自身为中心,向上旋转视野范围一半
    Quaternion up = Quaternion.AngleAxis(-VerSight / 2, transform.right);
    //自身为中心,向下旋转视野范围一半
    Quaternion down = Quaternion.AngleAxis(VerSight / 2, transform.right);

    //左边视野方向
    leftDir = left * tempForward;
    //右边视野方向
    rightDir = right * tempForward;
    //上视野方向
    upDir = up * tempForward;
    //下视野方向
    downDir = down * tempForward;

    #region 测试
    //左,蓝色
    Debug.DrawLine(transform.position, transform.position + leftDir * sightDis, Color.blue);
    //右,红色
    Debug.DrawLine(transform.position, transform.position + rightDir * sightDis, Color.red);
    //上,白色
    Debug.DrawLine(transform.position, transform.position + upDir * sightDis, Color.white);
    //下,绿色
    Debug.DrawLine(transform.position, transform.position + downDir * sightDis, Color.green);


    #endregion

    //进入视野距离的时候调用
    if (Vector3.Distance(transform.position,target.position) < sightDis) {

        ComputerSight();
    }
}





void ComputerSight()
{
    Vector3 dir = target.transform.position - transform.position; //求出this 到目标点的方向

    //根据目标点的方向,求出目标点在水平、竖直方向上的投影
    Vector3 targetHorPos = new Vector3(dir.x,leftDir.y, dir.z);//求水平方向投影
    Vector3 targetVerPos = new Vector3(upDir.x, dir.y, dir.z);//求竖直方向投影

    //叉乘
    Vector3 leftCross = Vector3.Cross(targetHorPos,leftDir);
    Vector3 rightCross = Vector3.Cross (targetHorPos,rightDir);

    Vector3 upCross = Vector3.Cross (targetVerPos, upDir);
    Vector3 downCross = Vector3.Cross (targetVerPos, downDir);


    if (dir.z > 0)
    {
        //判断,  因为使用的是目标点在水平、竖直方向上的投影乘以左右两个方向,如果在左右两个方向包含的区域之内,那么所得向量方向是必然相反的,点乘为负数
        if (Vector3.Dot(leftCross, rightCross) < 0)
        {
            Debug.Log("在水平视角内");
        }
        if (Vector3.Dot(upCross, downCross) < 0)
        {
            Debug.Log("在垂直视角范围内");
        }
    }
}

}

、、、

上一篇下一篇

猜你喜欢

热点阅读