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

2024-09-14
97看过
AI巡逻到达每个巡逻点之后停留一段时间,然后在前往下一个巡逻点。


  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. using System;
  8. namespace RPG.Control
  9. {
  10.     //AI的控制
  11.     public class AIController : MonoBehaviour
  12.     {
  13.         [SerializeField] float chaseDistance = 5f;// 设定追逐范围的距离
  14.         [SerializeField] float suspicionTime = 4f;//丢失目标后原地等待时间
  15.         [SerializeField] float waypointDwellTime = 3f;//倒地巡逻点之后等待时间
  16.         [SerializeField] PatrolPath patrolPath;//巡逻点
  17.         [SerializeField] float waypointTolerance = 1f;//到达巡逻点允许的误差范围
  18.         float timeSinceLastSawPlayer = Mathf.Infinity;//最后一次看见玩家的时间 时间计时器 设置无限大
  19.         float timeSinceArrivedAtWaypoint = Mathf.Infinity;//到达巡逻点后 时间计时器 设置无限大
  20.         int currentWaypointIndex = 0;//当前巡逻点数量
  21.         Vector3 guardPosition;//默认位置
  22.         //组件
  23.         Fighter fighter;
  24.         Health health;
  25.         Mover mover;
  26.         GameObject player;
  27.         
  28.         
  29.         private void Start()
  30.         {
  31.             fighter = GetComponent<Fighter>();
  32.             health = GetComponent<Health>();
  33.             player = GameObject.FindWithTag("Player");// 找到标签为“Player”的游戏对象
  34.             mover = GetComponent<Mover>();
  35.             guardPosition = transform.position;
  36.         }
  37.         private void Update()
  38.         {
  39.             if (health.IsDead()) return;//如果角色已经死亡,则跳出
  40.             // 如果和玩家的距离小于追逐范围 并且可以攻击玩家
  41.             if (InAttackRangeOfPlayer() && fighter.CanAttack(player))
  42.             {
  43.                 AttackBehaviour();//开始攻击
  44.             }
  45.             else if (timeSinceLastSawPlayer < suspicionTime || timeSinceArrivedAtWaypoint < waypointDwellTime)//失去对玩家的视线后,怀疑时间
  46.             {
  47.                 SuspicionBehaviour();//原地待机
  48.             }
  49.             else
  50.             {
  51.                 PatrolBehaviour();//进入巡逻
  52.             }
  53.             UpdateTimes();
  54.         }
  55.         private void UpdateTimes()//计时器更新
  56.         {
  57.             timeSinceLastSawPlayer += Time.deltaTime;
  58.             timeSinceArrivedAtWaypoint += Time.deltaTime;
  59.         }
  60.         private void PatrolBehaviour()//巡逻行为
  61.         {
  62.             Vector3 nectPoition = guardPosition; // 默认巡逻点设为守卫的起始位置
  63.             if (patrolPath != null)// 如果存在巡逻路径
  64.             {
  65.                 if(AtWaypoint())// 如果到达当前巡逻点
  66.                 {
  67.                     timeSinceArrivedAtWaypoint = 0f;//重置巡逻计时器为0
  68.                     CycleWaypoint();// 切换到下一个巡逻点
  69.                   
  70.                 }
  71.                 nectPoition = GetCurrentWaypoint();// 获取当前巡逻点的位置
  72.             }
  73.             
  74.             if(timeSinceArrivedAtWaypoint >waypointDwellTime)
  75.             {
  76.                 mover.StartMoveAction(nectPoition);// 开始移动到当前巡逻点
  77.             }
  78.             
  79.            
  80.         }
  81.       
  82.         private bool AtWaypoint()// 检查是否到达巡逻点
  83.         {
  84.             // 计算当前位置与当前巡逻点之间的距离
  85.             float distanceToWaypoint = Vector3.Distance(transform.position,GetCurrentWaypoint());
  86.             return distanceToWaypoint <waypointTolerance; // 判断是否小于允许的误差范围
  87.         }
  88.         private void CycleWaypoint()// 切换到下一个巡逻点
  89.         {
  90.             // 更新当前巡逻点的索引
  91.             currentWaypointIndex = patrolPath.GetNextIndex(currentWaypointIndex);
  92.         }
  93.         private Vector3 GetCurrentWaypoint()// 获取当前巡逻点的位置
  94.         {
  95.             // 从巡逻路径中获取当前巡逻点的位置
  96.             return patrolPath.GetWaypoint(currentWaypointIndex);
  97.         }
  98.         private void SuspicionBehaviour()//丢失目标后,取消当前任何行为
  99.         {
  100.             GetComponent<ActionScheduler>().CancelCurrentAction();
  101.         }
  102.         private void AttackBehaviour()//攻击行为
  103.         {
  104.             timeSinceLastSawPlayer = 0;//重置为0
  105.             fighter.Attack(player);//对玩家进行攻击
  106.         }
  107.         private bool InAttackRangeOfPlayer() // 检测是否在攻击范围内
  108.         {
  109.             float distanceToPlayer = Vector3.Distance(player.transform.position,transform.position); // 计算并返回玩家和当前对象之间的距离
  110.             return distanceToPlayer < chaseDistance;//返回两者之间距离是否小于追逐距离
  111.         }
  112.         private void OnDrawGizmosSelected()//绘制线框球体
  113.         {
  114.             Gizmos.color = Color.yellow;
  115.             Gizmos.DrawWireSphere(transform.position, chaseDistance);
  116.         }
  117.     }
  118. }
复制代码


回复

举报

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

本版积分规则

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