Unity运行时UI按钮位置异常问题求助
问题描述
我正在开发一款战争游戏,需要在屏幕顶部设置UI按钮,用于从基地召唤玩家部队,但运行时按钮的位置与预期不符。
运行前按钮位置

这是我设置的按钮位置,也是预期的运行时显示效果。
运行后按钮位置

这是游戏运行后的实际效果。
按钮仍会跟随相机移动,但位置不符合预期。请问我忽略了什么?以下是我编写的代码:
public class CameraMovement : MonoBehaviour { public float CameraSpeed; [SerializeField] public GameObject[] ButtonTest; private void Update() { float CameraMovement = Input.GetAxis("Horizontal"); Vector3 Movement = new Vector3(CameraMovement * CameraSpeed * Time.deltaTime,0,-10); transform.Translate(Movement); transform.position = new Vector3(Mathf.Clamp(transform.position.x, -16.5f, 16.5f),0,-10); Follow(); } private void Follow() { foreach (GameObject Buttons in ButtonTest) { Vector3 NewPositions = Buttons.transform.position; Vector3 ButtonsPosition = new Vector3(transform.position.x, NewPositions.y, NewPositions.z); Buttons.transform.position = ButtonsPosition; Debug.Log("position is " + Buttons.transform.position); } } }
问题原因与解决方案
你犯了典型的UI设计误区:把UI按钮当成世界空间物体处理,而非用Unity的UI系统(Canvas)实现屏幕固定UI。
核心问题
当前按钮是普通GameObject,通过代码同步相机X轴位置来模拟“屏幕固定”,但本质是让按钮在3D世界中跟随相机移动,一旦相机视角或位置变化,就会出现偏移。真正的屏幕UI应脱离世界空间,直接渲染在屏幕层面。
正确解决方案
- 创建Canvas,将其Render Mode设置为:
- Screen Space - Overlay:按钮直接固定在屏幕上,无需关联相机
- Screen Space - Camera:需关联主相机,按钮会渲染在相机前方的固定平面上
- 将按钮作为Canvas的子物体,使用Unity内置的Button组件,而非普通GameObject
- 删除代码中的
Follow()方法及所有按钮位置同步逻辑——Canvas会自动处理屏幕固定,无需手动同步相机位置
代码失效的原因
你当前的逻辑绑定了按钮与相机的X轴,但按钮和相机的Z轴深度一致(均为-10),导致两者处于同一平面,渲染时出现透视偏移或位置错乱。即便Z轴不同,世界空间物体的位置也会受相机视锥体影响,无法精准固定在屏幕顶部。
内容的提问来源于stack exchange,提问作者RGVC
相关产品推荐
相关产品推荐

