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
相关产品推荐
相关产品推荐

