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

Unity2D对象点击消失且无法跟随鼠标拖拽的问题求助

Unity2D 拖拽投掷物体问题修复

问题根源分析

你的脚本存在三个核心问题,导致功能异常且未实现投掷效果:

  • 对象消失:ScreenToWorldPoint转换鼠标位置时未指定Z轴值,2D物体默认在Z=0平面,相机通常在Z负半轴,转换后的Z值会让物体跑到相机后方,超出渲染范围。
  • 拖拽中断:仅在OnMouseDown中执行一次位置更新,未在选中状态下持续跟踪鼠标位置;同时Selected的判断逻辑冗余,导致状态切换异常。
  • 缺失投掷逻辑:松开鼠标时未给物体赋予物理速度,无法实现投掷效果。

修复后的完整代码

using UnityEngine;

public class DragAndThrow : MonoBehaviour
{
    private Transform _transform;
    private Rigidbody2D _rb2D;
    private bool _isSelected;
    // 记录鼠标与物体锚点的偏移,避免拖拽时物体瞬移到鼠标中心
    private Vector3 _mouseOffset;

    void Start()
    {
        _transform = GetComponent<Transform>();
        _rb2D = GetComponent<Rigidbody2D>();
        // 拖拽时禁用物理效果,避免重力干扰
        _rb2D.isKinematic = true;
    }

    private void OnMouseDown()
    {
        _isSelected = true;
        // 计算鼠标与物体的位置偏移
        Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        mouseWorldPos.z = 0; // 固定Z轴在2D渲染平面
        _mouseOffset = _transform.position - mouseWorldPos;
    }

    private void OnMouseUp()
    {
        if (!_isSelected) return;
        
        _isSelected = false;
        _rb2D.isKinematic = false;
        // 根据鼠标移动速度计算投掷速度
        Vector3 currentMousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        currentMousePos.z = 0;
        Vector3 targetPos = currentMousePos + _mouseOffset;
        Vector3 throwVelocity = (targetPos - _transform.position) / Time.deltaTime;
        _rb2D.velocity = throwVelocity;
    }

    private void Update()
    {
        if (!_isSelected) return;
        
        // 持续更新物体位置,跟随鼠标移动
        Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        mouseWorldPos.z = 0;
        _transform.position = mouseWorldPos + _mouseOffset;
    }
}

关键修复说明

  • 解决对象消失:每次转换鼠标位置时强制设置z=0,确保物体始终处于2D渲染平面内,不会被移出相机视野。
  • 修复拖拽中断:在Update中持续检测选中状态,实时更新物体位置;添加_mouseOffset变量,让物体跟随鼠标拖拽时保持初始偏移,提升操作手感。
  • 实现物理投掷:松开鼠标时启用物体的物理组件,根据鼠标最后一帧的移动速度计算投掷速度,赋予Rigidbody2D的velocity属性,实现符合物理规则的投掷效果。
  • 优化逻辑结构:简化选中状态的判断逻辑,提前获取Rigidbody2D引用(需确保物体已添加该组件),拖拽时禁用物理模拟避免重力干扰。

额外注意事项

  • 确保你的2D物体已添加Rigidbody2D组件,且SpriteRenderer的Sorting Layer和Order in Layer设置正确,避免被其他物体遮挡。
  • 如果场景中使用的不是默认主相机,需将Camera.main替换为你的目标相机引用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:31:10