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

Unity 2D中能否实现单击选中对象并跟随光标功能?

Unity 2D 单击选中并跟随光标实现方案

可行性说明

完全可行,无需依赖Unity内置拖拽系统,通过基础的鼠标输入检测与坐标转换就能实现需求。

所需组件

不需要强制使用Rigidbody2D,除非你的对象需要和物理系统交互(比如碰撞响应、受力模拟等)。核心仅需:

  • Collider2D(任意2D碰撞体组件,如BoxCollider2D、CircleCollider2D):用于判定鼠标点击是否命中目标对象
  • 自定义C#脚本:处理点击状态切换与光标跟随逻辑

具体实现步骤

  1. 给目标2D对象添加Collider2D组件,确保Is Trigger未勾选(若无需触发事件)
  2. 创建C#脚本(例如命名为ClickFollow.cs),挂载到目标对象上
  3. 编写脚本逻辑:
    • 用布尔变量维护选中状态
    • 检测鼠标左键单击事件,判断点击是否命中当前对象
    • 切换选中状态时启动/停止跟随逻辑
    • 在Update方法中处理光标跟随

示例代码

using UnityEngine;

public class ClickFollow : MonoBehaviour
{
    private bool isSelected = false;
    private Camera mainCamera;

    void Start()
    {
        mainCamera = Camera.main;
    }

    void Update()
    {
        // 检测鼠标左键单击
        if (Input.GetMouseButtonDown(0))
        {
            // 将鼠标屏幕坐标转换为2D世界坐标
            Vector2 mouseWorldPos = mainCamera.ScreenToWorldPoint(Input.mousePosition);
            // 射线检测点击位置是否命中当前对象
            RaycastHit2D hit = Physics2D.Raycast(mouseWorldPos, Vector2.zero);

            if (hit.collider != null && hit.collider.gameObject == gameObject)
            {
                // 切换选中状态
                isSelected = !isSelected;
            }
            else if (isSelected)
            {
                // 点击空白区域取消选中(可根据需求移除该逻辑)
                isSelected = false;
            }
        }

        // 选中状态下让对象跟随光标
        if (isSelected)
        {
            Vector2 targetPos = mainCamera.ScreenToWorldPoint(Input.mousePosition);
            // 保持对象z轴位置不变,避免被相机遮挡
            targetPos.z = transform.position.z;
            transform.position = targetPos;
        }
    }
}

注意事项

  • 确保场景内有Main Camera,且相机Projection设置为Orthographic(2D场景默认配置)
  • 若多个对象需要此功能,给每个对象单独挂载该脚本即可
  • 若仅允许再次点击对象取消选中,移除示例中else if (isSelected)部分的逻辑即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:14:56