Unity - AI

博客介绍了机器人的视觉感知和听觉感官系统。视觉感知分全方位无死角和半圆弧视觉,利用距离和夹角判断是否看到玩家,同时会考虑障碍物影响;听觉感官系统通过玩家跑动状态和导航系统计算的最短距离判断是否听到玩家。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

  • 视觉感知系统

全方位无死角视觉:

  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;
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值