Files
PrinceOfGlory/Packages/com.unity.xr.openxr/Editor/FeatureSupport/OpenXRFeatureSettingsEditor.cs
2026-03-03 03:15:46 +08:00

171 lines
5.4 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEngine;
using UnityEngine.XR.OpenXR;
using UnityEngine.XR.OpenXR.Features;
using UnityEditor;
namespace UnityEditor.XR.OpenXR.Features
{
internal class OpenXRFeatureSettingsEditor : EditorWindow
{
struct Styles
{
public static GUIStyle s_WrapTextLabel;
}
struct Content
{
public static GUIContent k_NoSelectionTitleContent = new GUIContent("OpenXR Feature Settings");
public static GUIContent k_NoSelectionHelpMsg = new GUIContent("There is no current feature selected for the this build target. Go to Player Settings->XR Plug-in Management->OpenXR to select a settings for a feature to edit.");
}
static void InitStyles()
{
if (Styles.s_WrapTextLabel == null)
{
Styles.s_WrapTextLabel = new GUIStyle(EditorStyles.label);
Styles.s_WrapTextLabel.wordWrap = true;
}
}
BuildTargetGroup activeBuildTarget;
string activeFeatureId = String.Empty;
Editor activeItemEditor = null;
OpenXRFeature featureToEdit = null;
OpenXRFeatureAttribute featureAttr = null;
GUIContent uiName;
GUIContent categoryName;
GUIContent partner;
GUIContent version;
string documentationLink;
bool itemDidChange = false;
internal BuildTargetGroup ActiveBuildTarget
{
get => activeBuildTarget;
set
{
if (value != activeBuildTarget)
{
activeBuildTarget = value;
itemDidChange = true;
Repaint();
}
}
}
internal string ActiveItem
{
get => activeFeatureId;
set
{
if (String.Compare(value, activeFeatureId, true) != 0)
{
activeFeatureId = value;
itemDidChange = true;
Repaint();
}
}
}
public void InitActiveItemInfo()
{
if (!itemDidChange)
return;
itemDidChange = false;
featureToEdit = null;
titleContent = Content.k_NoSelectionTitleContent;
activeItemEditor = null;
categoryName = null;
partner = null;
version = null;
documentationLink = null;
featureToEdit = FeatureHelpers.GetFeatureWithIdForBuildTarget(activeBuildTarget, activeFeatureId);
if (featureToEdit != null)
{
foreach (Attribute attr in Attribute.GetCustomAttributes(featureToEdit.GetType()))
{
if (attr is OpenXRFeatureAttribute)
{
featureAttr = (OpenXRFeatureAttribute)attr;
break;
}
}
if (featureAttr != null)
{
activeItemEditor = UnityEditor.Editor.CreateEditor(featureToEdit);
uiName = new GUIContent(featureAttr.UiName);
categoryName = new GUIContent($"Category: {featureAttr.Category.ToString()}");
partner = new GUIContent($"Author: {featureAttr.Company}");
version = new GUIContent($"Version: {featureAttr.Version}");
documentationLink = featureAttr.InternalDocumentationLink;
titleContent = uiName;
}
}
}
public void OnGUI()
{
InitStyles();
InitActiveItemInfo();
if (featureToEdit == null)
{
titleContent = Content.k_NoSelectionTitleContent;
EditorGUILayout.Space();
EditorGUILayout.BeginVertical();
EditorGUILayout.LabelField(Content.k_NoSelectionHelpMsg, Styles.s_WrapTextLabel);
EditorGUILayout.EndVertical();
return;
}
EditorGUILayout.Space();
EditorGUILayout.BeginVertical();
EditorGUILayout.LabelField("Feature Information", EditorStyles.boldLabel);
EditorGUILayout.Space();
EditorGUI.indentLevel += 1;
EditorGUILayout.LabelField(categoryName);
EditorGUILayout.LabelField(partner);
EditorGUILayout.LabelField(version);
EditorGUI.indentLevel -= 1;
EditorGUILayout.EndVertical();
if (activeItemEditor != null)
{
EditorGUILayout.BeginVertical();
EditorGUILayout.Space();
EditorGUILayout.LabelField("Feature Settings", EditorStyles.boldLabel);
EditorGUILayout.Space();
EditorGUI.indentLevel += 1;
activeItemEditor.OnInspectorGUI();
EditorGUI.indentLevel -= 1;
EditorGUILayout.EndVertical();
}
EditorGUILayout.Space();
if (!String.IsNullOrEmpty(documentationLink))
{
if (GUILayout.Button("Documentation", EditorStyles.linkLabel))
{
UnityEngine.Application.OpenURL(documentationLink);
}
}
}
}
}