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

如何实现用户点击时对象跟随鼠标位置,点击显示Image松开消失

原有代码的问题

  • OnMouseDown是Unity的碰撞检测回调,只有当鼠标点击到挂载该脚本、且带有碰撞体/UGUI射线检测组件的对象时才会触发,无法响应全局的鼠标按下事件
  • 现有逻辑是点击时销毁脚本挂载的对象,和「按下显示Image、松开隐藏」的需求完全相反
  • 重复判断了Input.GetMouseButtonDown(0):OnMouseDown本身就对应左键按下的触发时机,额外加判断完全冗余

实现方案(推荐用SetActive实现,避免反复销毁重建的性能开销)

前置准备

  1. 在你的UI Canvas下创建需要显示的Image对象,调整好尺寸、贴图属性,默认将其设置为隐藏状态
  2. 将后续编写的脚本挂载到Canvas或任意全局常驻对象上,把提前做好的Image拖到脚本的对应公共参数栏中

代码实现

using UnityEngine;
using UnityEngine.UI;

public class MousePopImage : MonoBehaviour
{
    // 提前配置好的目标Image
    public Image targetImage;

    private void Update()
    {
        // 监听鼠标左键按下
        if (Input.GetMouseButtonDown(0))
        {
            // 显示Image
            targetImage.gameObject.SetActive(true);
            // 转换屏幕鼠标坐标为UGUI本地坐标
            RectTransformUtility.ScreenPointToLocalPointInRectangle(
                transform as RectTransform, 
                Input.mousePosition, 
                null, 
                out Vector2 localPoint
            );
            // 更新Image位置到光标处
            targetImage.transform.localPosition = localPoint;
        }
        // 监听鼠标左键松开
        else if (Input.GetMouseButtonUp(0))
        {
            // 隐藏Image
            targetImage.gameObject.SetActive(false);
        }
    }
}

SetActive方法说明

gameObject.SetActive(布尔值)是Unity控制对象显隐的标准方法:

  • 传true时激活对象,显示其渲染内容、启用所有挂载的组件
  • 传false时隐藏对象,暂停其所有组件的运行,不会销毁对象占用的内存,适合需要频繁切换显隐的场景

如果坚持要用「按下生成、松开销毁」的逻辑,只需要把按下的逻辑换成Instantiate生成Image预制件、保存生成的对象引用,松开时调用Destroy(生成的对象)即可,整体性能弱于SetActive方案,不推荐高频使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:57:03