Udemy-Unity制作类暗黑破坏神游戏记录-P49

2024-09-12
84看过
添加AI失去对玩家的视线后,在原地怀疑一段时间后,自动回到初始站岗的位置。


AIController

  1. using RPG.Combat;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using RPG.Movement;
  6. using RPG.Core;
  7. namespace RPG.Control
  8. {
  9.     //AI的控制
  10.     public class AIController : MonoBehaviour
  11.     {
  12.         [SerializeField] float chaseDistance = 5f;// 设定追逐范围的距离
  13.         [SerializeField] float suspicionTime = 4f;//丢失目标后原地等待时间
  14.         float timeSinceLastSawPlayer = Mathf.Infinity;//最后一次看见玩家的时间
  15.         Vector3 guardPosition;//默认位置
  16.         Fighter fighter;
  17.         Health health;
  18.         Mover mover;
  19.         GameObject player;
  20.         
  21.         
  22.         private void Start()
  23.         {
  24.             fighter = GetComponent<Fighter>();
  25.             health = GetComponent<Health>();
  26.             player = GameObject.FindWithTag("Player");// 找到标签为“Player”的游戏对象
  27.             mover = GetComponent<Mover>();
  28.             guardPosition = transform.position;
  29.         }
  30.         private void Update()
  31.         {
  32.             if (health.IsDead()) return;//如果角色已经死亡,则跳出
  33.             // 如果和玩家的距离小于设定的追逐范围 并且可以攻击玩家
  34.             if (InAttackRangeOfPlayer()&& fighter.CanAttack(player))
  35.             {
  36.                 timeSinceLastSawPlayer = 0;//设置为0
  37.                 AttackBehaviour();
  38.             }
  39.             else if(timeSinceLastSawPlayer < suspicionTime)//失去对玩家的视线后,怀疑时间
  40.             {
  41.                 SuspicionBehaviour();
  42.             }
  43.             else//不在范围内
  44.             {
  45.                 GuardBehaviour();
  46.             }
  47.             timeSinceLastSawPlayer += Time.deltaTime;
  48.         }
  49.         private void GuardBehaviour()//返回原站岗位置
  50.         {
  51.             mover.StartMoveAction(guardPosition);//回到初始的默认位置
  52.         }
  53.         private void SuspicionBehaviour()//丢失目标行为
  54.         {
  55.             GetComponent<ActionScheduler>().CancelCurrentAction();
  56.         }
  57.         private void AttackBehaviour()//攻击行为
  58.         {
  59.             fighter.Attack(player);//对玩家进行攻击
  60.         }
  61.         private bool InAttackRangeOfPlayer() // 检测是否在攻击范围内
  62.         {
  63.             float distanceToPlayer = Vector3.Distance(player.transform.position,transform.position); // 计算并返回玩家和当前对象之间的距离
  64.             return distanceToPlayer < chaseDistance;//返回两者之间距离是否小于追逐距离
  65.         }
  66.         private void OnDrawGizmosSelected()//绘制线框球体
  67.         {
  68.             Gizmos.color = Color.yellow;
  69.             Gizmos.DrawWireSphere(transform.position, chaseDistance);
  70.         }
  71.     }
  72. }
复制代码



回复

举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表