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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:20:32