ccl4/blueberryPeak/Assets/Wwise/Timeline/Editor/AkEventPlayableInspector.cs
AgentSchmisch 9144907a10 ANGST
2025-06-12 18:45:34 +02:00

212 lines
7.7 KiB
C#

#if UNITY_EDITOR
#if !UNITY_2019_1_OR_NEWER
#define AK_ENABLE_TIMELINE
#endif
#if AK_ENABLE_TIMELINE
/*******************************************************************************
The content of this file includes portions of the proprietary AUDIOKINETIC Wwise
Technology released in source code form as part of the game integration package.
The content of this file may not be used without valid licenses to the
AUDIOKINETIC Wwise Technology.
Note that the use of the game engine is subject to the Unity(R) Terms of
Service at https://unity3d.com/legal/terms-of-service
License Usage
Licensees holding valid licenses to the AUDIOKINETIC Wwise Technology may use
this file in accordance with the end user license agreement provided with the
software or, alternatively, in accordance with the terms contained
in a written agreement between you and Audiokinetic Inc.
Copyright (c) 2025 Audiokinetic Inc.
*******************************************************************************/
[System.Obsolete(AkUnitySoundEngine.Deprecation_2019_2_0)]
[UnityEditor.CustomEditor(typeof(AkEventPlayable))]
public class AkEventPlayableInspector : UnityEditor.Editor
{
private AkEventPlayable m_AkEventPlayable;
private UnityEditor.SerializedProperty akEvent;
private UnityEditor.SerializedProperty emitterObjectRef;
private UnityEditor.SerializedProperty retriggerEvent;
private UnityEditor.SerializedProperty UseWwiseEventDuration;
private UnityEditor.SerializedProperty StopEventAtClipEnd;
private UnityEditor.SerializedProperty blendInCurve;
private UnityEditor.SerializedProperty blendOutCurve;
public void OnEnable()
{
m_AkEventPlayable = target as AkEventPlayable;
if (m_AkEventPlayable == null)
return;
akEvent = serializedObject.FindProperty("akEvent");
emitterObjectRef = serializedObject.FindProperty("emitterObjectRef");
retriggerEvent = serializedObject.FindProperty("retriggerEvent");
UseWwiseEventDuration = serializedObject.FindProperty("UseWwiseEventDuration");
StopEventAtClipEnd = serializedObject.FindProperty("StopEventAtClipEnd");
blendInCurve = serializedObject.FindProperty("blendInCurve");
blendOutCurve = serializedObject.FindProperty("blendOutCurve");
}
public override void OnInspectorGUI()
{
UnityEditor.EditorGUILayout.HelpBox(AkUnitySoundEngine.Deprecation_2019_2_0, UnityEditor.MessageType.Warning);
serializedObject.Update();
UnityEngine.GUILayout.Space(UnityEditor.EditorGUIUtility.standardVerticalSpacing);
using (new UnityEditor.EditorGUILayout.VerticalScope("box"))
{
UnityEditor.EditorGUILayout.PropertyField(akEvent, new UnityEngine.GUIContent("Event: "));
UnityEditor.EditorGUILayout.PropertyField(emitterObjectRef, new UnityEngine.GUIContent("Override Track Object: "));
UnityEditor.EditorGUILayout.PropertyField(blendInCurve);
UnityEditor.EditorGUILayout.PropertyField(blendOutCurve);
}
using (new UnityEditor.EditorGUILayout.VerticalScope("box"))
{
UnityEditor.EditorGUILayout.PropertyField(UseWwiseEventDuration, new UnityEngine.GUIContent("Use Wwise Event Duration: ", "The clip duration is set to the duration of the Wwise Event"));
if (!UpdateClipInformation(m_AkEventPlayable.owningClip, m_AkEventPlayable.akEvent, serializedObject, UseWwiseEventDuration.boolValue))
{
UnityEditor.EditorGUILayout.HelpBox(string.Format("The duration of the Wwise event \"{0}\" has not been determined. Playback for this event may be inconsistent. " +
"Ensure that the event is associated with a generated SoundBank!", m_AkEventPlayable.akEvent.Name), UnityEditor.MessageType.Warning);
}
if (!UseWwiseEventDuration.boolValue)
{
var StopEventAtClipEndValue = StopEventAtClipEnd.boolValue;
var retriggerEventValue = retriggerEvent.boolValue;
UnityEditor.EditorGUILayout.PropertyField(StopEventAtClipEnd, new UnityEngine.GUIContent("Stop Event At End of clip: "));
UnityEditor.EditorGUILayout.PropertyField(retriggerEvent, new UnityEngine.GUIContent("Loop: ", "When checked, an event will loop until the end of the clip."));
if (retriggerEvent.boolValue && !StopEventAtClipEnd.boolValue)
{
if (!retriggerEventValue)
StopEventAtClipEnd.boolValue = true;
else if (StopEventAtClipEndValue)
retriggerEvent.boolValue = false;
}
}
}
serializedObject.ApplyModifiedProperties();
}
private static void UpdateProgressBar(int index, int count)
{
float progress = (float)index / count;
UnityEditor.EditorUtility.DisplayProgressBar("Wwise Integration", "Fixing clip durations of AkEventPlayables...", progress);
}
[UnityEditor.InitializeOnLoadMethod]
public static void SetupSoundbankSetting()
{
if (UnityEditor.AssetDatabase.IsAssetImportWorkerProcess())
{
return;
}
string[] settingsToEnable = { "SoundBankGenerateEstimatedDuration" };
AkUtilities.ToggleBoolSoundbankSettingInWproj(settingsToEnable, AkWwiseEditorSettings.WwiseProjectAbsolutePath, true);
UnityEditor.EditorApplication.delayCall += UpdateAllClips;
WwiseProjectDatabase.SoundBankDirectoryUpdated += UpdateAllClips;
}
private static void UpdateAllClips()
{
var guids = UnityEditor.AssetDatabase.FindAssets("t:AkEventPlayable", new[] { "Assets" });
if (guids.Length < 1)
return;
var processedGuids = new System.Collections.Generic.HashSet<string>();
for (var i = 0; i < guids.Length; i++)
{
UpdateProgressBar(i, guids.Length);
var guid = guids[i];
if (processedGuids.Contains(guid))
continue;
processedGuids.Add(guid);
var path = UnityEditor.AssetDatabase.GUIDToAssetPath(guid);
var objects = UnityEditor.AssetDatabase.LoadAllAssetsAtPath(path);
var instanceIds = new System.Collections.Generic.List<int>();
foreach (var obj in objects)
{
if (obj == null)
continue;
var id = obj.GetInstanceID();
if (!instanceIds.Contains(id))
instanceIds.Add(id);
}
for (; instanceIds.Count > 0; instanceIds.RemoveAt(0))
{
var id = instanceIds[0];
objects = UnityEditor.AssetDatabase.LoadAllAssetsAtPath(path);
foreach (var obj in objects)
{
if (obj && obj.GetInstanceID() == id)
{
var playable = obj as AkEventPlayable;
if (playable)
{
var serializedObject = new UnityEditor.SerializedObject(playable);
var setClipDuration = serializedObject.FindProperty("UseWwiseEventDuration").boolValue;
UpdateClipInformation(playable.owningClip, playable.akEvent, serializedObject, setClipDuration);
serializedObject.ApplyModifiedProperties();
}
break;
}
}
}
}
UnityEditor.EditorUtility.ClearProgressBar();
}
/// <summary>
/// The minimum clip duration. This value is set to 1/60 of a second which generally represents the time of 1 frame.
/// </summary>
private const double MinimumDurationInSeconds = 1.0 / 60;
/// <summary>
/// Updates the associated clip information and the event durations.
/// </summary>
/// <returns>Returns true if the Wwise event is found in the project data.</returns>
private static bool UpdateClipInformation(UnityEngine.Timeline.TimelineClip clip, AK.Wwise.Event akEvent,
UnityEditor.SerializedObject serializedObject, bool setClipDuration)
{
var clipDuration = MinimumDurationInSeconds;
var eventInfo = AkWwiseProjectInfo.GetData().GetEventInfo(akEvent.Id);
if (eventInfo != null)
{
serializedObject.FindProperty("eventDurationMin").floatValue = eventInfo.minDuration;
serializedObject.FindProperty("eventDurationMax").floatValue = eventInfo.maxDuration;
if (eventInfo.maxDuration > clipDuration)
clipDuration = eventInfo.maxDuration;
}
if (clip != null)
{
clip.displayName = akEvent.Name;
if (setClipDuration)
clip.duration = clipDuration;
}
return eventInfo != null && eventInfo.maxDuration > 0;
}
}
#endif // AK_ENABLE_TIMELINE
#endif //#if UNITY_EDITOR