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 つだけ使用できますが、一緒に使用する場合は、まだ試したことがないので、興味のある友達が試してみてください。