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
相关产品推荐
相关产品推荐

