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

Unity VR项目中UI始终显示在玩家前方并面向玩家的问题求助

解决VR UI无法跟随玩家相机移动的问题

问题根源

你的代码中_playerHeadForward仅在Awake方法中赋值了一次,记录的是游戏启动时玩家相机的初始前方向。但玩家移动或旋转相机时,这个变量不会同步更新,导致UI的位置始终基于初始方向计算,无法跟随相机实时移动。

修复步骤

  1. 移除固定的初始方向变量:不需要在Awake中存储_playerHeadForward,而是在Update中实时获取当前相机的前方向。
  2. 优化位置计算逻辑:直接使用相机当前的前方向计算UI位置,确保每帧都更新到相机前方。
  3. 确认Canvas渲染模式:确保你的Canvas的Render Mode设置为World Space,这是VR世界空间UI的必要设置。

修复后的完整代码

using UnityEngine;

namespace UI
{
    public class KpPanelManager : MonoBehaviour
    {
        [SerializeField] private Transform playerHead;
        [SerializeField] private float spawnDistance = 2f;
        [SerializeField] private float yOffset = 0f;
        
        [SerializeField] private GameObject panel;

        private void Update()
        {          
            // 实时获取相机当前的前方向,忽略Y轴避免UI上下倾斜
            Vector3 currentForward = Vector3.Scale(playerHead.forward, new Vector3(1, 0, 1)).normalized;
            
            // 计算UI位置:相机位置 + 偏移Y + 前方向×距离
            Vector3 targetPosition = playerHead.position + Vector3.up * yOffset + currentForward * spawnDistance;
            panel.transform.position = targetPosition;
            
            // 让UI始终面向相机,保持水平方向对齐
            Vector3 lookAtPosition = new Vector3(playerHead.position.x, panel.transform.position.y, playerHead.position.z);
            panel.transform.LookAt(lookAtPosition);
        }
    }
}

代码说明

  • Vector3.Scale用来移除前方向的Y轴分量,避免UI随着相机抬头低头而上下倾斜,保持水平正对玩家。
  • 每帧实时计算currentForward,确保UI位置始终跟随相机的当前朝向。
  • 简化了位置计算的写法,逻辑更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:45:27