Unity3D NavMeshAgent可技能修改的移动速度变量配置求助
Unity3D鼠标点击移动:实现可被技能修改的移动速度变量
你当前的代码已经实现了基础的点击移动逻辑,但要实现能被技能修改的移动速度,只需要对NavMeshAgent的速度属性做一层封装,同时暴露可修改的变量即可。以下是具体修改方案:
1. 添加可配置的速度变量
在PlayerController类中添加基础移动速度变量,用[SerializeField]标记可以在Unity编辑器面板中调整初始值;额外添加临时速度加成变量,用于处理技能buff类的临时速度变化:
// 基础移动速度,可在Inspector面板设置初始值 [SerializeField] private float baseMoveSpeed = 5f; // 临时速度加成,用于技能buff类效果 private float tempSpeedBonus = 0f;
2. 初始化同步速度
在Start方法中,将NavMeshAgent的初始速度同步为基础速度:
private void Start() { cam = Camera.main; agent = GetComponent<NavMeshAgent>(); // 初始化agent速度为基础速度 agent.speed = baseMoveSpeed; }
3. 编写修改速度的公共方法
添加公共方法,让技能系统可以直接调用修改移动速度,同时实时同步到NavMeshAgent:
/// <summary> /// 设置基础移动速度(技能永久修改速度时调用) /// </summary> /// <param name="newSpeed">新的基础速度</param> public void SetBaseMoveSpeed(float newSpeed) { baseMoveSpeed = newSpeed; agent.speed = baseMoveSpeed + tempSpeedBonus; } /// <summary> /// 添加临时速度加成(技能buff类效果调用) /// </summary> /// <param name="bonus">加成数值</param> public void AddTempSpeedBonus(float bonus) { tempSpeedBonus += bonus; agent.speed = baseMoveSpeed + tempSpeedBonus; } /// <summary> /// 移除临时速度加成(buff结束时调用) /// </summary> /// <param name="bonus">要移除的加成数值</param> public void RemoveTempSpeedBonus(float bonus) { tempSpeedBonus = Mathf.Max(0, tempSpeedBonus - bonus); agent.speed = baseMoveSpeed + tempSpeedBonus; }
4. 修改后的完整代码
整合所有修改后的完整代码如下:
using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.AI; namespace EO.ARPGInput { [RequireComponent(typeof(NavMeshAgent))] public class PlayerController : MonoBehaviour { // 基础移动速度,可在Inspector面板设置初始值 [SerializeField] private float baseMoveSpeed = 5f; // 临时速度加成,用于技能buff类效果 private float tempSpeedBonus = 0f; [SerializeField] private InputAction movement = new InputAction(); [SerializeField] private LayerMask layerMask = new LayerMask(); private NavMeshAgent agent = null; private Camera cam = null; private void Start() { cam = Camera.main; agent = GetComponent<NavMeshAgent>(); // 初始化agent速度为基础速度 agent.speed = baseMoveSpeed; } private void OnEnable() { movement.Enable(); } private void OnDisable() { movement.Disable(); } private void Update() { HandleInput(); } public void HandleInput() { if (movement.ReadValue<float>() == 1) { Ray ray = cam.ScreenPointToRay(Mouse.current.position.ReadValue()); if (Physics.Raycast(ray, out RaycastHit hit, 100, layerMask)) { PlayerMove(hit.point); } } } public void PlayerMove(Vector3 location) { agent.SetDestination(location); } /// <summary> /// 设置基础移动速度(技能永久修改速度时调用) /// </summary> /// <param name="newSpeed">新的基础速度</param> public void SetBaseMoveSpeed(float newSpeed) { baseMoveSpeed = newSpeed; agent.speed = baseMoveSpeed + tempSpeedBonus; } /// <summary> /// 添加临时速度加成(技能buff类效果调用) /// </summary> /// <param name="bonus">加成数值</param> public void AddTempSpeedBonus(float bonus) { tempSpeedBonus += bonus; agent.speed = baseMoveSpeed + tempSpeedBonus; } /// <summary> /// 移除临时速度加成(buff结束时调用) /// </summary> /// <param name="bonus">要移除的加成数值</param> public void RemoveTempSpeedBonus(float bonus) { tempSpeedBonus = Mathf.Max(0, tempSpeedBonus - bonus); agent.speed = baseMoveSpeed + tempSpeedBonus; } } }
新手开发建议
- 变量命名遵循驼峰命名法(如
baseMoveSpeed而非BaseMoveSpeed),提升代码可读性。 - 技能系统修改速度时,只需获取PlayerController组件调用对应方法即可,示例:
// 技能给玩家添加3点临时速度加成,持续5秒 PlayerController player = FindObjectOfType<PlayerController>(); player.AddTempSpeedBonus(3f); Invoke(nameof(RemoveSpeedBonus), 5f); void RemoveSpeedBonus() { player.RemoveTempSpeedBonus(3f); } - 确保场景中已正确烘焙NavMesh,否则点击移动功能会失效。
内容的提问来源于stack exchange,提问作者Ethan Ohmer
相关产品推荐
相关产品推荐

