【问题标题】:Show UI in front of player Unity VR在玩家 Unity VR 面前显示 UI
【发布时间】:2022-11-30 18:22:23
【问题描述】:

我试图在 Unity3D VR 项目中始终在播放器面前显示一个 UI,并面对它。我正在使用 Unity 2021.3.5f1。

我有一个简单的 UI:一个 Canvas,里面有一个 Panel 和两个 TextMeshPro。 Canvas 是空游戏对象的子对象,其中包含管理 UI 的脚本。层次结构如下:

我的目标是始终将 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 Vector3 _playerHeadForward;

        private void Awake()
        {
            _playerHeadForward = playerHead.forward;
        }

        private void Update()
        {          
            // show the panel in front of the player
            var position = playerHead.position;
            panel.transform.position = position + new Vector3(_playerHeadForward.x, yOffset, _playerHeadForward.z).normalized * spawnDistance;
            
            // rotate the panel to face the player frame by frame
            panel.transform.LookAt(new Vector3(position.x, panel.transform.position.y, position.z));
            panel.transform.forward *= -1;
        }
    }
}

然而,它不能正常工作:它正确地在玩家面前,但它在移动时并不跟随玩家的相机本身。在 Unity 编辑器中,我将包含我的 UI 的 Canvas 引用为脚本中的面板 GameObject,并将 XROriginMainCamera 引用为脚本中的 playerHead Transform

谁能帮我?

【问题讨论】:

    标签: c# unity3d virtual-reality


    【解决方案1】:

    您可以使用 Transform 的 TransformPoint() 将位置从本地空间转换为世界空间

    以下内容适用于您的情况

    Vector3 offset = new Vector3(0,0,2); // 2 units in front of camera
    panel.transform.position = playerHead.TransformPoint(offset);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多