1、敌人发现主角有两种形式:

  a、看见主角(主角出现在敌人的视野之内)

  b、听见主角(听见主角走路声或者是跑步声)

a:看(see)

首先判断主角是否在敌人视野角度内,那么我们只需要判断B<0.5*A能不能成立

b:听(listen)

代码如下:

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 SphereCollidersphereCollider;//敌人身上的碰撞器,该碰撞器是用来触发检测主角是否在敌人可见,可听范围内
    private NavMeshAgentnavMeshAgent; //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 (inti = 0; i<path.corners.Length; i++)
                   
{
                       
wayPoints[i + 1] = path.corners[i];  
                   
}
                   
float length = 0;
                   
for (inti = 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_小功能实现(敌人追踪主角)的更多相关文章

  1. unity_小功能实现(敌人巡逻功能)

    利用NavMeshAgent控制敌人巡逻,即敌人在一组位置间循环巡逻. 首先我们要知道NavMeshAgent中有两个方法:1.锁定当前巡逻的某一目标位置,即navMeshAgent.destinat ...

  2. unity_小功能实现(碰撞检测)

    1.触发器Trigger:勾选IsTrigger属性 //当player刚进入触发区域的时刻发生触发检测,比如在靠近门的某个区域门一直处于开着状态 void OnTriggerEnter(Collid ...

  3. unity_小功能实现(客户端相互通信功能)

    服务器端:在VS中新建项目,用于服务器的搭建 using System;using System.Collections.Generic;     using System.Net.Sockets;u ...

  4. 自制Unity小游戏TankHero-2D(1)制作主角坦克

    自制Unity小游戏TankHero-2D(1)制作主角坦克 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm)这个游戏制作的. ...

  5. js小功能整理

    /** * 判断是否包含字符串某字符串 * @param {[type]} str [被检测的字符串] * @param {[type]} substr [检测是否含有的字符串] * @return ...

  6. iOS--知识综合应用成就时髦小功能点

    iOS--知识综合应用成就时髦小功能点

  7. Java实现点击一个Jlabel增加一个Jlabel的小功能

    当界面生成以后,自己想做一个点击一个Jlabel增加一个Jlabel,即类似于QQ的添加好友以后可以及时的加进一个好友.自己做了好久,发现不能及时刷新.在网上查了一下,然后自己研究了一小会.发现需要v ...

  8. Servlet的5种方式实现表单提交(注册小功能),后台获取表单数据

    用servlet实现一个注册的小功能 ,后台获取数据. 注册页面: 注册页面代码 : <!DOCTYPE html> <html> <head> <meta ...

  9. android 常用小功能(第二版)

    经历过一段岁月,转眼2013的半年都过去了,第二版整理好的小功能,答应大家发布的,直到今日,终于和大家相见了,第二版没有第一版多,大家也可以去参考第一版的内容,希望大家使用愉快! 目录: 1.获取当前 ...

随机推荐

  1. 小白学python-day04-运算符、while循环相关

    今天是day04.以下是学习总结. 但行努力,莫问前程. ----------------------------------------------------------------------- ...

  2. 201803-1跳一跳 CCF (C语言)

    问题描述 近来,跳一跳这款小游戏风靡全国,受到不少玩家的喜爱. 简化后的跳一跳规则如下:玩家每次从当前方块跳到下一个方块,如果没有跳到下一个方块上则游戏结束. 如果跳到了方块上,但没有跳到方块的中心则 ...

  3. PointCloud及其经典论文介绍

    这篇博客会介绍点云的基本知识,重点介绍最近两年发表的部分经典论文,有什么建议欢迎留言! 点云基本介绍 点云是某个坐标系下的点的数据集,包含了丰富的信息,可以是三维坐标X,Y,Z.颜色.强度值.时间等等 ...

  4. Java多线程笔记总结

    1.线程的三种创建方式 对比三种方式: 通过继承Thread类实现 通过实现Runnable接口 实现Callable接口 第1种方式无法继承其他类,第2,3种可以继承其他类: 第2,3种方式多线程可 ...

  5. 使用log4j进行日志管理

      17.1.Log4j简介 作用: 1. 跟踪代码的运行轨迹. 2. 输出调试信息. 三大组成: 1. Logger类-生成日志. 2. Appender类-定义日志输出的目的地. 3. Layou ...

  6. IOC容器-Autofac在MVC中实现json方式注入使用

    在你阅读时,默认已经了解IOC和autofac的基本用法, 我在最近的我的博客项目中运用了IOC autofac 实现了依赖注入 由于我的项目时asp.net MVC所以我目前向大家展示MVC中如何使 ...

  7. Linux系统管理----账号与权限管理作业习题

    1.创建/guanli 目录,在/guanli下创建zonghe 和 jishu 两个目录(一条命令) 创建目录:mkdir +目录 [root@localhost chen]#mkdir /guan ...

  8. Pyenv虚拟环境的创建(虚拟机)

    创建pyenv虚拟环境 sudo yum install openssl* 安装其所需要的库文件 git clone https://github.com/yyuu/pyenv.git ~/.pyen ...

  9. Linux基础进程管理优先级

    一.进程优先级 Linux进程调度及多任务 每个cpu(或者cpu核心)在一个时间点上只能处理一个进程,通过时间片技术,Linux实际能够运行的进程(和线程数)可以超出实际可用的cpu及核心数量.Li ...

  10. java 动手动脑7

    ---恢复内容开始--- 一.动手动脑:多层的异常捕获-1 阅读以下代码(CatchWho.java),写出程序运行结果: ArrayIndexOutOfBoundsException/内层try-c ...