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

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应脱离世界空间,直接渲染在屏幕层面。

正确解决方案

  1. 创建Canvas,将其Render Mode设置为:
    • Screen Space - Overlay:按钮直接固定在屏幕上,无需关联相机
    • Screen Space - Camera:需关联主相机,按钮会渲染在相机前方的固定平面上
  2. 将按钮作为Canvas的子物体,使用Unity内置的Button组件,而非普通GameObject
  3. 删除代码中的Follow()方法及所有按钮位置同步逻辑——Canvas会自动处理屏幕固定,无需手动同步相机位置

代码失效的原因

你当前的逻辑绑定了按钮与相机的X轴,但按钮和相机的Z轴深度一致(均为-10),导致两者处于同一平面,渲染时出现透视偏移或位置错乱。即便Z轴不同,世界空间物体的位置也会受相机视锥体影响,无法精准固定在屏幕顶部。

内容的提问来源于stack exchange,提问作者RGVC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 10:22:12