Unity ゲーム フレームワーク - コンポーネント拡張 - UI コンポーネント拡張

UI コンポーネントは UGF の最も一般的に使用されるコンポーネントの 1 つであり、UI コンポーネントとインターフェイス グループ Group は UIComponent インターフェイス コンポーネント内に作成されます。

3DUI機能拡張

VR ゲームをプレイする場合、3D UI はシーン内の固定位置に存在するか、オブジェクトに追従することがあります。このとき、UIの座標はVector3.zeroではなくなり、フレームコンポーネントのUIには階層関係が存在しません。
UI 階層から、Group グループが UI Form Instances の下にあることがわかります。この時点で、グループの親オブジェクトと座標を変更して、目的の機能を実現できます。
UI3DComponent コンポーネントを作成し、UIComponent を継承して
次の辞書、Group 名とゲーム オブジェクトの対応関係を作成し、
プライベート Dictionary<string, Transform> CustomUIGroupHelpers を awake で初期化し、
Addgroup(string uiGroupName, int Depth) メソッドを書き換えます。
Add(uiGroupName, Transform);
次に、ChangeGroupPos(string uiGroupName, Transformparents) メソッドを作成します。シーンの切り替えが完了したら、ChangeGroupPos を呼び出して Group グループの親オブジェクトの親を変更して完了します3DUI 関数。必要に応じて、親を渡します。さらに、グループの座標も渡すことができます。インターフェイスがフローティングの場合は、親にフォローアップ ロジックを追加できます。
シーンを切り替える必要がある場合は、損失を防ぐために ReGroupPos を呼び出してグループをフレームに復元します。

using GameFramework;
using System.Collections.Generic;
using UnityEngine;
namespace UnityGameFramework.Runtime
{
    
    
    /// <summary>
    /// 界面组件。
    /// </summary>
    [DisallowMultipleComponent]
    [AddComponentMenu("Game Framework/UI3D")]
    public class UI3DComponent : UIComponent
    {
    
    
        private Dictionary<string, Transform> CustomUIGroupHelpers;
        private float Scale = 0.001f;
        /// <summary>
        /// 游戏框架组件初始化。
        /// </summary>
        protected override void Awake()
        {
    
    
            base.Awake();
            CustomUIGroupHelpers = new Dictionary<string, Transform>();
        }
        /// <summary>
        /// 增加界面组。
        /// </summary>
        /// <param name="uiGroupName">界面组名称。</param>
        /// <param name="depth">界面组深度。</param>
        /// <returns>是否增加界面组成功。</returns>
        public override bool AddUIGroup(string uiGroupName, int depth)
        {
    
    
            if (m_UIManager.HasUIGroup(uiGroupName))
            {
    
    
                return false;
            }
            UIGroupHelperBase uiGroupHelper = Helper.CreateHelper(m_UIGroupHelperTypeName, m_CustomUIGroupHelper, UIGroupCount);
            if (uiGroupHelper == null)
            {
    
    
                Log.Error("Can not create UI group helper.");
                return false;
            }
            uiGroupHelper.name = Utility.Text.Format("UI Group - {0}", uiGroupName);
            uiGroupHelper.gameObject.layer = LayerMask.NameToLayer("UI");
            Transform transform = uiGroupHelper.transform;
            transform.SetParent(m_InstanceRoot);
            transform.localPosition = Vector3.zero;
            transform.localEulerAngles = Vector3.zero;
            transform.localScale = Vector3.one * Scale;
            CustomUIGroupHelpers.Add(uiGroupName, transform);
            return m_UIManager.AddUIGroup(uiGroupName, depth, uiGroupHelper);
        }
        /// <summary>
        /// 改变界面组坐标
        /// </summary>
        /// <param name="uiGroupName">界面组名称。</param>
        /// <param name="depth">界面组父物体。</param>
        public bool ChangeGroupPos(string uiGroupName, Transform parents)
        {
    
    
            if (!m_UIManager.HasUIGroup(uiGroupName))
            {
    
    
                return false;
            }
            Transform transform = CustomUIGroupHelpers[uiGroupName];
            if (transform == null)
            {
    
    
                Log.Error("Can not find UI group helper.");
                return false;
            }
            transform.SetParent(parents);
            transform.localPosition = Vector3.zero;
            transform.localEulerAngles = Vector3.zero;
            transform.localScale = Vector3.one;
            return true;
        }
        /// <summary>
        /// 恢复界面组层级
        /// </summary>
        /// <param name="uiGroupName">界面组名称。</param>
        /// <param name="depth">界面组父物体。</param>
        public bool ReGroupPos(string uiGroupName)
        {
    
    
            if (!m_UIManager.HasUIGroup(uiGroupName))
            {
    
    
                return false;
            }
            Transform transform = CustomUIGroupHelpers[uiGroupName];
            if (transform == null)
            {
    
    
                Log.Error("Can not find UI group helper.");
                return false;
            }
            transform.SetParent(m_InstanceRoot);
            transform.localPosition = Vector3.zero;
            transform.localEulerAngles = Vector3.zero;
            transform.localScale = Vector3.one;
            return true;
        }
    }
}

コードが完成すると、元の UI コンポーネントが置き換えられ、コード内の登録ロジックも UI3D に変更されます。
GameEntry.組み込み

  /// <summary>
    /// 获取界面组件。
    /// </summary>
    public static UI3DComponent UI3D
    {
    
    
        get;
        private set;
    }

ここに画像の説明を挿入

上記のスクリプトを作成して呼び出した後、初期座標が一致していないことがわかります。次に、スクリプト DefaultUIFormHelper を開き、CreateUIForm メソッドでローカル座標をリセットします
transform.localPosition = Vector3.zero;
transform.localEulerAngles = Vector3.zero;
注: 3Dgroup の下の UI はワールド スペースに設定する必要があります。通常、3DUI と 2DUI は 1 つだけ使用できますが、一緒に使用する場合は、まだ試したことがないので、興味のある友達が試してみてください。

おすすめ

転載: blog.csdn.net/qq_37619255/article/details/129186961