码迷,mamicode.com
首页 > 编程语言 > 详细

unity_实用小技巧(敌人追踪主角)

时间:2017-10-30 17:00:40      阅读:1115      评论:0      收藏:0      [点我收藏+]

标签:++   ons   engine   9.png   cti   art   shp   mono   tags   

首先要明白敌人发现主角可以通过两种形式:一种是见主角(即主角出现在敌人的视野之内)。另一种是见主角(即听见主角走路声或者是跑步声)

第一种形式:看。

如下图 ,判断主角是否在敌人视野角度内,只需判断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_实用小技巧(敌人追踪主角)

标签:++   ons   engine   9.png   cti   art   shp   mono   tags   

原文地址:http://www.cnblogs.com/shirln/p/7754999.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!