Unity中Sprite无法移动至鼠标点击位置问题求助
Unity Sprite点击后消失问题解决
问题场景
用户编写了如下Unity脚本,期望点击鼠标时Sprite移动到点击位置,但运行后Sprite直接消失:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class UnitMove : MonoBehaviour { // Update is called once per frame void Update() { if (Input.GetMouseButtonDown(0)) { Vector3 MousePos = Input.mousePosition; GetComponent<Transform>().position = (MousePos); } } }
问题原因
Input.mousePosition返回的是屏幕像素坐标(X/Y对应屏幕宽高范围,Z轴固定为0),而Transform.position需要的是世界空间坐标。直接赋值会让Sprite的Z轴坐标变为0,若你的相机是透视相机且Z轴位置大于0,Sprite会跑到相机后方,超出视锥体范围,所以看起来像是消失了。
解决方案
使用Camera.ScreenToWorldPoint()方法将屏幕坐标转换为世界坐标,同时指定合适的Z轴值,确保Sprite处于相机视锥体范围内。2D项目中,通常取相机到Sprite的距离作为Z值即可。
修正后的代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class UnitMove : MonoBehaviour { public Camera mainCamera; void Start() { mainCamera ??= Camera.main; } void Update() { if (Input.GetMouseButtonDown(0)) { Vector3 mouseScreenPos = Input.mousePosition; // 设置Z轴为相机与Sprite的距离,确保在相机前方 mouseScreenPos.z = Mathf.Abs(mainCamera.transform.position.z); Vector3 targetWorldPos = mainCamera.ScreenToWorldPoint(mouseScreenPos); // 直接使用transform属性,无需重复GetComponent transform.position = targetWorldPos; } } }
额外提示
- 2D项目中可根据视角需求,固定targetWorldPos的某一轴(比如侧视图固定Y轴)。
- 避免重复调用
GetComponent<Transform>(),直接使用transform属性更高效。
内容的提问来源于stack exchange,提问作者Soulsicle
相关产品推荐
相关产品推荐

