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_实用小技巧(敌人追踪主角)的主要内容,如果未能解决你的问题,请参考以下文章

unity_实用小技巧(避免游戏对象被销毁时声音消失)

unity_实用小技巧(空指针错误)

unity_实用小技巧(空指针错误)

Unity 3D 实用的10个小技巧

php实用小技巧持续更新

实用电脑便签技巧 让你变便签应用小达人