如何实现用户点击时对象跟随鼠标位置,点击显示Image松开消失
原有代码的问题
OnMouseDown是Unity的碰撞检测回调,只有当鼠标点击到挂载该脚本、且带有碰撞体/UGUI射线检测组件的对象时才会触发,无法响应全局的鼠标按下事件- 现有逻辑是点击时销毁脚本挂载的对象,和「按下显示Image、松开隐藏」的需求完全相反
- 重复判断了
Input.GetMouseButtonDown(0):OnMouseDown本身就对应左键按下的触发时机,额外加判断完全冗余
实现方案(推荐用SetActive实现,避免反复销毁重建的性能开销)
前置准备
- 在你的UI Canvas下创建需要显示的Image对象,调整好尺寸、贴图属性,默认将其设置为隐藏状态
- 将后续编写的脚本挂载到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
相关产品推荐
相关产品推荐

