RPG_类暗黑破坏神 111 人阅读 | 0 人回复
70
0
308
管理员
using RPG.Combat; using RPG.Core; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; using UnityEngine.UI; using RPG.Saving; //角色的移动 namespace RPG.Movement { public class Mover : MonoBehaviour,IAction,ISaveable { [SerializeField] float maxSpeed = 6f;//最大速度 private NavMeshAgent navMeshAgent; Animator animator; Health health; CapsuleCollider capsuleCollider; private void Start() { animator = GetComponent<Animator>(); navMeshAgent = GetComponent<NavMeshAgent>(); health = GetComponent<Health>(); capsuleCollider = GetComponent<CapsuleCollider>(); } private void Update() { if (health.IsDead()) { capsuleCollider.enabled = false;//关闭碰撞 navMeshAgent.enabled = false;//关闭寻路 } UpdateAnimator(); } /// <summary> /// 开始移动行为 /// </summary> /// <param name="destination">移动的位置</param> public void StartMoveAction(Vector3 destination,float speedFraction) { GetComponent<ActionScheduler>().StartAction(this); MoveTo(destination,speedFraction); } /// <summary> /// 寻路移动到射线检测点 /// </summary> /// <param name="hit"></param> public void MoveTo(Vector3 destination,float speedFraction) { navMeshAgent.destination = destination;//获取寻路目的地 = 射线碰撞的点 navMeshAgent.speed = maxSpeed * Mathf.Clamp01(speedFraction);//设置速度的浮动值 navMeshAgent.isStopped = false; } /// <summary> /// 停止寻路 /// </summary> public void Cancel() { navMeshAgent.isStopped = true; } /// <summary> /// 动画更新 /// </summary> private void UpdateAnimator() { Vector3 velocity = navMeshAgent.velocity;//创建寻路速度 Vector3 localVelocity = transform.InverseTransformDirection(velocity);// 将世界向前变换到本地空间: float speed = localVelocity.z; //print("AI"+speed); animator.SetFloat("forwardSpeed", speed/10); } [System.Serializable]// 标记该结构体可以被序列化 struct MoverSaveData // 移动数据存档结构体 { public SerializableVector3 position;// 游戏对象的位置 public SerializableVector3 rotation;// 游戏对象的旋转 } // 捕获游戏对象的状态 public object CaptureState() { MoverSaveData data = new MoverSaveData();// 创建一个新的 MoverSaveData 实例 data.position = new SerializableVector3(transform.position); // 将当前游戏对象的位置转换为 SerializableVector3 类型并赋值 data.rotation = new SerializableVector3(transform.eulerAngles);// 将当前游戏对象的旋转角度转换为 SerializableVector3 类型并赋值 return data;// 返回捕获的状态数据 } // 恢复游戏对象的状态 public void RestoreState(object state) { MoverSaveData data = (MoverSaveData)state; // 将状态对象转换为 MoverSaveData 类型 GetComponent<NavMeshAgent>().enabled = false;// 禁用 NavMeshAgent 组件,以避免在设置位置时发生冲突 transform.position =data.position.ToVector();// 将游戏对象的位置设置为恢复的坐标 transform.eulerAngles = data.rotation.ToVector();// 将游戏对象的旋转设置为恢复的旋转 GetComponent<NavMeshAgent>().enabled = true; // 重新启用 NavMeshAgent 组件,恢复导航功能 } } } 复制代码
举报
本版积分规则 发表回复 回帖后跳转到最后一页
主题
帖子
积分