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

2024-09-09
91看过
在上一节我们创建了一个动作调度器的脚本,动作调度器的目的主要是为了减少脚本之间的依赖,避免在移动的脚本中编写过多的逻辑,所以使用接口让动作调度器通关一个Cancel的方法来处理移动和战斗的逻辑


创建接口 IAction,同时Mover和Fighter脚本中进行修改,在动作调度器处理逻辑

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. namespace RPG.Core
  5. {
  6.     public interface IAction
  7.     {
  8.         void Cancel();
  9.     }
  10. }
复制代码
ActionScheduler

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. namespace RPG.Core
  5. {
  6.     public class ActionScheduler : MonoBehaviour
  7.     {
  8.         IAction currentAction;
  9.         public void StartAction(IAction action)
  10.         {
  11.             if (currentAction == action) return;//如果新操作与当前操作相同,则不执行任何操作
  12.             if (currentAction != null)//如果有新的操作,请打印取消消息
  13.             {
  14.                 currentAction.Cancel();
  15.             }
  16.            
  17.             currentAction = action;//将新操作设置为当前操作
  18.         }
  19.     }
  20. }
复制代码
Mover
  1. using RPG.Core;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEngine.AI;
  6. using UnityEngine.UI;
  7. //角色的移动
  8. namespace RPG.Movement
  9. {
  10.     public class Mover : MonoBehaviour,IAction
  11.     {
  12.         private NavMeshAgent navMeshAgent;
  13.         
  14.         Animator animator;
  15.         private void Start()
  16.         {
  17.             animator = GetComponent<Animator>();
  18.             navMeshAgent = GetComponent<NavMeshAgent>();
  19.            
  20.         }
  21.         private void Update()
  22.         {
  23.             UpdateAnimator();
  24.         }
  25.         /// <summary>
  26.         /// 开始移动行为
  27.         /// </summary>
  28.         /// <param name="destination">移动的位置</param>
  29.         public void StartMoveAction(Vector3 destination)
  30.         {
  31.             GetComponent<ActionScheduler>().StartAction(this);
  32.             
  33.             MoveTo(destination);
  34.         }
  35.         /// <summary>
  36.         /// 寻路移动到射线检测点
  37.         /// </summary>
  38.         /// <param name="hit"></param>
  39.         public void MoveTo(Vector3 destination)
  40.         {
  41.             navMeshAgent.destination = destination;//获取寻路目的地 = 射线碰撞的点
  42.             navMeshAgent.isStopped = false;
  43.         }
  44.         /// <summary>
  45.         /// 停止寻路
  46.         /// </summary>
  47.         public void Cancel()
  48.         {
  49.             navMeshAgent.isStopped = true;
  50.         }
  51.         
  52.         /// <summary>
  53.         /// 动画更新
  54.         /// </summary>
  55.         private void UpdateAnimator()
  56.         {
  57.             Vector3 velocity = navMeshAgent.velocity;//创建寻路速度
  58.             Vector3 localVelocity = transform.InverseTransformDirection(velocity);// 将世界向前变换到本地空间:
  59.             float speed = localVelocity.z;
  60.             
  61.             animator.SetFloat("forwardSpeed", speed);
  62.         }
  63.     }
  64. }
复制代码
Fighter
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using RPG.Movement;
  5. using RPG.Core;
  6. namespace RPG.Combat
  7. {
  8.     //攻击
  9.     public class Fighter : MonoBehaviour,IAction
  10.     {
  11.         [SerializeField] float weaponRange = 2f;//武器范围
  12.         Transform target;
  13.         private Mover mover;
  14.         private bool isInRange;
  15.         private void Start()
  16.         {
  17.             mover = GetComponent<Mover>();
  18.         }
  19.         private void Update()
  20.         {
  21.             if (target == null) return;
  22.             if (target != null && !GetIsInRange())//目标不为空并且在距离范围内
  23.             {
  24.                 mover.MoveTo(target.position);
  25.             }
  26.             else
  27.             {
  28.                 mover.Cancel();
  29.             }
  30.         }
  31.         private bool GetIsInRange()
  32.         {
  33.             return  Vector3.Distance(transform.position, target.position) < weaponRange;//创建玩家距离和敌人距离是否小于2
  34.         }
  35.         public void Attack(CombatTarget combatTarget)
  36.         {
  37.             GetComponent<ActionScheduler>().StartAction(this);
  38.             target = combatTarget.transform;
  39.         }
  40.         public void Cancel()
  41.         {
  42.             target = null;
  43.         }
  44.     }
  45. }
复制代码


回复

举报

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

本版积分规则

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