From 74a7e93a130b83a101dd4e6899c50c99e56db090 Mon Sep 17 00:00:00 2001 From: Jamie Greunbaum Date: Tue, 3 Feb 2026 15:36:36 -0500 Subject: [PATCH] Added a timer base class, and a random timer-based audio clip player. --- Assets/Scripts/TimerBase.asset | 209 ++++++++++++++++ Assets/Scripts/TimerBase.asset.meta | 8 + Assets/Scripts/TimerBase.cs | 60 +++++ Assets/Scripts/TimerBase.cs.meta | 11 + Assets/Scripts/TimerSounds.asset | 329 ++++++++++++++++++++++++++ Assets/Scripts/TimerSounds.asset.meta | 8 + Assets/Scripts/TimerSounds.cs | 33 +++ Assets/Scripts/TimerSounds.cs.meta | 11 + 8 files changed, 669 insertions(+) create mode 100644 Assets/Scripts/TimerBase.asset create mode 100644 Assets/Scripts/TimerBase.asset.meta create mode 100644 Assets/Scripts/TimerBase.cs create mode 100644 Assets/Scripts/TimerBase.cs.meta create mode 100644 Assets/Scripts/TimerSounds.asset create mode 100644 Assets/Scripts/TimerSounds.asset.meta create mode 100644 Assets/Scripts/TimerSounds.cs create mode 100644 Assets/Scripts/TimerSounds.cs.meta diff --git a/Assets/Scripts/TimerBase.asset b/Assets/Scripts/TimerBase.asset new file mode 100644 index 0000000..6b7ee05 --- /dev/null +++ b/Assets/Scripts/TimerBase.asset @@ -0,0 +1,209 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + 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: c333ccfdd0cbdbc4ca30cef2dd6e6b9b, type: 3} + m_Name: TimerBase + m_EditorClassIdentifier: + serializedUdonProgramAsset: {fileID: 11400000, guid: 9904f79b6d0998244adec9bc974b9110, + type: 2} + udonAssembly: + assemblyError: + sourceCsScript: {fileID: 11500000, guid: 5c22709dc4cc45d438372370edaa31f8, type: 3} + scriptVersion: 2 + compiledVersion: 2 + behaviourSyncMode: 1 + hasInteractEvent: 0 + scriptID: 4834660096811573612 + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: + - Name: fieldDefinitions + Entry: 7 + Data: 0|System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[UdonSharp.Compiler.FieldDefinition, + UdonSharp.Editor]], mscorlib + - Name: comparer + Entry: 7 + Data: 1|System.Collections.Generic.GenericEqualityComparer`1[[System.String, + mscorlib]], mscorlib + - Name: + Entry: 8 + Data: + - Name: + Entry: 12 + Data: 3 + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: TimerLength + - Name: $v + Entry: 7 + Data: 2|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: TimerLength + - Name: k__BackingField + Entry: 7 + Data: 3|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: System.Single, mscorlib + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 4|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: _TimerCounter + - Name: $v + Entry: 7 + Data: 5|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: _TimerCounter + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: false + - Name: _fieldAttributes + Entry: 7 + Data: 6|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: _TimerIsRunning + - Name: $v + Entry: 7 + Data: 7|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: _TimerIsRunning + - Name: k__BackingField + Entry: 7 + Data: 8|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: System.Boolean, mscorlib + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 8 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: false + - Name: _fieldAttributes + Entry: 7 + Data: 9|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: diff --git a/Assets/Scripts/TimerBase.asset.meta b/Assets/Scripts/TimerBase.asset.meta new file mode 100644 index 0000000..163e3c3 --- /dev/null +++ b/Assets/Scripts/TimerBase.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9b46d879855320747ac02f333fd330f4 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/TimerBase.cs b/Assets/Scripts/TimerBase.cs new file mode 100644 index 0000000..e2965bd --- /dev/null +++ b/Assets/Scripts/TimerBase.cs @@ -0,0 +1,60 @@ + +using UdonSharp; +using UnityEngine; +using VRC.SDKBase; +using VRC.Udon; +using static UnityEditor.EditorApplication; + + +[UdonBehaviourSyncMode(BehaviourSyncMode.None)] +public class TimerBase : UdonSharpBehaviour +{ + public float TimerLength = 0.0f; + private float _TimerCounter = 0.0f; + private bool _TimerIsRunning = false; + + + public void Update() + { + if (_TimerIsRunning) + { + _TimerCounter -= Time.deltaTime; + if (_TimerCounter <= 0.0f) + { + _TimerCounter = TimerLength; + _TimerIsRunning = false; + + TimerEvent(); + } + } + } + + + public virtual void TimerEvent() + { + Debug.Log("[TimerBase] This timer won't do anything. Use a subclass instead."); + } + + + public void StartTimer() + { + _TimerCounter = TimerLength; + _TimerIsRunning = true; + } + + public void PauseTimer() + { + _TimerIsRunning = false; + } + + public void ResumeTimer() + { + _TimerIsRunning = true; + } + + public void StopTimer() + { + PauseTimer(); + _TimerCounter = TimerLength; + } +} diff --git a/Assets/Scripts/TimerBase.cs.meta b/Assets/Scripts/TimerBase.cs.meta new file mode 100644 index 0000000..9df6764 --- /dev/null +++ b/Assets/Scripts/TimerBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5c22709dc4cc45d438372370edaa31f8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/TimerSounds.asset b/Assets/Scripts/TimerSounds.asset new file mode 100644 index 0000000..c3523c1 --- /dev/null +++ b/Assets/Scripts/TimerSounds.asset @@ -0,0 +1,329 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + 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: c333ccfdd0cbdbc4ca30cef2dd6e6b9b, type: 3} + m_Name: TimerSounds + m_EditorClassIdentifier: + serializedUdonProgramAsset: {fileID: 11400000, guid: d9fe67528438e5945bd7172a5558d766, + type: 2} + udonAssembly: + assemblyError: + sourceCsScript: {fileID: 11500000, guid: faed96a2e4a7c2140b79684c9cdec338, type: 3} + scriptVersion: 2 + compiledVersion: 2 + behaviourSyncMode: 1 + hasInteractEvent: 0 + scriptID: -1655673301940951970 + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: + - Name: fieldDefinitions + Entry: 7 + Data: 0|System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[UdonSharp.Compiler.FieldDefinition, + UdonSharp.Editor]], mscorlib + - Name: comparer + Entry: 7 + Data: 1|System.Collections.Generic.GenericEqualityComparer`1[[System.String, + mscorlib]], mscorlib + - Name: + Entry: 8 + Data: + - Name: + Entry: 12 + Data: 5 + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: TimerLength + - Name: $v + Entry: 7 + Data: 2|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: TimerLength + - Name: k__BackingField + Entry: 7 + Data: 3|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: System.Single, mscorlib + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 4|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: _TimerCounter + - Name: $v + Entry: 7 + Data: 5|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: _TimerCounter + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: false + - Name: _fieldAttributes + Entry: 7 + Data: 6|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: _TimerIsRunning + - Name: $v + Entry: 7 + Data: 7|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: _TimerIsRunning + - Name: k__BackingField + Entry: 7 + Data: 8|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: System.Boolean, mscorlib + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 8 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: false + - Name: _fieldAttributes + Entry: 7 + Data: 9|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: _AudioSource + - Name: $v + Entry: 7 + Data: 10|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: _AudioSource + - Name: k__BackingField + Entry: 7 + Data: 11|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: UnityEngine.AudioSource, UnityEngine.AudioModule + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 11 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 12|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 13|UnityEngine.SerializeField, UnityEngine.CoreModule + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: _AudioClips + - Name: $v + Entry: 7 + Data: 14|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: _AudioClips + - Name: k__BackingField + Entry: 7 + Data: 15|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: UnityEngine.AudioClip[], UnityEngine.AudioModule + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 15 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 16|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 17|UnityEngine.SerializeField, UnityEngine.CoreModule + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: diff --git a/Assets/Scripts/TimerSounds.asset.meta b/Assets/Scripts/TimerSounds.asset.meta new file mode 100644 index 0000000..7d530c9 --- /dev/null +++ b/Assets/Scripts/TimerSounds.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b2ac5e0ed25449e41bbac645b3481aa9 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/TimerSounds.cs b/Assets/Scripts/TimerSounds.cs new file mode 100644 index 0000000..364d0fa --- /dev/null +++ b/Assets/Scripts/TimerSounds.cs @@ -0,0 +1,33 @@ + +using UdonSharp; +using UnityEngine; +using VRC.SDKBase; +using VRC.Udon; + + +[UdonBehaviourSyncMode(BehaviourSyncMode.None)] +public class TimerSounds : TimerBase +{ + [SerializeField] private AudioSource _AudioSource; + [SerializeField] private AudioClip[] _AudioClips; + + + private void Start() + { + TimerLength = 0.0f; + StartTimer(); + } + + + public override void TimerEvent() + { + AudioClip NextAudioClip = _AudioClips[Random.Range(0, _AudioClips.Length)]; + + _AudioSource.Stop(); + _AudioSource.clip = NextAudioClip; + _AudioSource.Play(); + + TimerLength = NextAudioClip.length + Random.Range(2.0f, 7.0f); + StartTimer(); + } +} diff --git a/Assets/Scripts/TimerSounds.cs.meta b/Assets/Scripts/TimerSounds.cs.meta new file mode 100644 index 0000000..93382ae --- /dev/null +++ b/Assets/Scripts/TimerSounds.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: faed96a2e4a7c2140b79684c9cdec338 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: