You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:09:24