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

Unity 2021.1.24f1版本下2D Sprite点击移动功能实现咨询

适配Unity版本:2021.1.24f1

你现有脚本存在几个核心问题:

  • 2D项目误用了3D的Rigidbody组件,应该用Rigidbody2D,否则会报空引用错误
  • transform.forward是3D空间的Z轴方向参数,不适用于2D项目,且你使用的语法完全错误,transform.forward不是方法,不能直接传参调用
  • 没有判断鼠标是否点击在目标Sprite上,点击屏幕任意位置都会触发移动逻辑
  • 未实现点击上移15像素的需求,现有代码里的移动方向也全部错误,左键和中键写的(0,-1)是向下移动,和需求不符

前置配置

给你的目标Sprite挂载两个必备组件:

  • Rigidbody2D:将重力缩放(Gravity Scale)设置为0,避免Sprite自动下落
  • 对应形状的Collider2D(比如BoxCollider2D、CircleCollider2D),确保碰撞体范围完全覆盖Sprite显示区域

修正后完整代码

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    private Rigidbody2D m_Rigidbody;
    // 移动速度,可在Inspector面板直接调整
    public float moveSpeed = 5f;
    // Unity默认1单位=100像素,15像素对应0.15单位,若你的项目Pixels Per Unit不是100自行换算调整
    private const float ClickUpOffset = 0.15f;

    void Start()
    {
        m_Rigidbody = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        // 仅当鼠标悬停在当前Sprite上时,响应点击逻辑
        if (IsMouseOverSprite())
        {
            // 鼠标左键点击:向上移动15像素
            if (Input.GetMouseButtonDown(0))
            {
                transform.Translate(Vector2.up * ClickUpOffset, Space.World);
            }
        }

        // 水平、垂直方向移动控制(默认适配WASD、方向键)
        float horizontalInput = Input.GetAxis("Horizontal");
        float verticalInput = Input.GetAxis("Vertical");
        m_Rigidbody.velocity = new Vector2(horizontalInput * moveSpeed, verticalInput * moveSpeed);
    }

    // 检测鼠标是否位于当前Sprite上方的工具方法
    private bool IsMouseOverSprite()
    {
        Vector2 mouseWorldPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        return GetComponent<Collider2D>().OverlapPoint(mouseWorldPosition);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:24:07