Unity - AI
程序员文章站
2022-06-12 16:55:08
...
-
视觉感知系统
全方位无死角视觉:
- 利用Vector3.Distance()判断距离是否在视觉范围内;
半圆弧视觉:
- 利用Vector3.Distance()判断距离是否在视觉范围内;
- 利用Vectoe3.Angle(机器人前方,从机器人指向玩家的向量)得到夹角(<90°),判断这个夹角是否在视觉角度/2内,若在视觉角度/2内,则认为是看到了,否则反之。
- 这个视觉看不到看人 还会受到障碍物影响,在确认玩家在视觉范围内时,还要发射一条射线判断是否有障碍物挡着,若射线检测到的是玩家,则表明玩家在视野内,若碰到的是障碍物则不会看到玩家,也就不会触发看到玩家后的操作了。
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 ("视野范围内");
}
}
}
}
-
听觉感官系统
- 玩家跑动Bool变量,当玩家跑动时,为true,否则为false;
- 听觉最大距离:利用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;
}
}
上一篇: QSettings读取注册表失败
下一篇: AI发布网站部署笔记