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

Unity中如何实现鼠标悬停菜单选项时高亮对象移动到对应位置

带跟随高亮指示器的菜单实现方案

现有代码问题

你当前编写的代码存在参数传入错误:Vector3.MoveTowards 方法的入参要求为当前位置、目标位置、单帧最大移动距离,你传入的第二个参数为游戏对象本身,类型不匹配,且当前位置取值逻辑错误。

完整实现逻辑

  • 先为所有菜单项绑定悬停事件,鼠标进入某一菜单项时,记录该菜单项的Y轴坐标作为高亮指示器的移动目标
  • 高亮指示器控制脚本每帧执行位置插值逻辑,始终向当前记录的目标Y坐标移动,没有新的悬停触发时就会停在最后一次的目标位置

修正后的代码示例

菜单项悬停触发脚本(挂载到每个菜单项 GameObject 上)

public class MenuItemHover : MonoBehaviour
{
    // 提前在Inspector面板关联高亮背景的控制脚本实例
    public SelectionHighlightController highlightController;

    // 3D物体/2D碰撞体悬停用这个方法
    private void OnMouseEnter()
    {
        // 鼠标进入时更新高亮的目标Y坐标
        highlightController.UpdateTargetY(transform.position.y);
    }

    // 如果是UGUI UI元素,替换为下面的接口实现即可
    /*
    public void OnPointerEnter(PointerEventData eventData)
    {
        highlightController.UpdateTargetY(transform.position.y);
    }
    */
}

高亮指示器控制脚本(挂载到 SelectionBackground 对象上)

public class SelectionHighlightController : MonoBehaviour
{
    // 移动速度可在Inspector面板调整
    public float speed = 5f;
    private float _targetY;

    private void Start()
    {
        // 初始化默认高亮第一个菜单项的位置
        _targetY = transform.position.y;
    }

    private void Update()
    {
        // 每帧向目标Y坐标平滑移动,X、Z坐标保持原有值不变
        Vector3 currentPos = transform.position;
        transform.position = new Vector3(
            currentPos.x,
            Vector3.MoveTowards(currentPos, new Vector3(currentPos.x, _targetY, currentPos.z), Time.deltaTime * speed).y,
            currentPos.z
        );
    }

    // 供菜单项悬停事件调用,更新目标位置
    public void UpdateTargetY(float targetY)
    {
        _targetY = targetY;
    }
}

如果不需要平滑移动效果,直接在UpdateTargetY方法里给高亮背景的position.y赋值即可,无需Update帧循环插值。

内容的提问来源于stack exchange,提问作者Randolph

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:57:04