如何基于相机视图将Unity对象恢复至初始视觉位置?
解决Unity中相机跟随对象的视图内复位问题
问题场景
需要让test对象在左键点击时,回到相机视角内的初始固定位置,而非世界坐标的初始位置。当前相机跟随test移动,原代码存储世界坐标originalPos的方式,复位时会回到世界空间的初始点,不符合需求。尝试多种相机坐标转换方法(如WorldToScreenPoint、ViewportToWorldPoint等)均无效,甚至未移动对象就点击左键也会导致移位。
解决方案
核心是存储test相对于相机的位置偏移量,而非世界坐标。相机跟随移动时,其世界位置会变化,但对象与相机的相对位置关系固定,复位时基于当前相机位置加上偏移量,即可让对象回到相机视角内的初始位置。
修改后的代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class WalkParent : MonoBehaviour { GameObject test; // 存储test与相机的世界位置偏移量 Vector3 cameraRelativeOffset; [SerializeField] private Camera mainCamera; void Start() { test = GameObject.FindWithTag("TT"); // 计算初始状态下,test相对于相机的位置差值 cameraRelativeOffset = test.transform.position - mainCamera.transform.position; } void Update() { if (Input.GetButtonDown("Fire1")) { // 用当前相机位置加上偏移量,得到test的目标位置 test.transform.position = mainCamera.transform.position + cameraRelativeOffset; } } }
原方法无效原因说明
之前尝试的坐标转换方法(如WorldToViewportPoint)仅记录了视图空间的二维坐标(x,y),未保留对象到相机的Z轴深度信息。例如使用ViewportToWorldPoint时,若只传入视图坐标,Z值默认为0,会将对象放置在相机近裁剪面位置,导致移位。而存储相对偏移量的方式,直接保留了对象与相机在三维空间中的位置关系,无论相机如何移动,都能确保对象回到视角内的初始位置。
内容的提问来源于stack exchange,提问作者a3egd
相关产品推荐
相关产品推荐

