Files
ApexSurgery/Assets/Oculus/Voice/Lib/Wit.ai/Scripts/Runtime/Utilities/VoiceServiceReference.cs
T
2025-07-04 20:33:06 +03:00

91 lines
2.8 KiB
C#

/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
* All rights reserved.
*
* This source code is licensed under the license found in the
* LICENSE file in the root directory of this source tree.
*/
using System;
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace Meta.WitAi.Utilities
{
[Serializable]
public struct VoiceServiceReference
{
[SerializeField] internal VoiceService voiceService;
public VoiceService VoiceService
{
get
{
if (!voiceService)
{
VoiceService[] services = Resources.FindObjectsOfTypeAll<VoiceService>();
if (services != null)
{
// Set as first instance that isn't a prefab
voiceService = Array.Find(services, (o) => o.gameObject.scene.rootCount != 0);
}
}
return voiceService;
}
}
}
#if UNITY_EDITOR
[CustomPropertyDrawer(typeof(VoiceServiceReference))]
public class VoiceServiceReferenceDrawer : PropertyDrawer
{
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
return EditorGUIUtility.singleLineHeight;
}
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
var refProp = property.FindPropertyRelative("voiceService");
var reference = refProp.objectReferenceValue as VoiceService;
var voiceServices = GameObject.FindObjectsOfType<VoiceService>();
var voiceServiceNames = new string[voiceServices.Length + 1];
int index = 0;
voiceServiceNames[0] = "Autodetect";
if (voiceServices.Length == 1)
{
voiceServiceNames[0] = $"{voiceServiceNames[0]} - {voiceServices[0].name}";
}
for (int i = 0; i < voiceServices.Length; i++)
{
voiceServiceNames[i + 1] = voiceServices[i].name;
if (voiceServices[i] == reference)
{
index = i + 1;
}
}
EditorGUI.BeginProperty(position, label, property);
var updatedIndex = EditorGUI.Popup(position, index, voiceServiceNames);
if (index != updatedIndex)
{
if (updatedIndex > 0)
{
refProp.objectReferenceValue = voiceServices[updatedIndex - 1];
}
else
{
refProp.objectReferenceValue = null;
}
property.serializedObject.ApplyModifiedProperties();
}
EditorGUI.EndProperty();
}
}
#endif
}