ccl4/blueberryPeak/Assets/Wwise/MonoBehaviour/Runtime/AkTriggerHandler.cs
AgentSchmisch 9144907a10 ANGST
2025-06-12 18:45:34 +02:00

255 lines
6.6 KiB
C#

#if ! (UNITY_DASHBOARD_WIDGET || UNITY_WEBPLAYER || UNITY_WII || UNITY_WIIU || UNITY_NACL || UNITY_FLASH || UNITY_BLACKBERRY) // Disable under unsupported platforms.
/*******************************************************************************
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.
*******************************************************************************/
public abstract class AkTriggerHandler : UnityEngine.MonoBehaviour
{
public const int AWAKE_TRIGGER_ID = 1151176110;
public const int START_TRIGGER_ID = 1281810935;
public const int DESTROY_TRIGGER_ID = unchecked((int)3936390293);
public const int ON_ENABLE_TRIGGER_ID = -320808462;
public const int ON_DISABLE_TRIGGER_ID = 716467161;
///Since our mask is a 32 bits integer, we can't have more than 32 triggers
public const int MAX_NB_TRIGGERS = 32;
///Will contain the types of all the triggers derived from AkTriggerBase at runtime
public static System.Collections.Generic.Dictionary<uint, string> triggerTypes = AkTriggerBase.GetAllDerivedTypes();
private bool didDestroy;
///List containing the enabled triggers.
public System.Collections.Generic.List<int> triggerList = new System.Collections.Generic.List<int> { START_TRIGGER_ID };
///This property is usefull only when used with colliders. When enabled, the target of the action will be the other colliding object. When disabled, it will be the current object.
public bool useOtherObject = false;
public abstract void HandleEvent(UnityEngine.GameObject in_gameObject);
#if UNITY_EDITOR
private bool pausedOnStart = false;
#endif
protected virtual void Awake()
{
RegisterTriggers(triggerList, HandleEvent);
}
#if UNITY_EDITOR
private void OnPause(UnityEditor.PauseState state)
{
if(pausedOnStart && state == UnityEditor.PauseState.Unpaused)
{
pausedOnStart = false;
UnityEditor.EditorApplication.pauseStateChanged -= OnPause;
if (UnityEditor.EditorApplication.isPlaying && (triggerList.Contains(START_TRIGGER_ID) || triggerList.Contains(AWAKE_TRIGGER_ID)))
{
HandleEvent(null);
}
}
}
#endif
protected virtual void Start()
{
#if UNITY_EDITOR
if (UnityEditor.EditorApplication.isPaused)
{
UnityEditor.EditorApplication.pauseStateChanged += OnPause;
pausedOnStart = true;
}
if (UnityEditor.BuildPipeline.isBuildingPlayer || AkUtilities.IsMigrating || UnityEditor.EditorApplication.isPaused)
{
return;
}
#endif
if (triggerList.Contains(START_TRIGGER_ID))
{
HandleEvent(null);
}
}
protected virtual void OnDestroy()
{
if (!didDestroy)
{
DoDestroy();
}
#if UNITY_EDITOR
UnityEditor.EditorApplication.pauseStateChanged -= OnPause;
#endif
}
public void DoDestroy()
{
UnregisterTriggers(triggerList, HandleEvent);
didDestroy = true;
}
public virtual void OnEnable()
{
if (triggerList.Contains(ON_ENABLE_TRIGGER_ID))
{
HandleEvent(null);
}
}
protected void RegisterTriggers(System.Collections.Generic.List<int> in_triggerList, AkTriggerBase.Trigger in_delegate)
{
#if UNITY_EDITOR
if (UnityEditor.BuildPipeline.isBuildingPlayer || AkUtilities.IsMigrating)
{
return;
}
#endif
foreach (uint triggerID in in_triggerList)
{
switch (triggerID)
{
case AWAKE_TRIGGER_ID:
case START_TRIGGER_ID:
case unchecked((uint)DESTROY_TRIGGER_ID):
case unchecked((uint)ON_ENABLE_TRIGGER_ID):
continue;
}
var triggerName = string.Empty;
if (triggerTypes.TryGetValue(triggerID, out triggerName))
{
var trigger = (AkTriggerBase)GetComponent(System.Type.GetType(triggerName));
if (trigger == null)
{
trigger = (AkTriggerBase)gameObject.AddComponent(System.Type.GetType(triggerName));
}
trigger.triggerDelegate += in_delegate;
}
}
#if UNITY_EDITOR
if (UnityEditor.EditorApplication.isPaused)
{
UnityEditor.EditorApplication.pauseStateChanged += OnPause;
pausedOnStart = true;
return;
}
#endif
if (in_triggerList.Contains(AWAKE_TRIGGER_ID))
{
in_delegate(null);
}
}
protected void UnregisterTriggers(System.Collections.Generic.List<int> in_triggerList, AkTriggerBase.Trigger in_delegate)
{
#if UNITY_EDITOR
if (UnityEditor.BuildPipeline.isBuildingPlayer || AkUtilities.IsMigrating)
{
return;
}
#endif
foreach (uint triggerID in in_triggerList)
{
switch (triggerID)
{
case AWAKE_TRIGGER_ID:
case START_TRIGGER_ID:
case unchecked((uint)DESTROY_TRIGGER_ID):
case unchecked((uint)ON_ENABLE_TRIGGER_ID):
continue;
}
var triggerName = string.Empty;
if (triggerTypes.TryGetValue(triggerID, out triggerName))
{
var trigger = (AkTriggerBase)GetComponent(System.Type.GetType(triggerName));
if (trigger != null)
{
trigger.triggerDelegate -= in_delegate;
if (trigger.triggerDelegate == null)
{
#if UNITY_EDITOR
if (UnityEditor.EditorApplication.isPlaying)
#endif
Destroy(trigger);
}
}
}
}
if (in_triggerList.Contains(DESTROY_TRIGGER_ID))
{
in_delegate(null);
}
}
}
public abstract class AkDragDropTriggerHandler : AkTriggerHandler
{
protected abstract AK.Wwise.BaseType WwiseType { get; }
protected override void Awake()
{
#if UNITY_EDITOR
if (UnityEditor.BuildPipeline.isBuildingPlayer || AkUtilities.IsMigrating)
{
return;
}
var reference = AkWwiseTypes.DragAndDropObjectReference;
if (reference)
{
UnityEngine.GUIUtility.hotControl = 0;
WwiseType.ObjectReference = reference;
}
if (!UnityEditor.EditorApplication.isPlaying)
{
return;
}
#endif
base.Awake();
}
protected override void Start()
{
#if UNITY_EDITOR
if (!UnityEditor.EditorApplication.isPlaying)
{
return;
}
#endif
base.Start();
}
protected override void OnDestroy()
{
#if UNITY_EDITOR
if (UnityEditor.BuildPipeline.isBuildingPlayer || AkUtilities.IsMigrating || !UnityEditor.EditorApplication.isPlaying)
{
return;
}
#endif
base.OnDestroy();
}
}
#endif // #if ! (UNITY_DASHBOARD_WIDGET || UNITY_WEBPLAYER || UNITY_WII || UNITY_WIIU || UNITY_NACL || UNITY_FLASH || UNITY_BLACKBERRY) // Disable under unsupported platforms.