欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Unity - AI

程序员文章站 2022-06-12 16:55:08
...

 

 

  • 视觉感知系统

全方位无死角视觉:

  1. 利用Vector3.Distance()判断距离是否在视觉范围内;

半圆弧视觉:

  1. 利用Vector3.Distance()判断距离是否在视觉范围内;
  2. 利用Vectoe3.Angle(机器人前方,从机器人指向玩家的向量)得到夹角(<90°),判断这个夹角是否在视觉角度/2内,若在视觉角度/2内,则认为是看到了,否则反之。
  3. 这个视觉看不到看人 还会受到障碍物影响,在确认玩家在视觉范围内时,还要发射一条射线判断是否有障碍物挡着,若射线检测到的是玩家,则表明玩家在视野内,若碰到的是障碍物则不会看到玩家,也就不会触发看到玩家后的操作了。
     
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class VisualSense : MonoBehaviour {
    public float viewDistance = 3;
    public float viewAngle = 90;    
    public GameObject target;
    // Use this for initialization
    void Start () {
            }
        // Update is called once per frame
    void Update () {
        if (Vector3.Distance (target.transform.position , transform.position) <= viewDistance) {
            Vector3 dir = target.transform.position - transform.position;  
             float angle = Vector3.Angle (dir, transform.forward);
            if (angle <= viewAngle/2) {
                Debug.Log ("视野范围内");
            }
        }
    }
}
  • 听觉感官系统

  1. 玩家跑动Bool变量,当玩家跑动时,为true,否则为false;
  2. 听觉最大距离:利用Unity寻路系统Nav,将2个点之间的最短距离计算出,然后判断这个最短距离是否 小于 听觉最大距离,若小于,则去判断玩家跑动Bool变量是否为true,若为true就表示听到了。这2点的意思是 机器人位置和玩家位置,因为我们的听觉是会受到障碍物干扰的,所以在计算2点距离的时候就不能使用简单的Vector3.Distance了,而是使用导航系统Nav的计算方法,或者根据你自己的寻路系统方法来计算2点的最短路径。

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class NavPath : MonoBehaviour {
    
    private NavMeshAgent agent;
    public Transform end;
    private void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        DrawPath();
    }
 
 
    private void DrawPath()
    {
        float smallestLength=0;
        List<Vector3> path = GetPath(end.position);
        Vector3[] pathArray = path.ToArray();
        for(int i=0;i<pathArray.Length-1;i++)
        {            
            GameObject go= GameObject.CreatePrimitive(PrimitiveType.Sphere);
            go.transform.position = pathArray[i];
            smallestLength += Vector3.Distance(pathArray[i], pathArray[i + 1]);
        }
        Debug.Log("路径长度:" + smallestLength);
    }
 
    private List<Vector3> GetPath(Vector3 endPoint)
    {
        //agent.SetDestination(endPoint);          
        NavMeshPath navMeshPath = new NavMeshPath();
        agent.CalculatePath(endPoint, navMeshPath);
        List<Vector3> path = new List<Vector3>();
        for(int i=0;i<navMeshPath.corners.Length;i++)
        {
            path.Add(navMeshPath.corners[i]);
            Debug.Log(i+1+"号  "+navMeshPath.corners[i]);
        }
        path.Insert(0, transform.position);
        path.Add(endPoint);
        return path;
    }
}

 

 

相关标签: AI