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