From e03d92557372ab6ecb2858617963d51f06204456 Mon Sep 17 00:00:00 2001 From: Banane_Rotative Date: Sun, 18 Jan 2026 15:58:16 +0100 Subject: [PATCH 1/7] Add: SoundManager The sound manager is responsible for playing short-lived sounds on the scene. --- Assets/Resources/Prefabs/Sound.meta | 8 ++ .../Prefabs/Sound/Audio Source.prefab | 131 ++++++++++++++++++ .../Prefabs/Sound/Audio Source.prefab.meta | 7 + Assets/Resources/Sounds/Test-bruit-court.wav | Bin 0 -> 389198 bytes .../Sounds/Test-bruit-court.wav.meta | 23 +++ Assets/Scenes/SampleScene.unity | 49 ++++++- Assets/Scripts/Sound.meta | 8 ++ Assets/Scripts/Sound/SoundManager.cs | 83 +++++++++++ Assets/Scripts/Sound/SoundManager.cs.meta | 2 + ProjectSettings/TimelineSettings.asset | 16 +++ 10 files changed, 326 insertions(+), 1 deletion(-) create mode 100644 Assets/Resources/Prefabs/Sound.meta create mode 100644 Assets/Resources/Prefabs/Sound/Audio Source.prefab create mode 100644 Assets/Resources/Prefabs/Sound/Audio Source.prefab.meta create mode 100644 Assets/Resources/Sounds/Test-bruit-court.wav create mode 100644 Assets/Resources/Sounds/Test-bruit-court.wav.meta create mode 100644 Assets/Scripts/Sound.meta create mode 100644 Assets/Scripts/Sound/SoundManager.cs create mode 100644 Assets/Scripts/Sound/SoundManager.cs.meta create mode 100644 ProjectSettings/TimelineSettings.asset diff --git a/Assets/Resources/Prefabs/Sound.meta b/Assets/Resources/Prefabs/Sound.meta new file mode 100644 index 0000000..b1b7ab6 --- /dev/null +++ b/Assets/Resources/Prefabs/Sound.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 48dcd50c6eacab640bcf38649d7f3a7d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/Sound/Audio Source.prefab b/Assets/Resources/Prefabs/Sound/Audio Source.prefab new file mode 100644 index 0000000..64ff56d --- /dev/null +++ b/Assets/Resources/Prefabs/Sound/Audio Source.prefab @@ -0,0 +1,131 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &7070934177775682985 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 944501444550833281} + - component: {fileID: 3317408524915037535} + m_Layer: 0 + m_Name: Audio Source + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &944501444550833281 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7070934177775682985} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!82 &3317408524915037535 +AudioSource: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7070934177775682985} + m_Enabled: 1 + serializedVersion: 4 + OutputAudioMixerGroup: {fileID: 0} + m_audioClip: {fileID: 0} + m_Resource: {fileID: 0} + m_PlayOnAwake: 1 + m_Volume: 1 + m_Pitch: 1 + Loop: 0 + Mute: 0 + Spatialize: 0 + SpatializePostEffects: 0 + Priority: 128 + DopplerLevel: 1 + MinDistance: 1 + MaxDistance: 500 + Pan2D: 0 + rolloffMode: 0 + BypassEffects: 0 + BypassListenerEffects: 0 + BypassReverbZones: 0 + rolloffCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + panLevelCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + spreadCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + reverbZoneMixCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 diff --git a/Assets/Resources/Prefabs/Sound/Audio Source.prefab.meta b/Assets/Resources/Prefabs/Sound/Audio Source.prefab.meta new file mode 100644 index 0000000..8ba84c9 --- /dev/null +++ b/Assets/Resources/Prefabs/Sound/Audio Source.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3758df6f658743a458b1e3406342e7de +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Sounds/Test-bruit-court.wav b/Assets/Resources/Sounds/Test-bruit-court.wav new file mode 100644 index 0000000000000000000000000000000000000000..6b29e0e93a0203a85e7cf6ff7cb9c7da4e2071f4 GIT binary patch literal 389198 zcmeFZ2b2{>w>I4QoM8}@B%ov^DiTFeK|qqCL=iy+L`jlFKm{=&A|MD#kSLN=1VI!D zl7j){1w{n`i4qh7fSg8+Y$JsPxs6B*~H@z5FE=&MA^6T`jd}-nLzFI&J0bM`s&#IyTD@8|>4~m`x=Q3Fb)NcBLf2U0zd>VZ@bq zNcBLf2U0zd>VZ@bqNcBLf2U0zd>VZ@bqNcBLf z2U0zd>VZ@bqNcBLf2U0!o&-8#FIQ|*0|L=K`rT>oq_pTt-;{QMQ z06%6qwUO__Fg^C+`Tr+a20PIQ^O=VE{ik_c7idnt#kS_8n@rC2C6jXnX+8;%{3+`gRjxh~M4t|$x2 zMOk)ska1hMkFv96UqKt@i!_-I`xkXl7WKItrX%v$7gLt8eNL41L0Ol1L7&XO9LheJ zUXJbmlrCQph3AP3zI{i>(0qGCwun8H0V#P z3p&Y;>|~-%@Y<5KPqg8(Xv;iMZhJB+>ITc~GsyqD=j@khGJlXKljVjV=AZi^JA1af z-1gM;Z>;D&+$88hq2M-6Yxlq2+ z`m?j+I>WAyWnuPVvVXdbTnDcyIUW+$9+4Nc!+F?&_KF8|pexqLbtdz{buopHpil5{ zuuhQvTl!yiVY;jnq+xX>^Do-64)fR#-;*L`8FXPM_7Bd*LzHtJB4u6n8Khiqkk99A z&y@L~%nP;&{IE8#{^e5kb-8w;KKo!Q%D4Rzi+zQ2=mgsww9D-|`(esSfJopRaT~0m!gf6Z%r$cNf>xy<^a@G?m_bXFT7FHJhq8z5fzL*AelJS%2g}qbZ zgAZ;Kp9lR1<$MmxHlS=L`WEFml`qHsa&*PE1=|qxgKHAs(X21(g_XnfmqD zS)VERtOF{}y>ZTVmrG%r(-Gz~%qC1P$P=#zGSN>^_n$f!>qu4>>p~mDjxby3@imDw z%sw|f)R9b2tUsB~Kfw>HC)u?n*4dDUf4Nw*^X(@p3j*E{e1{T`&OBie

)&vp%tMb}gF4C1ujCromslUlIKp^h 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

*GZ6(Kv-R;Mg|*WzQ=&qL;XlJ|y&M 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 literal 0 HcmV?d00001 diff --git a/Assets/Resources/Sounds/Test-bruit-court.wav.meta b/Assets/Resources/Sounds/Test-bruit-court.wav.meta new file mode 100644 index 0000000..10e2351 --- /dev/null +++ b/Assets/Resources/Sounds/Test-bruit-court.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 2e41a111eebf71843a1cbf93be5a9e1c +AudioImporter: + externalObjects: {} + serializedVersion: 8 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity index 0cb206a..90d452f 100644 --- a/Assets/Scenes/SampleScene.unity +++ b/Assets/Scenes/SampleScene.unity @@ -311,6 +311,52 @@ Rigidbody: m_Interpolate: 0 m_Constraints: 112 m_CollisionDetection: 0 +--- !u!1 &266152666 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 266152667} + - component: {fileID: 266152668} + m_Layer: 0 + m_Name: SoundManager + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &266152667 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 266152666} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &266152668 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 266152666} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cc230848cf9fffe40aed130aeee564f8, type: 3} + m_Name: + m_EditorClassIdentifier: + initialPoolSize: 10 + audioSourcePrefab: {fileID: 7070934177775682985, guid: 3758df6f658743a458b1e3406342e7de, type: 3} --- !u!1 &272243392 GameObject: m_ObjectHideFlags: 0 @@ -1015,7 +1061,7 @@ AudioSource: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1883178833} - m_Enabled: 1 + m_Enabled: 0 serializedVersion: 4 OutputAudioMixerGroup: {fileID: 0} m_audioClip: {fileID: 0} @@ -1187,3 +1233,4 @@ SceneRoots: - {fileID: 99782795} - {fileID: 1697224671} - {fileID: 90518572} + - {fileID: 266152667} diff --git a/Assets/Scripts/Sound.meta b/Assets/Scripts/Sound.meta new file mode 100644 index 0000000..6dafa36 --- /dev/null +++ b/Assets/Scripts/Sound.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7f85cfcdf276f164e886755fa9ee019e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Sound/SoundManager.cs b/Assets/Scripts/Sound/SoundManager.cs new file mode 100644 index 0000000..7271bf2 --- /dev/null +++ b/Assets/Scripts/Sound/SoundManager.cs @@ -0,0 +1,83 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +///

+/// The sound manager is responsible for handling short lived sounds. +/// Those are sounds that should not loop. +/// If you want to manage a looped sound, use the MusicManager or place +/// it in the scene "as-is" instead. +/// +public class SoundManager : MonoBehaviour +{ + [SerializeField] private int initialPoolSize = 10; + [SerializeField] private GameObject audioSourcePrefab; + + private List audioPool; + private Queue availableAudios; + + // Singleton pattern + [System.NonSerialized] // Do not show it in editor and do not save its value + public static SoundManager Instance = null; + + private void Awake() + { + // Singleton pattern + if (Instance != null && Instance != this) + { + Destroy(gameObject); + return; + } + + Instance = this; + DontDestroyOnLoad(gameObject); + } + + private void Start() + { + if (audioSourcePrefab == null) + { + Debug.LogWarning("Cannot create a pool of audio sources: audio source prefab not set"); + } + + audioPool = new List(initialPoolSize); + availableAudios = new Queue(initialPoolSize); + + // For each initially pooled audio + for (int i=0; i(); + audioPool.Add(source); + return source; + } + + private IEnumerator DelayedBackToPoolCoroutine(AudioSource source) + { + yield return new WaitForSeconds(source.clip.length); + availableAudios.Enqueue(source); + } + + public void PlaySoundAt(Vector3 position, AudioClip sound) + { + // Take audio from pool if possible, extend pool otherwise + AudioSource source = Instance.availableAudios.Count == 0 ? + Instance.ExtendPool() : + Instance.availableAudios.Dequeue(); + + source.transform.position = position; + source.clip = sound; + source.loop = false; + source.Play(); + StartCoroutine(Instance.DelayedBackToPoolCoroutine(source)); + } +} diff --git a/Assets/Scripts/Sound/SoundManager.cs.meta b/Assets/Scripts/Sound/SoundManager.cs.meta new file mode 100644 index 0000000..b92b5e4 --- /dev/null +++ b/Assets/Scripts/Sound/SoundManager.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: cc230848cf9fffe40aed130aeee564f8 \ No newline at end of file diff --git a/ProjectSettings/TimelineSettings.asset b/ProjectSettings/TimelineSettings.asset new file mode 100644 index 0000000..b21943a --- /dev/null +++ b/ProjectSettings/TimelineSettings.asset @@ -0,0 +1,16 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 53 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a287be6c49135cd4f9b2b8666c39d999, type: 3} + m_Name: + m_EditorClassIdentifier: + assetDefaultFramerate: 60 + m_DefaultFrameRate: 60 From 8067bb52479d9aa332e1be68f855531a95066cf2 Mon Sep 17 00:00:00 2001 From: Banane_Rotative Date: Sun, 18 Jan 2026 17:43:13 +0100 Subject: [PATCH 2/7] Add: Generic loopable sound + playlist --- .../Prefabs/Sound/Audio Source.prefab | 2 +- Assets/Scripts/Sound/ILoopableSound.cs | 48 +++++++++++++++++++ Assets/Scripts/Sound/ILoopableSound.cs.meta | 2 + Assets/Scripts/Sound/LoopablePlaylist.cs | 43 +++++++++++++++++ Assets/Scripts/Sound/LoopablePlaylist.cs.meta | 2 + Assets/Scripts/Sound/LoopableSound.cs | 19 ++++++++ Assets/Scripts/Sound/LoopableSound.cs.meta | 2 + Assets/Scripts/Sound/SoundManager.cs | 2 +- 8 files changed, 118 insertions(+), 2 deletions(-) create mode 100644 Assets/Scripts/Sound/ILoopableSound.cs create mode 100644 Assets/Scripts/Sound/ILoopableSound.cs.meta create mode 100644 Assets/Scripts/Sound/LoopablePlaylist.cs create mode 100644 Assets/Scripts/Sound/LoopablePlaylist.cs.meta create mode 100644 Assets/Scripts/Sound/LoopableSound.cs create mode 100644 Assets/Scripts/Sound/LoopableSound.cs.meta diff --git a/Assets/Resources/Prefabs/Sound/Audio Source.prefab b/Assets/Resources/Prefabs/Sound/Audio Source.prefab index 64ff56d..c4b8172 100644 --- a/Assets/Resources/Prefabs/Sound/Audio Source.prefab +++ b/Assets/Resources/Prefabs/Sound/Audio Source.prefab @@ -89,7 +89,7 @@ AudioSource: m_Curve: - serializedVersion: 3 time: 0 - value: 0 + value: 1 inSlope: 0 outSlope: 0 tangentMode: 0 diff --git a/Assets/Scripts/Sound/ILoopableSound.cs b/Assets/Scripts/Sound/ILoopableSound.cs new file mode 100644 index 0000000..c1340fa --- /dev/null +++ b/Assets/Scripts/Sound/ILoopableSound.cs @@ -0,0 +1,48 @@ +using UnityEngine; + +public abstract class ILoopableSound : MonoBehaviour +{ + protected AudioSource source; + + protected void CreateSource() + { + source = Instantiate(SoundManager.Instance.audioSourcePrefab).GetComponent(); + source.loop = true; + } + + protected void DestroySource() + { + if (source != null) + { + Destroy(source.gameObject); + } + } + + protected void OnDestroy() + { + DestroySource(); + } + + public void PlayLoopableSound(Vector3 position) + { + CreateSource(); + source.transform.position = position; + PlayLoopableSound(); + } + + public void PlayLoopableSound(Transform parent) + { + CreateSource(); + source.transform.SetParent(parent, false); + PlayLoopableSound(); + } + + protected virtual void PlayLoopableSound() { } + + protected virtual void StopLoopableSound() + { + DestroySource(); + } + + public bool IsPlaying { get { return source != null; } } +} \ No newline at end of file diff --git a/Assets/Scripts/Sound/ILoopableSound.cs.meta b/Assets/Scripts/Sound/ILoopableSound.cs.meta new file mode 100644 index 0000000..a19064c --- /dev/null +++ b/Assets/Scripts/Sound/ILoopableSound.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a71883758609f8342858a3b5c4c641d8 \ No newline at end of file diff --git a/Assets/Scripts/Sound/LoopablePlaylist.cs b/Assets/Scripts/Sound/LoopablePlaylist.cs new file mode 100644 index 0000000..8178d41 --- /dev/null +++ b/Assets/Scripts/Sound/LoopablePlaylist.cs @@ -0,0 +1,43 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class LoopablePlaylist : ILoopableSound +{ + [SerializeField] List playlist; + Coroutine playlistCoroutine = null; + + protected override void PlayLoopableSound() + { + base.PlayLoopableSound(); + + if (playlist.Count == 0) + { + Debug.LogWarning("Playlist is empty"); + return; + } + source.loop = false; + playlistCoroutine = StartCoroutine(PlaylistCoroutine()); + source.clip = playlist[0]; + source.Play(); + } + + protected override void StopLoopableSound() + { + StopCoroutine(playlistCoroutine); + source.Stop(); + base.StopLoopableSound(); + } + + protected IEnumerator PlaylistCoroutine() + { + int playlistIndex = 0; + while (true) + { + source.clip = playlist[playlistIndex]; + source.Play(); + yield return new WaitForSeconds(playlist[playlistIndex].length); + playlistIndex = (playlistIndex + 1) % playlist.Count; + } + } +} diff --git a/Assets/Scripts/Sound/LoopablePlaylist.cs.meta b/Assets/Scripts/Sound/LoopablePlaylist.cs.meta new file mode 100644 index 0000000..c7feb2c --- /dev/null +++ b/Assets/Scripts/Sound/LoopablePlaylist.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 914bb056e791dc74491ef6034c2a70dd \ No newline at end of file diff --git a/Assets/Scripts/Sound/LoopableSound.cs b/Assets/Scripts/Sound/LoopableSound.cs new file mode 100644 index 0000000..09e2192 --- /dev/null +++ b/Assets/Scripts/Sound/LoopableSound.cs @@ -0,0 +1,19 @@ +using UnityEngine; + +public class LoopableSound : ILoopableSound +{ + [SerializeField] AudioClip sound; + + protected override void PlayLoopableSound() + { + base.PlayLoopableSound(); + source.clip = sound; + source.Play(); + } + + protected override void StopLoopableSound() + { + source.Stop(); + base.StopLoopableSound(); + } +} diff --git a/Assets/Scripts/Sound/LoopableSound.cs.meta b/Assets/Scripts/Sound/LoopableSound.cs.meta new file mode 100644 index 0000000..9fcb427 --- /dev/null +++ b/Assets/Scripts/Sound/LoopableSound.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 287885c28387db147b2ed37b247e9fc2 \ No newline at end of file diff --git a/Assets/Scripts/Sound/SoundManager.cs b/Assets/Scripts/Sound/SoundManager.cs index 7271bf2..35ade3a 100644 --- a/Assets/Scripts/Sound/SoundManager.cs +++ b/Assets/Scripts/Sound/SoundManager.cs @@ -11,7 +11,7 @@ using UnityEngine; public class SoundManager : MonoBehaviour { [SerializeField] private int initialPoolSize = 10; - [SerializeField] private GameObject audioSourcePrefab; + [SerializeField] public GameObject audioSourcePrefab; private List audioPool; private Queue availableAudios; From 83ec7b7b1732cc31f2c9da6f6a34a6b2f0902547 Mon Sep 17 00:00:00 2001 From: Banane_Rotative Date: Sun, 18 Jan 2026 18:12:00 +0100 Subject: [PATCH 3/7] Add: MusicManager MusicManager handles loopable sounds --- Assets/Scenes/SampleScene.unity | 45 +++++++++++++++++++++++ Assets/Scripts/Sound/ILoopableSound.cs | 4 +- Assets/Scripts/Sound/MusicManager.cs | 40 ++++++++++++++++++++ Assets/Scripts/Sound/MusicManager.cs.meta | 2 + 4 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 Assets/Scripts/Sound/MusicManager.cs create mode 100644 Assets/Scripts/Sound/MusicManager.cs.meta diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity index 90d452f..3879564 100644 --- a/Assets/Scenes/SampleScene.unity +++ b/Assets/Scenes/SampleScene.unity @@ -311,6 +311,50 @@ Rigidbody: m_Interpolate: 0 m_Constraints: 112 m_CollisionDetection: 0 +--- !u!1 &169666004 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 169666005} + - component: {fileID: 169666006} + m_Layer: 0 + m_Name: MusicManager + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &169666005 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 169666004} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &169666006 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 169666004} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f4c60501663689458019872e34e9c48, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &266152666 GameObject: m_ObjectHideFlags: 0 @@ -1234,3 +1278,4 @@ SceneRoots: - {fileID: 1697224671} - {fileID: 90518572} - {fileID: 266152667} + - {fileID: 169666005} diff --git a/Assets/Scripts/Sound/ILoopableSound.cs b/Assets/Scripts/Sound/ILoopableSound.cs index c1340fa..5e7f42c 100644 --- a/Assets/Scripts/Sound/ILoopableSound.cs +++ b/Assets/Scripts/Sound/ILoopableSound.cs @@ -1,3 +1,4 @@ +using NUnit.Framework; using UnityEngine; public abstract class ILoopableSound : MonoBehaviour @@ -30,10 +31,11 @@ public abstract class ILoopableSound : MonoBehaviour PlayLoopableSound(); } - public void PlayLoopableSound(Transform parent) + public void PlayLoopableSound(Transform parent, bool spatial) { CreateSource(); source.transform.SetParent(parent, false); + source.spatialBlend = spatial ? 1 : 0; PlayLoopableSound(); } diff --git a/Assets/Scripts/Sound/MusicManager.cs b/Assets/Scripts/Sound/MusicManager.cs new file mode 100644 index 0000000..eca44f0 --- /dev/null +++ b/Assets/Scripts/Sound/MusicManager.cs @@ -0,0 +1,40 @@ +using UnityEngine; + +/// +/// The music manager is responsible for handling loopable sounds. +/// If you want to manage a non-looped sound, use the SoundManager. +/// +public class MusicManager : MonoBehaviour +{ + // Singleton pattern + [System.NonSerialized] public static MusicManager Instance = null; + + private void Awake() + { + // Singleton pattern + if (Instance != null && Instance != this) + { + Destroy(gameObject); + } + else + { + Instance = this; + DontDestroyOnLoad(gameObject); + } + } + + public void StartMusic(ILoopableSound music) + { + music.PlayLoopableSound(transform, false); + } + + public void StartMusic(ILoopableSound music, Vector3 position) + { + music.PlayLoopableSound(position); + } + + public void StartMusic(ILoopableSound music, Transform parent) + { + music.PlayLoopableSound(parent, true); + } +} diff --git a/Assets/Scripts/Sound/MusicManager.cs.meta b/Assets/Scripts/Sound/MusicManager.cs.meta new file mode 100644 index 0000000..b90cba0 --- /dev/null +++ b/Assets/Scripts/Sound/MusicManager.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4f4c60501663689458019872e34e9c48 \ No newline at end of file From ebceb624a48893b12c80c118926a3445f0240b13 Mon Sep 17 00:00:00 2001 From: Banane_Rotative Date: Mon, 19 Jan 2026 22:40:40 +0100 Subject: [PATCH 4/7] Fix: public call of abstract method --- Assets/Scripts/Sound/ILoopableSound.cs | 4 ++-- Assets/Scripts/Sound/LoopablePlaylist.cs | 4 ++-- Assets/Scripts/Sound/LoopableSound.cs | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Assets/Scripts/Sound/ILoopableSound.cs b/Assets/Scripts/Sound/ILoopableSound.cs index 5e7f42c..da7e36e 100644 --- a/Assets/Scripts/Sound/ILoopableSound.cs +++ b/Assets/Scripts/Sound/ILoopableSound.cs @@ -39,9 +39,9 @@ public abstract class ILoopableSound : MonoBehaviour PlayLoopableSound(); } - protected virtual void PlayLoopableSound() { } + public virtual void PlayLoopableSound() { } - protected virtual void StopLoopableSound() + public virtual void StopLoopableSound() { DestroySource(); } diff --git a/Assets/Scripts/Sound/LoopablePlaylist.cs b/Assets/Scripts/Sound/LoopablePlaylist.cs index 8178d41..7515140 100644 --- a/Assets/Scripts/Sound/LoopablePlaylist.cs +++ b/Assets/Scripts/Sound/LoopablePlaylist.cs @@ -7,7 +7,7 @@ public class LoopablePlaylist : ILoopableSound [SerializeField] List playlist; Coroutine playlistCoroutine = null; - protected override void PlayLoopableSound() + public override void PlayLoopableSound() { base.PlayLoopableSound(); @@ -22,7 +22,7 @@ public class LoopablePlaylist : ILoopableSound source.Play(); } - protected override void StopLoopableSound() + public override void StopLoopableSound() { StopCoroutine(playlistCoroutine); source.Stop(); diff --git a/Assets/Scripts/Sound/LoopableSound.cs b/Assets/Scripts/Sound/LoopableSound.cs index 09e2192..ffa9dcb 100644 --- a/Assets/Scripts/Sound/LoopableSound.cs +++ b/Assets/Scripts/Sound/LoopableSound.cs @@ -4,14 +4,14 @@ public class LoopableSound : ILoopableSound { [SerializeField] AudioClip sound; - protected override void PlayLoopableSound() + public override void PlayLoopableSound() { base.PlayLoopableSound(); source.clip = sound; source.Play(); } - protected override void StopLoopableSound() + public override void StopLoopableSound() { source.Stop(); base.StopLoopableSound(); From 18c2d44c319af92784b3f73386c90b60a4a945c9 Mon Sep 17 00:00:00 2001 From: Banane_Rotative Date: Mon, 19 Jan 2026 22:41:11 +0100 Subject: [PATCH 5/7] Fix: Missing StopMusic on MusicManager --- Assets/Scripts/Sound/MusicManager.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Assets/Scripts/Sound/MusicManager.cs b/Assets/Scripts/Sound/MusicManager.cs index eca44f0..ce46fed 100644 --- a/Assets/Scripts/Sound/MusicManager.cs +++ b/Assets/Scripts/Sound/MusicManager.cs @@ -37,4 +37,9 @@ public class MusicManager : MonoBehaviour { music.PlayLoopableSound(parent, true); } + + public void StopMusic(ILoopableSound music) + { + music.StopLoopableSound(); + } } From bda9e7283be8cd427d3763c2acb173ab13ebb491 Mon Sep 17 00:00:00 2001 From: Banane_Rotative Date: Mon, 19 Jan 2026 22:58:25 +0100 Subject: [PATCH 6/7] Add: trigger system Trigger system that can activate any event --- Assets/Scripts/Trigger.meta | 8 ++++++ Assets/Scripts/Trigger/Trigger.meta | 8 ++++++ Assets/Scripts/Trigger/Trigger/ITrigger.cs | 26 +++++++++++++++++++ .../Scripts/Trigger/Trigger/ITrigger.cs.meta | 2 ++ .../Trigger/Trigger/TriggerCollision.cs | 17 ++++++++++++ .../Trigger/Trigger/TriggerCollision.cs.meta | 2 ++ Assets/Scripts/Trigger/Triggerable.meta | 8 ++++++ .../Trigger/Triggerable/ITriggerable.cs | 10 +++++++ .../Trigger/Triggerable/ITriggerable.cs.meta | 2 ++ .../Trigger/Triggerable/TriggerableSound.cs | 25 ++++++++++++++++++ .../Triggerable/TriggerableSound.cs.meta | 2 ++ 11 files changed, 110 insertions(+) create mode 100644 Assets/Scripts/Trigger.meta create mode 100644 Assets/Scripts/Trigger/Trigger.meta create mode 100644 Assets/Scripts/Trigger/Trigger/ITrigger.cs create mode 100644 Assets/Scripts/Trigger/Trigger/ITrigger.cs.meta create mode 100644 Assets/Scripts/Trigger/Trigger/TriggerCollision.cs create mode 100644 Assets/Scripts/Trigger/Trigger/TriggerCollision.cs.meta create mode 100644 Assets/Scripts/Trigger/Triggerable.meta create mode 100644 Assets/Scripts/Trigger/Triggerable/ITriggerable.cs create mode 100644 Assets/Scripts/Trigger/Triggerable/ITriggerable.cs.meta create mode 100644 Assets/Scripts/Trigger/Triggerable/TriggerableSound.cs create mode 100644 Assets/Scripts/Trigger/Triggerable/TriggerableSound.cs.meta diff --git a/Assets/Scripts/Trigger.meta b/Assets/Scripts/Trigger.meta new file mode 100644 index 0000000..4512752 --- /dev/null +++ b/Assets/Scripts/Trigger.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ff2572641226ba24f8e06342e11d6dc6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Trigger/Trigger.meta b/Assets/Scripts/Trigger/Trigger.meta new file mode 100644 index 0000000..58713e0 --- /dev/null +++ b/Assets/Scripts/Trigger/Trigger.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b7081abff2504cd488ce34e2964895f5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Trigger/Trigger/ITrigger.cs b/Assets/Scripts/Trigger/Trigger/ITrigger.cs new file mode 100644 index 0000000..7865ae3 --- /dev/null +++ b/Assets/Scripts/Trigger/Trigger/ITrigger.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; +using UnityEngine; + +/// +/// An abstract class for anything that needs to trigger one-shot events +/// +public abstract class ITrigger : MonoBehaviour +{ + [SerializeField] List triggerables; + + protected void OnTrigger(Vector3 position) + { + foreach (ITriggerable triggerable in triggerables) + { + triggerable.Trigger(position); + } + } + + protected void OnTrigger() + { + foreach (var triggerable in triggerables) + { + triggerable.Trigger(); + } + } +} diff --git a/Assets/Scripts/Trigger/Trigger/ITrigger.cs.meta b/Assets/Scripts/Trigger/Trigger/ITrigger.cs.meta new file mode 100644 index 0000000..c82933b --- /dev/null +++ b/Assets/Scripts/Trigger/Trigger/ITrigger.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5b27634977cf89f4897128f2bfc9c40e \ No newline at end of file diff --git a/Assets/Scripts/Trigger/Trigger/TriggerCollision.cs b/Assets/Scripts/Trigger/Trigger/TriggerCollision.cs new file mode 100644 index 0000000..facf06c --- /dev/null +++ b/Assets/Scripts/Trigger/Trigger/TriggerCollision.cs @@ -0,0 +1,17 @@ +using UnityEngine; + +/// +/// A collision trigger that triggers one-shot event when colliding with an object +/// +[RequireComponent(typeof(Collider))] +public class TriggerCollision : ITrigger +{ + private void OnCollisionEnter(Collision collision) + { + if (collision.contactCount > 0) + { + Vector3 contactPoint = collision.GetContact(0).point; + OnTrigger(contactPoint); + } + } +} diff --git a/Assets/Scripts/Trigger/Trigger/TriggerCollision.cs.meta b/Assets/Scripts/Trigger/Trigger/TriggerCollision.cs.meta new file mode 100644 index 0000000..069c057 --- /dev/null +++ b/Assets/Scripts/Trigger/Trigger/TriggerCollision.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ce02cde7ea924d943a1cae7e8fa23c97 \ No newline at end of file diff --git a/Assets/Scripts/Trigger/Triggerable.meta b/Assets/Scripts/Trigger/Triggerable.meta new file mode 100644 index 0000000..dddacce --- /dev/null +++ b/Assets/Scripts/Trigger/Triggerable.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 923b6e673582c4b4487ef8daea9b0bd2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Trigger/Triggerable/ITriggerable.cs b/Assets/Scripts/Trigger/Triggerable/ITriggerable.cs new file mode 100644 index 0000000..aece3dc --- /dev/null +++ b/Assets/Scripts/Trigger/Triggerable/ITriggerable.cs @@ -0,0 +1,10 @@ +using UnityEngine; + +/// +/// An abstract class for any triggerable object +/// +public abstract class ITriggerable : MonoBehaviour +{ + public abstract void Trigger(); + public abstract void Trigger(Vector3 position); +} diff --git a/Assets/Scripts/Trigger/Triggerable/ITriggerable.cs.meta b/Assets/Scripts/Trigger/Triggerable/ITriggerable.cs.meta new file mode 100644 index 0000000..677c4f2 --- /dev/null +++ b/Assets/Scripts/Trigger/Triggerable/ITriggerable.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: db3db78b9c1317d42abe3ef387daea90 \ No newline at end of file diff --git a/Assets/Scripts/Trigger/Triggerable/TriggerableSound.cs b/Assets/Scripts/Trigger/Triggerable/TriggerableSound.cs new file mode 100644 index 0000000..f042a81 --- /dev/null +++ b/Assets/Scripts/Trigger/Triggerable/TriggerableSound.cs @@ -0,0 +1,25 @@ +using UnityEngine; + +/// +/// A triggerable sound. Trigger plays the sound. +/// +public class TriggerableSound : ITriggerable +{ + [SerializeField] AudioClip audioSource; + + public override void Trigger() + { + if (audioSource != null) + { + SoundManager.Instance.PlaySoundAt(transform.position, audioSource); + } + } + + public override void Trigger(Vector3 position) + { + if (audioSource != null) + { + SoundManager.Instance.PlaySoundAt(position, audioSource); + } + } +} diff --git a/Assets/Scripts/Trigger/Triggerable/TriggerableSound.cs.meta b/Assets/Scripts/Trigger/Triggerable/TriggerableSound.cs.meta new file mode 100644 index 0000000..059967f --- /dev/null +++ b/Assets/Scripts/Trigger/Triggerable/TriggerableSound.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f05e67e6db6841f45b446a26d1d0d31d \ No newline at end of file From 7a29ab094c39734dd18652fb9713b92ea65bcf1b Mon Sep 17 00:00:00 2001 From: Banane_Rotative Date: Mon, 19 Jan 2026 22:59:26 +0100 Subject: [PATCH 7/7] Add: Activable trigger system Trigger system that can activate/deactivate things --- Assets/Scenes/SampleScene.unity | 279 +++++++++++++++++- .../Trigger/Trigger/IActivableTrigger.cs | 26 ++ .../Trigger/Trigger/IActivableTrigger.cs.meta | 2 + Assets/Scripts/Trigger/Trigger/TriggerArea.cs | 18 ++ .../Trigger/Trigger/TriggerArea.cs.meta | 2 + .../Triggerable/IActivableTriggerable.cs | 10 + .../Triggerable/IActivableTriggerable.cs.meta | 2 + .../Trigger/Triggerable/TriggerableMusic.cs | 25 ++ .../Triggerable/TriggerableMusic.cs.meta | 2 + 9 files changed, 365 insertions(+), 1 deletion(-) create mode 100644 Assets/Scripts/Trigger/Trigger/IActivableTrigger.cs create mode 100644 Assets/Scripts/Trigger/Trigger/IActivableTrigger.cs.meta create mode 100644 Assets/Scripts/Trigger/Trigger/TriggerArea.cs create mode 100644 Assets/Scripts/Trigger/Trigger/TriggerArea.cs.meta create mode 100644 Assets/Scripts/Trigger/Triggerable/IActivableTriggerable.cs create mode 100644 Assets/Scripts/Trigger/Triggerable/IActivableTriggerable.cs.meta create mode 100644 Assets/Scripts/Trigger/Triggerable/TriggerableMusic.cs create mode 100644 Assets/Scripts/Trigger/Triggerable/TriggerableMusic.cs.meta diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity index 3879564..95948f7 100644 --- a/Assets/Scenes/SampleScene.unity +++ b/Assets/Scenes/SampleScene.unity @@ -759,6 +759,52 @@ MonoBehaviour: m_LightCookieSize: {x: 1, y: 1} m_LightCookieOffset: {x: 0, y: 0} m_SoftShadowQuality: 1 +--- !u!1 &432444065 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 432444066} + - component: {fileID: 432444067} + m_Layer: 0 + m_Name: Triggerable music + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &432444066 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 432444065} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1512154480} + m_Father: {fileID: 621578838} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &432444067 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 432444065} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0c3454cc62eba27469e9581fb0fb8703, type: 3} + m_Name: + m_EditorClassIdentifier: + music: {fileID: 1512154481} --- !u!1 &493760349 GameObject: m_ObjectHideFlags: 0 @@ -814,6 +860,130 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 5a895e8a798ee0b4a9a5ea33d6b07f4b, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!1 &621578834 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 621578838} + - component: {fileID: 621578837} + - component: {fileID: 621578836} + - component: {fileID: 621578835} + - component: {fileID: 621578839} + m_Layer: 0 + m_Name: TriggerZone + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!65 &621578835 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 621578834} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &621578836 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 621578834} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &621578837 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 621578834} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &621578838 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 621578834} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4.22, y: 0.71, z: -7.71} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 432444066} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &621578839 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 621578834} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: eb3300468ed86d74d9fce3c293a89442, type: 3} + m_Name: + m_EditorClassIdentifier: + activableTriggers: + - {fileID: 432444067} --- !u!1 &990919146 GameObject: m_ObjectHideFlags: 0 @@ -857,6 +1027,7 @@ GameObject: - component: {fileID: 1192843595} - component: {fileID: 1192843594} - component: {fileID: 1192843593} + - component: {fileID: 1192843596} m_Layer: 0 m_Name: Slope m_TagString: Untagged @@ -876,7 +1047,8 @@ Transform: m_LocalPosition: {x: -5.5, y: 1.13, z: -6.62} m_LocalScale: {x: 0.5, y: 1, z: 0.5} m_ConstrainProportionsScale: 0 - m_Children: [] + m_Children: + - {fileID: 1646350200} m_Father: {fileID: 90518572} m_LocalEulerAnglesHint: {x: 0, y: 0, z: -28.7} --- !u!64 &1192843593 @@ -954,6 +1126,110 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1192843591} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!114 &1192843596 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1192843591} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ce02cde7ea924d943a1cae7e8fa23c97, type: 3} + m_Name: + m_EditorClassIdentifier: + triggerables: + - {fileID: 1646350201} +--- !u!1 &1512154479 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1512154480} + - component: {fileID: 1512154481} + m_Layer: 0 + m_Name: Music + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1512154480 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1512154479} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 432444066} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1512154481 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1512154479} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 287885c28387db147b2ed37b247e9fc2, type: 3} + m_Name: + m_EditorClassIdentifier: + sound: {fileID: 8300000, guid: 2e41a111eebf71843a1cbf93be5a9e1c, type: 3} +--- !u!1 &1646350199 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1646350200} + - component: {fileID: 1646350201} + m_Layer: 0 + m_Name: Triggerable sound + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1646350200 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1646350199} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -12.26, y: -0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1192843592} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1646350201 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1646350199} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f05e67e6db6841f45b446a26d1d0d31d, type: 3} + m_Name: + m_EditorClassIdentifier: + audioSource: {fileID: 8300000, guid: 2e41a111eebf71843a1cbf93be5a9e1c, type: 3} --- !u!1 &1697224667 GameObject: m_ObjectHideFlags: 0 @@ -1279,3 +1555,4 @@ SceneRoots: - {fileID: 90518572} - {fileID: 266152667} - {fileID: 169666005} + - {fileID: 621578838} diff --git a/Assets/Scripts/Trigger/Trigger/IActivableTrigger.cs b/Assets/Scripts/Trigger/Trigger/IActivableTrigger.cs new file mode 100644 index 0000000..b876c90 --- /dev/null +++ b/Assets/Scripts/Trigger/Trigger/IActivableTrigger.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; +using UnityEngine; + +/// +/// An abstract class for anything that needs to trigger activable events (on/off state) +/// +public abstract class IActivableTrigger : MonoBehaviour +{ + [SerializeField] List activableTriggers; + + protected void OnTriggerActivate() + { + foreach (IActivableTriggerable activableTrigger in activableTriggers) + { + activableTrigger.OnTriggerActivate(); + } + } + + protected void OnTriggerDeactivate() + { + foreach (IActivableTriggerable activableTrigger in activableTriggers) + { + activableTrigger.OnTriggerDeactivate(); + } + } +} diff --git a/Assets/Scripts/Trigger/Trigger/IActivableTrigger.cs.meta b/Assets/Scripts/Trigger/Trigger/IActivableTrigger.cs.meta new file mode 100644 index 0000000..208683b --- /dev/null +++ b/Assets/Scripts/Trigger/Trigger/IActivableTrigger.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a01a8874461ebab4fb27d80b3864597a \ No newline at end of file diff --git a/Assets/Scripts/Trigger/Trigger/TriggerArea.cs b/Assets/Scripts/Trigger/Trigger/TriggerArea.cs new file mode 100644 index 0000000..db4a046 --- /dev/null +++ b/Assets/Scripts/Trigger/Trigger/TriggerArea.cs @@ -0,0 +1,18 @@ +using UnityEngine; + +/// +/// An area that triggers when colliding (triggers once when entering, once when exiting) +/// +[RequireComponent(typeof(Collider))] +public class TriggerArea : IActivableTrigger +{ + private void OnTriggerEnter(Collider other) + { + OnTriggerActivate(); + } + + private void OnTriggerExit(Collider other) + { + OnTriggerDeactivate(); + } +} diff --git a/Assets/Scripts/Trigger/Trigger/TriggerArea.cs.meta b/Assets/Scripts/Trigger/Trigger/TriggerArea.cs.meta new file mode 100644 index 0000000..cde8289 --- /dev/null +++ b/Assets/Scripts/Trigger/Trigger/TriggerArea.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: eb3300468ed86d74d9fce3c293a89442 \ No newline at end of file diff --git a/Assets/Scripts/Trigger/Triggerable/IActivableTriggerable.cs b/Assets/Scripts/Trigger/Triggerable/IActivableTriggerable.cs new file mode 100644 index 0000000..f788fca --- /dev/null +++ b/Assets/Scripts/Trigger/Triggerable/IActivableTriggerable.cs @@ -0,0 +1,10 @@ +using UnityEngine; + +/// +/// An abstract class for any triggerable object that has an on/off state +/// +public abstract class IActivableTriggerable : MonoBehaviour +{ + public abstract void OnTriggerActivate(); + public abstract void OnTriggerDeactivate(); +} diff --git a/Assets/Scripts/Trigger/Triggerable/IActivableTriggerable.cs.meta b/Assets/Scripts/Trigger/Triggerable/IActivableTriggerable.cs.meta new file mode 100644 index 0000000..b8b992f --- /dev/null +++ b/Assets/Scripts/Trigger/Triggerable/IActivableTriggerable.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 64b9105c3da058a4698864040a90a844 \ No newline at end of file diff --git a/Assets/Scripts/Trigger/Triggerable/TriggerableMusic.cs b/Assets/Scripts/Trigger/Triggerable/TriggerableMusic.cs new file mode 100644 index 0000000..4a4fc18 --- /dev/null +++ b/Assets/Scripts/Trigger/Triggerable/TriggerableMusic.cs @@ -0,0 +1,25 @@ +using UnityEngine; + +/// +/// A triggerable music. Trigger can activate and deactivate the music. +/// +public class TriggerableMusic : IActivableTriggerable +{ + [SerializeField] ILoopableSound music; + + public override void OnTriggerActivate() + { + if (music != null) + { + MusicManager.Instance.StartMusic(music); + } + } + + public override void OnTriggerDeactivate() + { + if (music != null) + { + MusicManager.Instance.StopMusic(music); + } + } +} diff --git a/Assets/Scripts/Trigger/Triggerable/TriggerableMusic.cs.meta b/Assets/Scripts/Trigger/Triggerable/TriggerableMusic.cs.meta new file mode 100644 index 0000000..30caf82 --- /dev/null +++ b/Assets/Scripts/Trigger/Triggerable/TriggerableMusic.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0c3454cc62eba27469e9581fb0fb8703 \ No newline at end of file