unity_小功能实现(敌人追踪主角)

Wesley13
• 阅读 754

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

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

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

a:看(see)

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

 unity_小功能实现(敌人追踪主角)

b:听(listen)

 unity_小功能实现(敌人追踪主角)

 代码如下:

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();
        lastPos = GameController._instance.lastPlayerPostion;
        navMeshAgent = GetComponent();
    }

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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
java中比较两个时间的差值
项目背景1.某篇文稿的发布时间是publishDate,例如:2020072118:00:41。2.现要求判断该篇文稿的发布时间是否在近30天之内。publicstaticlongdayDiff(DatecurrentDate,DatepublishDate){LongcurrentTimecurrentDat
Wesley13 Wesley13
3年前
unity仿微信飞机大战项目
开发路线:1,游戏背景(连续播放)2,添加主角3,设置游戏主角的动画4,添加两种子弹并设置子弹的运动5,添加三种子弹设置子弹的自动生成和运动6,添加两种奖励物品设置奖励物品的自动生成和运动7,设置主角的控制
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
Unity 2D游戏开发教程之游戏精灵的开火状态
Unity2D游戏开发教程之游戏精灵的开火状态精灵的开火状态“开火”就是发射子弹的意思,在战争类型的电影或者电视剧中,主角们就爱这么说!本节打算为精灵添加发射子弹的能力。因为本游戏在后面会引入敌人,而精灵最好具备开火的能力,否则会被敌人轻易干掉!具体的实现方法是:(1)导入一个表
Wesley13 Wesley13
3年前
2018十大国产佳片
2018十大国产佳片一、总结一句话总结:好的国产片里面的英文字幕是学英语的好材料。每个人都想当主角,每个人也都知道主角的巨大优势,主角能够拥有想要的荣光爱情以及各种资源,但是,各种因素造成,只有极少数人才能做主角。英语主角1、《红海行动》林超贤2月16日?主旋