判断玩家的位置
using UnityEngine;
public class EnemyMove : MonoBehaviour {
//玩家的动画
public Animator _anim;
//判断看见玩家
public bool MoveEnemy = false;
//寻路组件
private UnityEngine.AI.NavMeshAgent Navenemy;
//敌人的视野范围
public float shiftspeed = 120;
//看到玩家的位置;储存视觉和听觉的
public Vector3 vectplayer = Vector3.zero;
//听觉视觉范围
private SphereCollider SphereEnemy;
//触发警报看到玩家的位置,储存摄像头和红外线的
public Vector3 alarmplayer;
//初始化
private void Awake()
{
//获取玩家身上的动画
_anim = GameObject.FindGameObjectWithTag(Tags.Playtags).GetComponent<Animator>();
//获取寻路组件
Navenemy = this.GetComponent<UnityEngine.AI.NavMeshAgent>();
//获取圆的碰撞体,也就是听觉和视觉的范围
SphereEnemy = this.GetComponent<SphereCollider>();
}
private void Start()
{
//获取玩家的位置
alarmplayer = GameManger._instance.locationplay;
}
private void Update()
{
//判断有没有获取玩家的位置
if (alarmplayer != GameManger._instance.locationplay)
{
//储存视觉、听觉和储存摄像头、红外线获取玩家的位置
vectplayer = GameManger._instance.locationplay;
alarmplayer = GameManger._instance.locationplay;
}
}
private void OnTriggerStay(Collider other)//触发停留函数
{
//判断是不是玩家
if (other.tag == Tags.Playtags)
{
//到玩家的距离
Vector3 seat = other.transform.position - transform.position;
//获取夹角
float angle = Vector3.Angle(transform.forward, seat);
RaycastHit hit;//储存碰撞信息
Physics.Raycast(transform.position + Vector3.up, seat, out hit);
//是判断玩家是否在敌人射线范围之内
if (angle < shiftspeed * 0.5f && hit.collider.tag == Tags.Playtags)
{
//看到玩家
MoveEnemy = true;
//警报响起
GameManger._instance.open = true;
//得到玩家位置
vectplayer = other.transform.position;
}
else
{
//没有看到玩家
MoveEnemy = false;
}
//判断动画是否播放
if (_anim.GetCurrentAnimatorStateInfo(0).IsName("Tree"))
{
//储存巡逻拐角
UnityEngine.AI.NavMeshPath path = new UnityEngine.AI.NavMeshPath();
//判断所有的拐点是否获取完毕
if (Navenemy.CalculatePath(other.transform.position, path))
{
//数组 用来保存玩家和敌人的距离
Vector3[] SiteArray = new Vector3[path.corners.Length + 2];
//敌人的位置
SiteArray[0] = transform.position;
//玩家的位置
SiteArray[SiteArray.Length - 1] = other.transform.position;
//存储起点到终点拐点的位置
for (int i = 0; i < path.corners.Length; i++)
{
SiteArray[i + 1] = path.corners[i];
}
float length = 0;
//用来保存玩家到敌人的距离
for (int i = 0; i < SiteArray.Length - 1; i++)
{
//向量距离的相加 因为距离是Vectorc类型的所以,magnitude是转float
length += (SiteArray[i + 1] - SiteArray[i]).magnitude;
}
//判断是否进入听力范围内
if (length <= SphereEnemy.radius)
{
//如果是就把玩家的位置传给敌人
vectplayer = other.transform.position;
}
}
}
}
}
//退出函数
private void OnTriggerExit(Collider other)
{
//判断是不是玩家
if (other.tag == Tags.Playtags)
{
//没有看到玩家
MoveEnemy = false;
}
}
}
攻击:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class RobotAI : MonoBehaviour {
//储存巡逻点的数组
public Transform[] piece;
//巡逻次数
public int number = 0;
//计时器
public float trimer;
//巡逻组件
public UnityEngine.AI.NavMeshAgent navpatrol;
//到达巡逻点停留的时间
public float pattroltrime = 2f;
//EnemyMove定义的字段好调用里面的东西
public EnemyMove Robot;
//Playcase定义的字段好调用里面的东西
public Playcase player;
void Awake()
{
//初始化添加组件
navpatrol = this.GetComponent<UnityEngine.AI.NavMeshAgent>();
//储存第一个巡逻的位置
navpatrol.destination = piece[number].position;
//调用类
player = GameObject.FindGameObjectWithTag(Tags.Playtags).GetComponent<Playcase>();
Robot = this.GetComponent<EnemyMove>();
}
void Update()
{
//判断是否看到敌人和玩家血量
if (Robot.MoveEnemy && player.HP > 0)
{
//射击的方法
shooting();
}
//判断看到玩家的位置不等于零和玩家血量
else if (Robot.vectplayer != Vector3.zero && player.HP > 0)
{
//追击的方法
Arrest();
}
else
{
//巡逻的方法
Patrol();
}
}
//巡逻的方法
void Patrol()
{
//恢复行动
navpatrol.Resume();
//巡逻速度
navpatrol.speed = 2f;
//判断当看到玩家时敌人和玩家的距离是小于0.3
if (navpatrol.remainingDistance < 0.3f)
{
//计时器
trimer += Time.deltaTime;
//判断到达巡逻点停留的时间是否小于计时器
if (pattroltrime < trimer)
{
//巡逻点++
number++;
//让它再从新开始
number %= 4;
navpatrol.destination = piece[number].position;
//计时器清零
trimer = 0;
}
}
}
//追捕的方法
void Arrest()
{
//开始
navpatrol.Resume();
//追击速度
navpatrol.speed = 4f;
//追捕玩家
navpatrol.destination = Robot.vectplayer;
//判断当看到玩家时敌人和玩家的距离是小于2
if (navpatrol.remainingDistance < 2)
{
//计时器
trimer += Time.deltaTime;
//判断到达巡逻点停留的时间是否小于计时器
if (pattroltrime < trimer)
{
//计时器归零
trimer = 0;
//玩家的位置归零
GameManger._instance.locationplay = Vector3.zero;
//警报关闭
GameManger._instance.open = false;
//储存视觉和听觉的位置归零
Robot.vectplayer = Vector3.zero;
}
}
}
//射击的方法
public void shooting()
{
//暂停
navpatrol.Stop();
//看向玩家的位置
this.transform.LookAt(player.transform.position);
}
}
大致差不多了,如果没实现,请自行补充,我就这么个思路,能看懂的很简单的