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

2024-09-19
113看过
介绍了两种方法来存储多个移动的数据,一种是字典,一种是结构体

Mover:
  1. using RPG.Combat;
  2. using RPG.Core;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using UnityEngine;
  6. using UnityEngine.AI;
  7. using UnityEngine.UI;
  8. using RPG.Saving;
  9. //角色的移动
  10. namespace RPG.Movement
  11. {
  12.     public class Mover : MonoBehaviour,IAction,ISaveable
  13.     {
  14.         
  15.         [SerializeField] float maxSpeed = 6f;//最大速度
  16.         private NavMeshAgent navMeshAgent;
  17.         
  18.         Animator animator;
  19.         Health health;
  20.         CapsuleCollider capsuleCollider;
  21.         private void Start()
  22.         {
  23.             animator = GetComponent<Animator>();
  24.             navMeshAgent = GetComponent<NavMeshAgent>();
  25.             health = GetComponent<Health>();
  26.             capsuleCollider = GetComponent<CapsuleCollider>();
  27.         }
  28.         private void Update()
  29.         {
  30.             if (health.IsDead())
  31.             {
  32.                 capsuleCollider.enabled = false;//关闭碰撞
  33.                 navMeshAgent.enabled = false;//关闭寻路
  34.             }
  35.             
  36.             UpdateAnimator();
  37.         }
  38.         /// <summary>
  39.         /// 开始移动行为
  40.         /// </summary>
  41.         /// <param name="destination">移动的位置</param>
  42.         public void StartMoveAction(Vector3 destination,float speedFraction)
  43.         {
  44.             GetComponent<ActionScheduler>().StartAction(this);
  45.             
  46.             MoveTo(destination,speedFraction);
  47.         }
  48.         /// <summary>
  49.         /// 寻路移动到射线检测点
  50.         /// </summary>
  51.         /// <param name="hit"></param>
  52.         public void MoveTo(Vector3 destination,float speedFraction)
  53.         {
  54.             navMeshAgent.destination = destination;//获取寻路目的地 = 射线碰撞的点
  55.             navMeshAgent.speed = maxSpeed * Mathf.Clamp01(speedFraction);//设置速度的浮动值
  56.             navMeshAgent.isStopped = false;
  57.         }
  58.         /// <summary>
  59.         /// 停止寻路
  60.         /// </summary>
  61.         public void Cancel()
  62.         {
  63.             navMeshAgent.isStopped = true;
  64.         }
  65.         
  66.         /// <summary>
  67.         /// 动画更新
  68.         /// </summary>
  69.         private void UpdateAnimator()
  70.         {
  71.             Vector3 velocity = navMeshAgent.velocity;//创建寻路速度
  72.             Vector3 localVelocity = transform.InverseTransformDirection(velocity);// 将世界向前变换到本地空间:
  73.             float speed = localVelocity.z;
  74.             //print("AI"+speed);
  75.              animator.SetFloat("forwardSpeed", speed/10);
  76.            
  77.         }
  78.         [System.Serializable]// 标记该结构体可以被序列化
  79.         struct MoverSaveData // 移动数据存档结构体
  80.         {
  81.             public SerializableVector3 position;// 游戏对象的位置
  82.             public SerializableVector3 rotation;// 游戏对象的旋转
  83.         }
  84.         // 捕获游戏对象的状态
  85.         public object CaptureState()
  86.         {
  87.             MoverSaveData data = new MoverSaveData();// 创建一个新的 MoverSaveData 实例
  88.             data.position = new SerializableVector3(transform.position);   // 将当前游戏对象的位置转换为 SerializableVector3 类型并赋值
  89.             data.rotation = new SerializableVector3(transform.eulerAngles);// 将当前游戏对象的旋转角度转换为 SerializableVector3 类型并赋值
  90.             return data;// 返回捕获的状态数据
  91.         }
  92.         // 恢复游戏对象的状态
  93.         public void RestoreState(object state)
  94.         {
  95.             
  96.             MoverSaveData data = (MoverSaveData)state; // 将状态对象转换为 MoverSaveData 类型
  97.             
  98.             GetComponent<NavMeshAgent>().enabled = false;// 禁用 NavMeshAgent 组件,以避免在设置位置时发生冲突
  99.             transform.position =data.position.ToVector();// 将游戏对象的位置设置为恢复的坐标
  100.             transform.eulerAngles = data.rotation.ToVector();// 将游戏对象的旋转设置为恢复的旋转
  101.             
  102.             GetComponent<NavMeshAgent>().enabled = true; // 重新启用 NavMeshAgent 组件,恢复导航功能
  103.         }
  104.     }
  105. }
复制代码


回复

举报

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

本版积分规则

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