unity_实用小技巧(敌人追踪主角)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity_实用小技巧(敌人追踪主角)相关的知识,希望对你有一定的参考价值。
首先要明白敌人发现主角可以通过两种形式:一种是看见主角(即主角出现在敌人的视野之内)。另一种是听见主角(即听见主角走路声或者是跑步声)
第一种形式:看。
如下图 ,判断主角是否在敌人视野角度内,只需判断B<0.5*A是否成立
第二种形式,听。
using UnityEngine;
using System.Collections;
using UnityEngine.AI;
public class EnemySight : MonoBehaviour {
private float seeAngle=120;//敌人视野角度
private bool isSeePlay = false;
private Vector3 lastPos;// 玩家的最后位置
private Vector3 alermPos=Vector3.zero; //警报位置
private Animator anim; //主角动画,作用是判断主角是否在运动
private SphereCollider sphereCollider;//敌人身上的碰撞器,该碰撞器是用来触发检测主角是否在敌人可见,可听范围内
private NavMeshAgent navMeshAgent; //AI组件
void Awake()
{
anim = GameObject.FindGameObjectWithTag(Tags.player).GetComponent<Animator>();
lastPos = GameController._instance.lastPlayerPostion;
navMeshAgent = GetComponent<NavMeshAgent>();
}
void Update()
{
//同步主角位置
if (lastPos != GameController._instance.lastPlayerPostion)//触发警报后玩家位置改变
{
alermPos = GameController._instance.lastPlayerPostion; //更新警报位置
lastPos = GameController._instance.lastPlayerPostion;
}
}
void OnTriggleStay(Collider other)
{
if (other.tag==Tags.player)
{
//看玩家
Vector3 startDir = transform.forward;//敌人开始朝向
Vector3 currDir = other.transform.position - transform.position; //敌人看向玩家的向量
float angle = Vector3.Angle(startDir, currDir);//敌人开始朝向与看见玩家朝向的夹角
if (angle < seeAngle * 0.5f) //视野角度一半以内可见
{
//主角在敌人的视野之内
isSeePlay = true;
alermPos = other.transform.position;//把玩家的位置设置为警报位置
GameController._instance.SeePlayer(other.transform);
}
else
{
isSeePlay = false;
}
//听脚步声音
if (anim.GetCurrentAnimatorStateInfo(0).IsName("Locomotion"))//如果玩家在运动
{
NavMeshPath path = new NavMeshPath();
if (navMeshAgent.CalculatePath(other.transform.position, path))
{
Vector3[] wayPoints = new Vector3[path.corners.Length+2];
wayPoints[0] = transform.position;
wayPoints[wayPoints.Length - 1] = other.transform.position;
for (int i = 0; i < path.corners.Length; i++)
{
wayPoints[i + 1] = path.corners[i];
}
float length = 0;
for (int i = 1; i < wayPoints.Length; i++)
{
length += (wayPoints[i] - wayPoints[i - 1]).magnitude; //所有节点连接的折线的总长度
}
if (length <= sphereCollider.radius) //在听力范围内
{
alermPos = other.transform.position;
}
}
}
}
}
void OnTriggleExit(Collider other)
{
if (other.tag == Tags.player)
{
isSeePlay = false;
}
}
以上是关于unity_实用小技巧(敌人追踪主角)的主要内容,如果未能解决你的问题,请参考以下文章