unity官方demo学习之Stealth(二十四)敌人AI

来源:互联网 发布:windows photoviewer 编辑:程序博客网 时间:2024/06/08 09:44

1,添加脚本文件DoneEnemyAI

using UnityEngine;using System.Collections;public class DoneEnemyAI : MonoBehaviour{public float patrolSpeed = 2f;// The nav mesh agent's speed when patrolling.public float chaseSpeed = 5f;// The nav mesh agent's speed when chasing.public float chaseWaitTime = 5f;// The amount of time to wait when the last sighting is reached.public float patrolWaitTime = 1f;// The amount of time to wait when the patrol way point is reached.public Transform[] patrolWayPoints;// An array of transforms for the patrol route.private DoneEnemySight enemySight;// Reference to the EnemySight script.private NavMeshAgent nav;// Reference to the nav mesh agent.private Transform player;// Reference to the player's transform.private DonePlayerHealth playerHealth;// Reference to the PlayerHealth script.private DoneLastPlayerSighting lastPlayerSighting;// Reference to the last global sighting of the player.private float chaseTimer;// A timer for the chaseWaitTime.private float patrolTimer;// A timer for the patrolWaitTime.private int wayPointIndex;// A counter for the way point array.void Awake (){// Setting up the references.enemySight = GetComponent<DoneEnemySight>();nav = GetComponent<NavMeshAgent>();player = GameObject.FindGameObjectWithTag(DoneTags.player).transform;playerHealth = player.GetComponent<DonePlayerHealth>();lastPlayerSighting = GameObject.FindGameObjectWithTag(DoneTags.gameController).GetComponent<DoneLastPlayerSighting>();}void Update (){// If the player is in sight and is alive...if(enemySight.playerInSight && playerHealth.health > 0f)// ... shoot.Shooting();// If the player has been sighted and isn't dead...else if(enemySight.personalLastSighting != lastPlayerSighting.resetPosition && playerHealth.health > 0f)// ... chase.Chasing();// Otherwise...else// ... patrol.Patrolling();}void Shooting (){// Stop the enemy where it is.nav.Stop();}void Chasing (){// Create a vector from the enemy to the last sighting of the player.Vector3 sightingDeltaPos = enemySight.personalLastSighting - transform.position;// If the the last personal sighting of the player is not close...if(sightingDeltaPos.sqrMagnitude > 4f)// ... set the destination for the NavMeshAgent to the last personal sighting of the player.nav.destination = enemySight.personalLastSighting;// Set the appropriate speed for the NavMeshAgent.nav.speed = chaseSpeed;// If near the last personal sighting...if(nav.remainingDistance < nav.stoppingDistance){// ... increment the timer.chaseTimer += Time.deltaTime;// If the timer exceeds the wait time...if(chaseTimer >= chaseWaitTime){// ... reset last global sighting, the last personal sighting and the timer.lastPlayerSighting.position = lastPlayerSighting.resetPosition;enemySight.personalLastSighting = lastPlayerSighting.resetPosition;chaseTimer = 0f;}}else// If not near the last sighting personal sighting of the player, reset the timer.chaseTimer = 0f;}void Patrolling (){// Set an appropriate speed for the NavMeshAgent.nav.speed = patrolSpeed;// If near the next waypoint or there is no destination...if(nav.destination == lastPlayerSighting.resetPosition || nav.remainingDistance < nav.stoppingDistance){// ... increment the timer.patrolTimer += Time.deltaTime;// If the timer exceeds the wait time...if(patrolTimer >= patrolWaitTime){// ... increment the wayPointIndex.if(wayPointIndex == patrolWayPoints.Length - 1)wayPointIndex = 0;elsewayPointIndex++;// Reset the timer.patrolTimer = 0;}}else// If not near a destination, reset the timer.patrolTimer = 0;// Set the destination to the patrolWayPoint.nav.destination = patrolWayPoints[wayPointIndex].position;}}


参数:(公有)

敌人巡逻速度

 敌人追踪速度

到达追踪地点后的等待时间

到达每个巡逻路径点后的等待时间

 储存路径点坐标的数组

(私有)

EnemySight脚本引用

nav mesh agent组件引用

    玩家位置引用
    PlayerHealth脚本引用
    LastPlayerSighting脚本引用
    追踪等待时间的计时器
    巡逻等待时间的计时器
    路径点数组的索引
函数
Awake
获取引用对象和组件

Update ()
如果玩家在敌人视线内 且玩家生命值大于0
射他
如果玩家被发现(被听见或触发警报) 且生命值大于0
追她
否则
巡逻


Shooting ()
射击时保持敌人不动


Chasing ()
从敌人当前位置到最后发现玩家位位置 创建一个向量
如果玩家距离敌人较远 (向量长度的平方 > 4)(这个距离临界值为2)
让敌人跑向追踪位置
移动速度设为追踪速度

当敌人与目标点的距离 小于 可停止距离
追踪等待时间的计时器开始计时(追踪前先愣会儿)
当敌人等待了足够时间后(设定的5秒)
重置最后发现玩家的全局位置和独立位置 重置计时器,返回各自巡逻路径中
如果敌人没有靠近玩家最后出现的位置 那么重置计时器(因为追踪位置不是固定的 玩家可能还会在其他位置触发警报 从而刷新追踪位置)


Patrolling ()
移动速度等于巡逻速度

如果没有目标点(即失去玩家行踪) 或者 已接近目标巡逻点
巡逻等待时间的计时器开始计时(再愣会儿)

等待时间过后
移动索引至下一个位置(如果以移动完一圈,再从头开始)
重置计时器

如果没有靠近任何一个目标点(没到达目的地或目的地不是玩家重置位置时) 重置计时器
其他函数可能会改变这个目标点,目标点设为路径点


2,将敌人拖入prefab,复制两个,位置分别是-19,0,37;-29,0,43.5.为这三个敌人排序_001,_002,_003


3,给敌人设置路径巡逻点。创建一个空对象wayPoints(reset position),复制1个命名为wayPoint_001,使用2D Gizmos来标记空对象
选中wayPoint_001,点击inspector视图左上角的立方体,选择other,选择wayPoint_001,然后会发现wayPoint_001,

被标记为蓝色小旗,接下来复制10个wayPoint_001,分别命名为_002到_011,如图023,


接下来分别给这11ge设置position

首先是第一个敌人巡逻点,图024,


为第一个敌人char_robotGuard_002添加1到4的点,如图027


第二个敌人,图025,添加5到8的点


第三个,图026,


添加剩余的点,不过顺序为9,8,10,11,因为2,3敌人共用8这个点,如图028


0 0
原创粉丝点击