diff --git a/README.md b/README.md
deleted file mode 100644
index 0b7169fdbd18f52bb80c4ef77eb700b3d212f7e5..0000000000000000000000000000000000000000
--- a/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# unity pm test
-
diff --git a/Scriptable Variables.meta b/Scriptable Variables.meta
new file mode 100644
index 0000000000000000000000000000000000000000..29e375402fba3856e4d9c3fded422713c319db54
--- /dev/null
+++ b/Scriptable Variables.meta	
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 99f3c7ece40238e41bfcfb1a3123bc9b
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/AutomaticResettableResetter.cs b/Scriptable Variables/AutomaticResettableResetter.cs
new file mode 100644
index 0000000000000000000000000000000000000000..df295e8a7bd4cb05d610e79c46d61760836fd18d
--- /dev/null
+++ b/Scriptable Variables/AutomaticResettableResetter.cs	
@@ -0,0 +1,35 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  // Automatically calls Reset() on any assigned Resettables on Start
+  // Useful for setting default values to ScriptableVariables on startup
+  public class AutomaticResettableResetter : MonoBehaviour {
+    [Tooltip("List of Objects that implement the Resettable interface to reset on Start")]
+    public List<Object> resettables = new List<Object>();
+
+    [Tooltip("Game Event to fire when all resettables have been reset")]
+    public GameEvent resetComplete;
+
+    // ---------------------------------------------------------------------------
+    void OnValidate() {
+      // Remove any Objects in the list that don't implement the Resettable interface
+      for (var index = resettables.Count - 1; index >= 0; --index) {
+        if (!(resettables[index] is Resettable)) {
+          resettables.RemoveAt(index);
+        }
+      }
+    }
+
+    // ---------------------------------------------------------------------------
+    void Start() {
+      for (var index = resettables.Count - 1; index >= 0; --index) {
+        var resettable = resettables[index] as Resettable;
+        resettable.Reset();
+      }
+      if (resetComplete != null) {
+        resetComplete.Raise();
+      }
+    }
+  }
+}
diff --git a/Scriptable Variables/AutomaticResettableResetter.cs.meta b/Scriptable Variables/AutomaticResettableResetter.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..6ab671a9e42f867d6a5bc0084eb16983aa4c9bff
--- /dev/null
+++ b/Scriptable Variables/AutomaticResettableResetter.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: cf16b22a15bd12f41a3c1a8f532b26fb
+timeCreated: 1510602115
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Events.meta b/Scriptable Variables/Events.meta
new file mode 100644
index 0000000000000000000000000000000000000000..e664f16cb363a6f23bcff86e8a435b50526bd1d1
--- /dev/null
+++ b/Scriptable Variables/Events.meta	
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 483ff9c813faac44189347241e5939e6
+folderAsset: yes
+timeCreated: 1510599414
+licenseType: Pro
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Events/BooleanGameEvent.cs b/Scriptable Variables/Events/BooleanGameEvent.cs
new file mode 100644
index 0000000000000000000000000000000000000000..799ab753f9567c4fc88275025df3c1676afb5499
--- /dev/null
+++ b/Scriptable Variables/Events/BooleanGameEvent.cs	
@@ -0,0 +1,19 @@
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  // ScriptableVariable that decouples components firing and listening to game events that require a boolean parameter
+  [CreateAssetMenu(menuName = "Scriptable Objects/Events/Boolean Game Event")]
+  public class BooleanGameEvent : GameEvent<bool> {
+    //---------------------------------------------------------------------------
+    [ContextMenu("Raise(true)")]
+    private void RaiseTrue() {
+      Raise(true);
+    }
+
+    //---------------------------------------------------------------------------
+    [ContextMenu("Raise(false)")]
+    private void RaiseFalse() {
+      Raise(false);
+    }
+  }
+}
diff --git a/Scriptable Variables/Events/BooleanGameEvent.cs.meta b/Scriptable Variables/Events/BooleanGameEvent.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..d8d2f80802943a5f8a009eab523a2f1cd4f5c8d9
--- /dev/null
+++ b/Scriptable Variables/Events/BooleanGameEvent.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: ff7d54b91183cc94297ede3be460e0d0
+timeCreated: 1510599448
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Events/Editor.meta b/Scriptable Variables/Events/Editor.meta
new file mode 100644
index 0000000000000000000000000000000000000000..eb02ced1ebeb23755becc24e0488cb5114e92be7
--- /dev/null
+++ b/Scriptable Variables/Events/Editor.meta	
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: c5fb57c8c826579458e26998f190b842
+folderAsset: yes
+timeCreated: 1513206428
+licenseType: Pro
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Events/Editor/BooleanGameEventEditor.cs b/Scriptable Variables/Events/Editor/BooleanGameEventEditor.cs
new file mode 100644
index 0000000000000000000000000000000000000000..86c1cac93160ccf965842038aea69fa91174ed67
--- /dev/null
+++ b/Scriptable Variables/Events/Editor/BooleanGameEventEditor.cs	
@@ -0,0 +1,22 @@
+using UnityEditor;
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  //---------------------------------------------------------------------------
+  [CustomEditor(typeof(BooleanGameEvent))]
+  public class BooleanGameEventEditor : Editor {
+    private bool testValue = false;
+
+    //---------------------------------------------------------------------------
+    public override void OnInspectorGUI() {
+      base.OnInspectorGUI();
+
+      EditorGUILayout.BeginHorizontal();
+      testValue = EditorGUILayout.Toggle("Test Value", testValue);
+      if (GUILayout.Button("Fire Event")) {
+        ((BooleanGameEvent)target).Raise(testValue);
+      }
+      EditorGUILayout.EndHorizontal();
+    }
+  }
+}
diff --git a/Scriptable Variables/Events/Editor/BooleanGameEventEditor.cs.meta b/Scriptable Variables/Events/Editor/BooleanGameEventEditor.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..100b1990e320428d23451a2768bae2dd1d651b8b
--- /dev/null
+++ b/Scriptable Variables/Events/Editor/BooleanGameEventEditor.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 4cc2f4c2b9d6848418dda0f375a7f50f
+timeCreated: 1513206436
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Events/Editor/FloatGameEventEditor.cs b/Scriptable Variables/Events/Editor/FloatGameEventEditor.cs
new file mode 100644
index 0000000000000000000000000000000000000000..864e318072955eccbbdd9d4bf729d2228b859db1
--- /dev/null
+++ b/Scriptable Variables/Events/Editor/FloatGameEventEditor.cs	
@@ -0,0 +1,22 @@
+using UnityEditor;
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  //---------------------------------------------------------------------------
+  [CustomEditor(typeof(FloatGameEvent))]
+  public class FloatGameEventEditor : Editor {
+    private float testValue = 0.0f;
+
+    //---------------------------------------------------------------------------
+    public override void OnInspectorGUI() {
+      base.OnInspectorGUI();
+
+      EditorGUILayout.BeginHorizontal();
+      testValue = EditorGUILayout.FloatField("Test Value", testValue);
+      if (GUILayout.Button("Fire Event")) {
+        ((FloatGameEvent)target).Raise(testValue);
+      }
+      EditorGUILayout.EndHorizontal();
+    }
+  }
+}
diff --git a/Scriptable Variables/Events/Editor/FloatGameEventEditor.cs.meta b/Scriptable Variables/Events/Editor/FloatGameEventEditor.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..5fc14d7f6f70037f1dcd71f9feced1631b14b304
--- /dev/null
+++ b/Scriptable Variables/Events/Editor/FloatGameEventEditor.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 55ad0db2d28d4484c8cc2c3193e9c2d3
+timeCreated: 1513206436
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Events/Editor/GameEventEditor.cs b/Scriptable Variables/Events/Editor/GameEventEditor.cs
new file mode 100644
index 0000000000000000000000000000000000000000..de7a6a236913edb886295dede1cb71418fcbe3c3
--- /dev/null
+++ b/Scriptable Variables/Events/Editor/GameEventEditor.cs	
@@ -0,0 +1,17 @@
+using UnityEditor;
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  //---------------------------------------------------------------------------
+  [CustomEditor(typeof(GameEvent))]
+  public class GameEventEditor : Editor {
+    //---------------------------------------------------------------------------
+    public override void OnInspectorGUI() {
+      base.OnInspectorGUI();
+
+      if (GUILayout.Button("Fire Event")) {
+        ((GameEvent)target).Raise();
+      }
+    }
+  }
+}
diff --git a/Scriptable Variables/Events/Editor/GameEventEditor.cs.meta b/Scriptable Variables/Events/Editor/GameEventEditor.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..8ab1d724348136a70496bfe3813d4969caf17f6a
--- /dev/null
+++ b/Scriptable Variables/Events/Editor/GameEventEditor.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 88090feebd5266e4b8a497e0aeacb15a
+timeCreated: 1513206436
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Events/Editor/IntGameEventEditor.cs b/Scriptable Variables/Events/Editor/IntGameEventEditor.cs
new file mode 100644
index 0000000000000000000000000000000000000000..3046342e59b416665bea18e17148a9f481e2eaaf
--- /dev/null
+++ b/Scriptable Variables/Events/Editor/IntGameEventEditor.cs	
@@ -0,0 +1,22 @@
+using UnityEditor;
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  //---------------------------------------------------------------------------
+  [CustomEditor(typeof(IntGameEvent))]
+  public class IntGameEventEditor : Editor {
+    private int testValue = 0;
+
+    //---------------------------------------------------------------------------
+    public override void OnInspectorGUI() {
+      base.OnInspectorGUI();
+
+      EditorGUILayout.BeginHorizontal();
+      testValue = EditorGUILayout.IntField("Test Value", testValue);
+      if (GUILayout.Button("Fire Event")) {
+        ((IntGameEvent)target).Raise(testValue);
+      }
+      EditorGUILayout.EndHorizontal();
+    }
+  }
+}
diff --git a/Scriptable Variables/Events/Editor/IntGameEventEditor.cs.meta b/Scriptable Variables/Events/Editor/IntGameEventEditor.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..a00d18b1ebbd80cc082c43bd44edd51e46805360
--- /dev/null
+++ b/Scriptable Variables/Events/Editor/IntGameEventEditor.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 091b5244678bea24ab2a62e3849cb715
+timeCreated: 1513206436
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Events/Editor/StringGameEventEditor.cs b/Scriptable Variables/Events/Editor/StringGameEventEditor.cs
new file mode 100644
index 0000000000000000000000000000000000000000..1e94c713dd11a8264e71eb39c3247bff482373ab
--- /dev/null
+++ b/Scriptable Variables/Events/Editor/StringGameEventEditor.cs	
@@ -0,0 +1,22 @@
+using UnityEditor;
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  //---------------------------------------------------------------------------
+  [CustomEditor(typeof(StringGameEvent))]
+  public class StringGameEventEditor : Editor {
+    private string testValue;
+
+    //---------------------------------------------------------------------------
+    public override void OnInspectorGUI() {
+      base.OnInspectorGUI();
+
+      EditorGUILayout.BeginHorizontal();
+      testValue = EditorGUILayout.TextField("Test Value", testValue);
+      if (GUILayout.Button("Fire Event")) {
+        ((StringGameEvent)target).Raise(testValue);
+      }
+      EditorGUILayout.EndHorizontal();
+    }
+  }
+}
diff --git a/Scriptable Variables/Events/Editor/StringGameEventEditor.cs.meta b/Scriptable Variables/Events/Editor/StringGameEventEditor.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..c64881ba35d796963e0dc70bc906325db2b016e9
--- /dev/null
+++ b/Scriptable Variables/Events/Editor/StringGameEventEditor.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 5b14325ad63c61f468af93d960da8ec0
+timeCreated: 1513206436
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Events/FloatGameEvent.cs b/Scriptable Variables/Events/FloatGameEvent.cs
new file mode 100644
index 0000000000000000000000000000000000000000..f46f495593e5bd43a5e7085b1d0f10ccf8f55650
--- /dev/null
+++ b/Scriptable Variables/Events/FloatGameEvent.cs	
@@ -0,0 +1,8 @@
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  // ScriptableVariable that decouples components firing and listening to game events that require a float parameter
+  [CreateAssetMenu(menuName = "Scriptable Objects/Events/Float Game Event")]
+  public class FloatGameEvent : GameEvent<float> {
+  }
+}
diff --git a/Scriptable Variables/Events/FloatGameEvent.cs.meta b/Scriptable Variables/Events/FloatGameEvent.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..b8bd36776caf17590c16bb90994b3a0bf9a915b5
--- /dev/null
+++ b/Scriptable Variables/Events/FloatGameEvent.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 548f989fcd91b734492e17b5b7a185fc
+timeCreated: 1510599448
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Events/GameEvent.cs b/Scriptable Variables/Events/GameEvent.cs
new file mode 100644
index 0000000000000000000000000000000000000000..a47dcafeb8329a2fbf4cef548d9b45390012eaff
--- /dev/null
+++ b/Scriptable Variables/Events/GameEvent.cs	
@@ -0,0 +1,31 @@
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  // ScriptableVariable that decouples components firing and listening to game events
+  [CreateAssetMenu(menuName = "Scriptable Objects/Events/Game Event")]
+  public class GameEvent : ScriptableVariable {
+    public delegate void GameEventRaised();
+    public event GameEventRaised OnRaised;
+
+    //---------------------------------------------------------------------------
+    [ContextMenu("Raise")]
+    public void Raise() {
+      if (OnRaised != null) {
+        OnRaised();
+      }
+    }
+  }
+
+  //---------------------------------------------------------------------------
+  public abstract class GameEvent<T> : ScriptableVariable {
+    public delegate void GameEventRaised(T value);
+    public event GameEventRaised OnRaised;
+
+    //---------------------------------------------------------------------------
+    public void Raise(T value) {
+      if (OnRaised != null) {
+        OnRaised(value);
+      }
+    }
+  }
+}
diff --git a/Scriptable Variables/Events/GameEvent.cs.meta b/Scriptable Variables/Events/GameEvent.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..a576a241f57825eb0710d47c77c384953ba4b0ce
--- /dev/null
+++ b/Scriptable Variables/Events/GameEvent.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: c1960bdf0074040469b1823b9228ac1b
+timeCreated: 1510599448
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Events/IntGameEvent.cs b/Scriptable Variables/Events/IntGameEvent.cs
new file mode 100644
index 0000000000000000000000000000000000000000..fea804cdf71e0c44a3f4cd98d81ea833bb050767
--- /dev/null
+++ b/Scriptable Variables/Events/IntGameEvent.cs	
@@ -0,0 +1,8 @@
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  // ScriptableVariable that decouples components firing and listening to game events that require an int parameter
+  [CreateAssetMenu(menuName = "Scriptable Objects/Events/Int Game Event")]
+  public class IntGameEvent : GameEvent<int> {
+  }
+}
diff --git a/Scriptable Variables/Events/IntGameEvent.cs.meta b/Scriptable Variables/Events/IntGameEvent.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..4bcf7f34c723ac1c605a9d5c9e0e777d08b34e28
--- /dev/null
+++ b/Scriptable Variables/Events/IntGameEvent.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 898f8db1b01f0fa4987a99107325acbf
+timeCreated: 1510599448
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Events/StringGameEvent.cs b/Scriptable Variables/Events/StringGameEvent.cs
new file mode 100644
index 0000000000000000000000000000000000000000..178b5855ac880fcfd90977c2ba8b8852abccd7b7
--- /dev/null
+++ b/Scriptable Variables/Events/StringGameEvent.cs	
@@ -0,0 +1,8 @@
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  // ScriptableVariable that decouples components firing and listening to game events that require a string parameter
+  [CreateAssetMenu(menuName = "Scriptable Objects/Events/String Game Event")]
+  public class StringGameEvent : GameEvent<string> {
+  }
+}
diff --git a/Scriptable Variables/Events/StringGameEvent.cs.meta b/Scriptable Variables/Events/StringGameEvent.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..0adce0b253ab145b0abef02f5cf48a90c955e1f3
--- /dev/null
+++ b/Scriptable Variables/Events/StringGameEvent.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: d499e67a7f1c28e41b5dc652ff881d53
+timeCreated: 1510599448
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Interfaces.meta b/Scriptable Variables/Interfaces.meta
new file mode 100644
index 0000000000000000000000000000000000000000..c4c2626211e392bc17a52fa572808ee66f5e3d07
--- /dev/null
+++ b/Scriptable Variables/Interfaces.meta	
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 53525e1a16c954f4aa2e57af9f48c661
+folderAsset: yes
+timeCreated: 1510599567
+licenseType: Pro
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Interfaces/Resettable.cs b/Scriptable Variables/Interfaces/Resettable.cs
new file mode 100644
index 0000000000000000000000000000000000000000..e18337e12613460c009e1b67d3d307df858f1e5d
--- /dev/null
+++ b/Scriptable Variables/Interfaces/Resettable.cs	
@@ -0,0 +1,8 @@
+namespace Shared.ScriptableVariables {
+  // Interface to allow a class to be able to be reset and define what that means
+  public interface Resettable {
+    //---------------------------------------------------------------------------
+    // Define what it means to Reset
+    void Reset();
+  }
+}
diff --git a/Scriptable Variables/Interfaces/Resettable.cs.meta b/Scriptable Variables/Interfaces/Resettable.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..20f309c986994be93c2b16a93b9a33b2a164d923
--- /dev/null
+++ b/Scriptable Variables/Interfaces/Resettable.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: b829c0fd850917d41b53b46459690a17
+timeCreated: 1510599574
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Listeners.meta b/Scriptable Variables/Listeners.meta
new file mode 100644
index 0000000000000000000000000000000000000000..1635af87e1ea1a96aa6ffe1b8bab04d08d05adf5
--- /dev/null
+++ b/Scriptable Variables/Listeners.meta	
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 949b447effd31fe47834737e9344d527
+folderAsset: yes
+timeCreated: 1513206410
+licenseType: Pro
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Listeners/BooleanGameEventListener.cs b/Scriptable Variables/Listeners/BooleanGameEventListener.cs
new file mode 100644
index 0000000000000000000000000000000000000000..36a63c5ce9ace007e181e305abcf8031a7c5cb62
--- /dev/null
+++ b/Scriptable Variables/Listeners/BooleanGameEventListener.cs	
@@ -0,0 +1,22 @@
+using UnityEngine;
+using UnityEngine.Events;
+
+namespace Shared.ScriptableVariables {
+  // Component to tie BooleanGameEvents to Unity's event system
+  public class BooleanGameEventListener : GameEventListener<bool> {
+    [System.Serializable]
+    public class BooleanUnityEvent : UnityEvent<bool> { }
+
+    [Tooltip("The game event to listen to")]
+    public BooleanGameEvent eventToListenTo;
+
+    [Tooltip("The UnityEvent to raise in response to the game event being raised")]
+    public BooleanUnityEvent response;
+
+    //---------------------------------------------------------------------------
+    protected override GameEvent<bool> GetGameEvent() { return eventToListenTo; }
+
+    //---------------------------------------------------------------------------
+    protected override UnityEvent<bool> GetUnityEvent() { return response; }
+  }
+}
diff --git a/Scriptable Variables/Listeners/BooleanGameEventListener.cs.meta b/Scriptable Variables/Listeners/BooleanGameEventListener.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..596e2e5c789642ae8b4b43c108f11eda94a9d912
--- /dev/null
+++ b/Scriptable Variables/Listeners/BooleanGameEventListener.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 7f663866ee9d6174199e2824bb53ec3a
+timeCreated: 1510599448
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Listeners/BooleanVariableListener.cs b/Scriptable Variables/Listeners/BooleanVariableListener.cs
new file mode 100644
index 0000000000000000000000000000000000000000..87dc5acfbad21e09021b590a65cfea51eef5382e
--- /dev/null
+++ b/Scriptable Variables/Listeners/BooleanVariableListener.cs	
@@ -0,0 +1,25 @@
+using UnityEngine;
+using UnityEngine.Events;
+
+namespace Shared.ScriptableVariables {
+
+  /// <summary>
+  /// Used to trigger a UnityEvent in response to changes on a BooleanVariable
+  /// </summary>
+  public class BooleanVariableListener : ScriptableVariableListener<bool> {
+    [Tooltip("The ScriptableVariable to listen for changes")]
+    public BooleanVariable variable;
+
+    [System.Serializable]
+    public class ChangedUnityEvent : UnityEvent<bool> { }
+
+    [Tooltip("The UnityEvent that gets triggered when the variable changes value")]
+    public ChangedUnityEvent OnValueChangedEvent;
+
+    //---------------------------------------------------------------------------
+    protected override ScriptableVariable<bool> GetScriptableVariable() { return variable; }
+
+    //---------------------------------------------------------------------------
+    protected override UnityEvent<bool> GetUnityEvent() { return OnValueChangedEvent; }
+  }
+}
diff --git a/Scriptable Variables/Listeners/BooleanVariableListener.cs.meta b/Scriptable Variables/Listeners/BooleanVariableListener.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..809d0c71b7d69535d3b188416ab1b862ec35496d
--- /dev/null
+++ b/Scriptable Variables/Listeners/BooleanVariableListener.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: db17a8cbe6e4ff74ebe6f8c252162527
+timeCreated: 1513208270
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Listeners/FloatGameEventListener.cs b/Scriptable Variables/Listeners/FloatGameEventListener.cs
new file mode 100644
index 0000000000000000000000000000000000000000..c98ee592edafae892068abb13c61b239cbd84a9d
--- /dev/null
+++ b/Scriptable Variables/Listeners/FloatGameEventListener.cs	
@@ -0,0 +1,22 @@
+using UnityEngine;
+using UnityEngine.Events;
+
+namespace Shared.ScriptableVariables {
+  // Component to tie FloatGameEvents to Unity's event system
+  public class FloatGameEventListener : GameEventListener<float> {
+    [System.Serializable]
+    public class FloatUnityEvent : UnityEvent<float> { }
+
+    [Tooltip("The game event to listen to")]
+    public FloatGameEvent eventToListenTo;
+
+    [Tooltip("The UnityEvent to raise in response to the game event being raised")]
+    public FloatUnityEvent response;
+
+    //---------------------------------------------------------------------------
+    protected override GameEvent<float> GetGameEvent() { return eventToListenTo; }
+
+    //---------------------------------------------------------------------------
+    protected override UnityEvent<float> GetUnityEvent() { return response; }
+  }
+}
diff --git a/Scriptable Variables/Listeners/FloatGameEventListener.cs.meta b/Scriptable Variables/Listeners/FloatGameEventListener.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..88310ca3e0a3c754de90ceef988ac962c22a7690
--- /dev/null
+++ b/Scriptable Variables/Listeners/FloatGameEventListener.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 1cc863298f8099f4ea1cbb4e0701bf2e
+timeCreated: 1510599448
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Listeners/FloatVariableListener.cs b/Scriptable Variables/Listeners/FloatVariableListener.cs
new file mode 100644
index 0000000000000000000000000000000000000000..bc8afc8dc87b2c7939980746b732bfe9291161d4
--- /dev/null
+++ b/Scriptable Variables/Listeners/FloatVariableListener.cs	
@@ -0,0 +1,25 @@
+using UnityEngine;
+using UnityEngine.Events;
+
+namespace Shared.ScriptableVariables {
+
+  /// <summary>
+  /// Used to trigger a UnityEvent in response to changes on a FloatVariable
+  /// </summary>
+  public class FloatVariableListener : ScriptableVariableListener<float> {
+    [Tooltip("The ScriptableVariable to listen for changes")]
+    public FloatVariable variable;
+
+    [System.Serializable]
+    public class ChangedUnityEvent : UnityEvent<float> { }
+
+    [Tooltip("The UnityEvent that gets triggered when the variable changes value")]
+    public ChangedUnityEvent OnValueChangedEvent;
+
+    //---------------------------------------------------------------------------
+    protected override ScriptableVariable<float> GetScriptableVariable() { return variable; }
+
+    //---------------------------------------------------------------------------
+    protected override UnityEvent<float> GetUnityEvent() { return OnValueChangedEvent; }
+  }
+}
diff --git a/Scriptable Variables/Listeners/FloatVariableListener.cs.meta b/Scriptable Variables/Listeners/FloatVariableListener.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..da7a8498b9dd0a1da3536a15080282c8cfced811
--- /dev/null
+++ b/Scriptable Variables/Listeners/FloatVariableListener.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: a8394c2c1178b484db494d974b6096fc
+timeCreated: 1513208270
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Listeners/GameEventListener.cs b/Scriptable Variables/Listeners/GameEventListener.cs
new file mode 100644
index 0000000000000000000000000000000000000000..1c3e7e83447868789a878967c99663a5a26798d0
--- /dev/null
+++ b/Scriptable Variables/Listeners/GameEventListener.cs	
@@ -0,0 +1,57 @@
+using UnityEngine;
+using UnityEngine.Events;
+
+namespace Shared.ScriptableVariables {
+  // Component to tie GameEvents to Unity's event system
+  public class GameEventListener : MonoBehaviour {
+    [Tooltip("The game event to listen to")]
+    public GameEvent eventToListenTo;
+
+    [Tooltip("The UnityEvent to raise in response to the game event being raised")]
+    public UnityEvent response;
+
+    //---------------------------------------------------------------------------
+    void OnEnable() {
+      eventToListenTo.OnRaised += OnEventRaised;
+    }
+
+    //---------------------------------------------------------------------------
+    void OnDisable() {
+      eventToListenTo.OnRaised -= OnEventRaised;
+    }
+
+    //---------------------------------------------------------------------------
+    public virtual void OnEventRaised() {
+      if (response != null) {
+        response.Invoke();
+      }
+    }
+  }
+
+  //---------------------------------------------------------------------------
+  public abstract class GameEventListener<T> : MonoBehaviour {
+    //---------------------------------------------------------------------------
+    protected abstract GameEvent<T> GetGameEvent();
+
+    //---------------------------------------------------------------------------
+    protected abstract UnityEvent<T> GetUnityEvent();
+
+    //---------------------------------------------------------------------------
+    void OnEnable() {
+      GetGameEvent().OnRaised += OnEventRaised;
+    }
+
+    //---------------------------------------------------------------------------
+    void OnDisable() {
+      GetGameEvent().OnRaised -= OnEventRaised;
+    }
+
+    //---------------------------------------------------------------------------
+    public virtual void OnEventRaised(T value) {
+      var unityEvent = GetUnityEvent();
+      if (unityEvent != null) {
+        unityEvent.Invoke(value);
+      }
+    }
+  }
+}
diff --git a/Scriptable Variables/Listeners/GameEventListener.cs.meta b/Scriptable Variables/Listeners/GameEventListener.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..46d0888a8904119959f918efa0f41eecd7d3b52c
--- /dev/null
+++ b/Scriptable Variables/Listeners/GameEventListener.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 991b72107ef95af46937ebdd06290da8
+timeCreated: 1510599448
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Listeners/IntGameEventListener.cs b/Scriptable Variables/Listeners/IntGameEventListener.cs
new file mode 100644
index 0000000000000000000000000000000000000000..c6da58d7bd820bca1dea44f8805a1e79d8bc8c38
--- /dev/null
+++ b/Scriptable Variables/Listeners/IntGameEventListener.cs	
@@ -0,0 +1,22 @@
+using UnityEngine;
+using UnityEngine.Events;
+
+namespace Shared.ScriptableVariables {
+  // Component to tie IntGameEvents to Unity's event system
+  public class IntGameEventListener : GameEventListener<int> {
+    [System.Serializable]
+    public class IntUnityEvent : UnityEvent<int> { }
+
+    [Tooltip("The game event to listen to")]
+    public IntGameEvent eventToListenTo;
+
+    [Tooltip("The UnityEvent to raise in response to the game event being raised")]
+    public IntUnityEvent response;
+
+    //---------------------------------------------------------------------------
+    protected override GameEvent<int> GetGameEvent() { return eventToListenTo; }
+
+    //---------------------------------------------------------------------------
+    protected override UnityEvent<int> GetUnityEvent() { return response; }
+  }
+}
diff --git a/Scriptable Variables/Listeners/IntGameEventListener.cs.meta b/Scriptable Variables/Listeners/IntGameEventListener.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..9936bda44b1193410c8f22be17aee7561812af03
--- /dev/null
+++ b/Scriptable Variables/Listeners/IntGameEventListener.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 75a82ff72a4ae704e9821e1403841b7c
+timeCreated: 1510599448
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Listeners/IntVariableListener.cs b/Scriptable Variables/Listeners/IntVariableListener.cs
new file mode 100644
index 0000000000000000000000000000000000000000..dcaf6227f85a8dd1de3ab85c8719fd73f34ebe02
--- /dev/null
+++ b/Scriptable Variables/Listeners/IntVariableListener.cs	
@@ -0,0 +1,25 @@
+using UnityEngine;
+using UnityEngine.Events;
+
+namespace Shared.ScriptableVariables {
+
+  /// <summary>
+  /// Used to trigger a UnityEvent in response to changes on a IntVariable
+  /// </summary>
+  public class IntVariableListener : ScriptableVariableListener<int> {
+    [Tooltip("The ScriptableVariable to listen for changes")]
+    public IntVariable variable;
+
+    [System.Serializable]
+    public class ChangedUnityEvent : UnityEvent<int> { }
+
+    [Tooltip("The UnityEvent that gets triggered when the variable changes value")]
+    public ChangedUnityEvent OnValueChangedEvent;
+
+    //---------------------------------------------------------------------------
+    protected override ScriptableVariable<int> GetScriptableVariable() { return variable; }
+
+    //---------------------------------------------------------------------------
+    protected override UnityEvent<int> GetUnityEvent() { return OnValueChangedEvent; }
+  }
+}
diff --git a/Scriptable Variables/Listeners/IntVariableListener.cs.meta b/Scriptable Variables/Listeners/IntVariableListener.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..d2a2682c276e04106d50aecfc320b8b4fb6e30a8
--- /dev/null
+++ b/Scriptable Variables/Listeners/IntVariableListener.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: ab4732b165c21ea45ae84bebc9d81f4a
+timeCreated: 1513208270
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Listeners/ScriptableVariableListener.cs b/Scriptable Variables/Listeners/ScriptableVariableListener.cs
new file mode 100644
index 0000000000000000000000000000000000000000..d977e3b734e369034312270abf8617d872a26c97
--- /dev/null
+++ b/Scriptable Variables/Listeners/ScriptableVariableListener.cs	
@@ -0,0 +1,36 @@
+using UnityEngine;
+using UnityEngine.Events;
+
+namespace Shared.ScriptableVariables {
+  /// <summary>
+  /// Used to trigger a UnityEvent in response to changes on a ScriptableVariable.
+  /// </summary>
+  //---------------------------------------------------------------------------
+  public abstract class ScriptableVariableListener<T> : MonoBehaviour {
+
+    //---------------------------------------------------------------------------
+    protected abstract ScriptableVariable<T> GetScriptableVariable();
+
+    //---------------------------------------------------------------------------
+    protected abstract UnityEvent<T> GetUnityEvent();
+
+    //---------------------------------------------------------------------------
+    void OnEnable() {
+      GetScriptableVariable().OnValueChanged += OnValueChanged;
+    }
+
+    //---------------------------------------------------------------------------
+    void OnDisable() {
+      GetScriptableVariable().OnValueChanged -= OnValueChanged;
+    }
+
+    //---------------------------------------------------------------------------
+    private void OnValueChanged() {
+      var unityEvent = GetUnityEvent();
+      var scriptableVariable = GetScriptableVariable();
+      if (unityEvent != null) {
+        unityEvent.Invoke(scriptableVariable.Value);
+      }
+    }
+  }
+}
diff --git a/Scriptable Variables/Listeners/ScriptableVariableListener.cs.meta b/Scriptable Variables/Listeners/ScriptableVariableListener.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..845702b477a21a20fb19d9326477acd901a6b09c
--- /dev/null
+++ b/Scriptable Variables/Listeners/ScriptableVariableListener.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: ded5f8a11a2a71441b9961190e69544f
+timeCreated: 1513208270
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Listeners/StringGameEventListener.cs b/Scriptable Variables/Listeners/StringGameEventListener.cs
new file mode 100644
index 0000000000000000000000000000000000000000..9a86b2d68277340b2ffadd4a13d78a60851fa72f
--- /dev/null
+++ b/Scriptable Variables/Listeners/StringGameEventListener.cs	
@@ -0,0 +1,22 @@
+using UnityEngine;
+using UnityEngine.Events;
+
+namespace Shared.ScriptableVariables {
+  // Component to tie StringGameEvents to Unity's event system
+  public class StringGameEventListener : GameEventListener<string> {
+    [System.Serializable]
+    public class StringUnityEvent : UnityEvent<string> { }
+
+    [Tooltip("The game event to listen to")]
+    public StringGameEvent eventToListenTo;
+
+    [Tooltip("The UnityEvent to raise in response to the game event being raised")]
+    public StringUnityEvent response;
+
+    //---------------------------------------------------------------------------
+    protected override GameEvent<string> GetGameEvent() { return eventToListenTo; }
+
+    //---------------------------------------------------------------------------
+    protected override UnityEvent<string> GetUnityEvent() { return response; }
+  }
+}
diff --git a/Scriptable Variables/Listeners/StringGameEventListener.cs.meta b/Scriptable Variables/Listeners/StringGameEventListener.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..f2e324a0990fb6ab8ff966f1f1ce134696b0cf75
--- /dev/null
+++ b/Scriptable Variables/Listeners/StringGameEventListener.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: ace966faabda0734887c2cb816d27c30
+timeCreated: 1510599448
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Listeners/StringVariableListener.cs b/Scriptable Variables/Listeners/StringVariableListener.cs
new file mode 100644
index 0000000000000000000000000000000000000000..416b67f9a6f3faef75f67351b56980df680bb414
--- /dev/null
+++ b/Scriptable Variables/Listeners/StringVariableListener.cs	
@@ -0,0 +1,25 @@
+using UnityEngine;
+using UnityEngine.Events;
+
+namespace Shared.ScriptableVariables {
+
+  /// <summary>
+  /// Used to trigger a UnityEvent in response to changes on a StringVariable
+  /// </summary>
+  public class StringVariableListener : ScriptableVariableListener<string> {
+    [Tooltip("The ScriptableVariable to listen for changes")]
+    public StringVariable variable;
+
+    [System.Serializable]
+    public class ChangedUnityEvent : UnityEvent<string> { }
+
+    [Tooltip("The UnityEvent that gets triggered when the variable changes value")]
+    public ChangedUnityEvent OnValueChangedEvent;
+
+    //---------------------------------------------------------------------------
+    protected override ScriptableVariable<string> GetScriptableVariable() { return variable; }
+
+    //---------------------------------------------------------------------------
+    protected override UnityEvent<string> GetUnityEvent() { return OnValueChangedEvent; }
+  }
+}
diff --git a/Scriptable Variables/Listeners/StringVariableListener.cs.meta b/Scriptable Variables/Listeners/StringVariableListener.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..24a12ab5a3180f48673bf4538972708e7db1819a
--- /dev/null
+++ b/Scriptable Variables/Listeners/StringVariableListener.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: e6c4b70e919c94147b49f020dd8baa4f
+timeCreated: 1513208270
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Variables.meta b/Scriptable Variables/Variables.meta
new file mode 100644
index 0000000000000000000000000000000000000000..1064394aa1a3c04a3dd0f1c75b2d58e499305a29
--- /dev/null
+++ b/Scriptable Variables/Variables.meta	
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 199e8033ab0036d4094976417900bbd0
+folderAsset: yes
+timeCreated: 1510599420
+licenseType: Pro
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Variables/Base Types.meta b/Scriptable Variables/Variables/Base Types.meta
new file mode 100644
index 0000000000000000000000000000000000000000..d5cf984a44b80ac5f61c92343c18250f083d90a2
--- /dev/null
+++ b/Scriptable Variables/Variables/Base Types.meta	
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 3aa26c94f73caf643b84e8e086b5be8a
+folderAsset: yes
+timeCreated: 1510599712
+licenseType: Pro
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Variables/Base Types/BooleanVariable.cs b/Scriptable Variables/Variables/Base Types/BooleanVariable.cs
new file mode 100644
index 0000000000000000000000000000000000000000..ebb3a8dcbf1ed6108c2e1ab521a3b923f2b9098b
--- /dev/null
+++ b/Scriptable Variables/Variables/Base Types/BooleanVariable.cs	
@@ -0,0 +1,21 @@
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  // A boolean value to share across components, scenes, and prefabs
+  [CreateAssetMenu(menuName = "Scriptable Objects/Variables/Boolean")]
+  public class BooleanVariable : ScriptableVariable<bool> {
+    //---------------------------------------------------------------------------
+    [ContextMenu("Reset To Default Value")]
+    public void ContextMenuReset() {
+      Reset();
+    }
+  }
+
+#if UNITY_EDITOR
+  //-----------------------------------------------------------------------------
+  [UnityEditor.CustomEditor(typeof(BooleanVariable))]
+  [UnityEditor.CanEditMultipleObjects]
+  public class BooleanScriptableVariableEditor : BooleanVariable.BaseScriptableVariableEditor {
+  }
+#endif
+}
diff --git a/Scriptable Variables/Variables/Base Types/BooleanVariable.cs.meta b/Scriptable Variables/Variables/Base Types/BooleanVariable.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..9da389ddb6fa33aa9ccd8cb8d7da990c54d691e8
--- /dev/null
+++ b/Scriptable Variables/Variables/Base Types/BooleanVariable.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 6174914c1d2a75f44afcf16722f7ddbb
+timeCreated: 1510599427
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Variables/Base Types/FloatVariable.cs b/Scriptable Variables/Variables/Base Types/FloatVariable.cs
new file mode 100644
index 0000000000000000000000000000000000000000..5defc9fd0b5555d9f27b99c40aefc0e1401fa2d1
--- /dev/null
+++ b/Scriptable Variables/Variables/Base Types/FloatVariable.cs	
@@ -0,0 +1,21 @@
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  // A float value to share across components, scenes, and prefabs
+  [CreateAssetMenu(menuName = "Scriptable Objects/Variables/Float")]
+  public class FloatVariable : ScriptableVariable<float> {
+    //---------------------------------------------------------------------------
+    [ContextMenu("Reset To Default Value")]
+    public void ContextMenuReset() {
+      Reset();
+    }
+  }
+
+#if UNITY_EDITOR
+  //-----------------------------------------------------------------------------
+  [UnityEditor.CustomEditor(typeof(FloatVariable))]
+  [UnityEditor.CanEditMultipleObjects]
+  public class FloatScriptableVariableEditor : FloatVariable.BaseScriptableVariableEditor {
+  }
+#endif
+}
diff --git a/Scriptable Variables/Variables/Base Types/FloatVariable.cs.meta b/Scriptable Variables/Variables/Base Types/FloatVariable.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..26581990c341e2573ea2f1a4288dcdd987f5cdf0
--- /dev/null
+++ b/Scriptable Variables/Variables/Base Types/FloatVariable.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 7d7e88b3e41ece54596c648435a09398
+timeCreated: 1510599427
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Variables/Base Types/IntVariable.cs b/Scriptable Variables/Variables/Base Types/IntVariable.cs
new file mode 100644
index 0000000000000000000000000000000000000000..cf13273491a5c86b8d3d01ae14dc2b86dd8cbd78
--- /dev/null
+++ b/Scriptable Variables/Variables/Base Types/IntVariable.cs	
@@ -0,0 +1,21 @@
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  // An int value to share across components, scenes, and prefabs
+  [CreateAssetMenu(menuName = "Scriptable Objects/Variables/Int")]
+  public class IntVariable : ScriptableVariable<int> {
+    //---------------------------------------------------------------------------
+    [ContextMenu("Reset To Default Value")]
+    public void ContextMenuReset() {
+      Reset();
+    }
+  }
+
+#if UNITY_EDITOR
+  //-----------------------------------------------------------------------------
+  [UnityEditor.CustomEditor(typeof(IntVariable))]
+  [UnityEditor.CanEditMultipleObjects]
+  public class IntScriptableVariableEditor : IntVariable.BaseScriptableVariableEditor {
+  }
+#endif
+}
diff --git a/Scriptable Variables/Variables/Base Types/IntVariable.cs.meta b/Scriptable Variables/Variables/Base Types/IntVariable.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..2d7d6a5bdbf7be215ffdf2cdfbdc2c2dca89a63a
--- /dev/null
+++ b/Scriptable Variables/Variables/Base Types/IntVariable.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 77b835ad455148249a89aef1915debf4
+timeCreated: 1510599427
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Variables/Base Types/ScriptableVariable.cs b/Scriptable Variables/Variables/Base Types/ScriptableVariable.cs
new file mode 100644
index 0000000000000000000000000000000000000000..59162d2b27577bc032fbc8f94398b623ecb3da68
--- /dev/null
+++ b/Scriptable Variables/Variables/Base Types/ScriptableVariable.cs	
@@ -0,0 +1,60 @@
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  //---------------------------------------------------------------------------
+  // Base class for Scriptable Objects to share across components, scenes, and prefabs
+  public abstract class ScriptableVariable : ScriptableObject {
+    [TextArea]
+    public string description;
+  }
+
+  //---------------------------------------------------------------------------
+  // Base class for Scriptable Objects that represent a single variable to share across components, scenes, and prefabs
+  public abstract class ScriptableVariable<T> : ScriptableVariable, Resettable {
+    [Tooltip("The value of the variable")]
+    [SerializeField]
+    private T value;
+
+    [Tooltip("The default value of the variable to go back to on Reset")]
+    public T defaultValue;
+
+    public delegate void ValueChangeHandler();
+    public event ValueChangeHandler OnValueChanged;
+
+    //---------------------------------------------------------------------------
+    public T Value {
+      get { return value; }
+      set {
+        if ((value == null && this.value != null) || (value != null && !value.Equals(this.value))) {
+          this.value = value;
+          if (OnValueChanged != null) {
+            OnValueChanged.Invoke();
+          }
+        }
+      }
+    }
+
+    //---------------------------------------------------------------------------
+    public void Reset() {
+      Value = defaultValue;
+    }
+
+#if UNITY_EDITOR
+    //-----------------------------------------------------------------------------
+    //Base class for custom editors which expose the Property of ScriptableVariables
+    public class BaseScriptableVariableEditor : UnityEditor.Editor {
+      public override void OnInspectorGUI() {
+        UnityEditor.EditorGUI.BeginChangeCheck();
+        base.OnInspectorGUI();
+        if (UnityEditor.EditorGUI.EndChangeCheck()) {
+          var scriptableVariable = target as ScriptableVariable<T>;
+          if (scriptableVariable.OnValueChanged != null) {
+            scriptableVariable.OnValueChanged.Invoke();
+          }
+        }
+      }
+    }
+#endif
+
+  }
+}
diff --git a/Scriptable Variables/Variables/Base Types/ScriptableVariable.cs.meta b/Scriptable Variables/Variables/Base Types/ScriptableVariable.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..88004725869f86eac58293d928aed72702c22622
--- /dev/null
+++ b/Scriptable Variables/Variables/Base Types/ScriptableVariable.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 046df9445da2fda48b3d1f8d84047b14
+timeCreated: 1510599427
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Variables/Base Types/StringVariable.cs b/Scriptable Variables/Variables/Base Types/StringVariable.cs
new file mode 100644
index 0000000000000000000000000000000000000000..3d959db32683a05f2e56d04686355668b94bd08f
--- /dev/null
+++ b/Scriptable Variables/Variables/Base Types/StringVariable.cs	
@@ -0,0 +1,21 @@
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  // A string value to share across components, scenes, and prefabs
+  [CreateAssetMenu(menuName = "Scriptable Objects/Variables/String")]
+  public class StringVariable : ScriptableVariable<string> {
+    //---------------------------------------------------------------------------
+    [ContextMenu("Reset To Default Value")]
+    public void ContextMenuReset() {
+      Reset();
+    }
+  }
+
+#if UNITY_EDITOR
+  //-----------------------------------------------------------------------------
+  [UnityEditor.CustomEditor(typeof(StringVariable))]
+  [UnityEditor.CanEditMultipleObjects]
+  public class StringScriptableVariableEditor : StringVariable.BaseScriptableVariableEditor {
+  }
+#endif
+}
diff --git a/Scriptable Variables/Variables/Base Types/StringVariable.cs.meta b/Scriptable Variables/Variables/Base Types/StringVariable.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..17e4c6cb5db9a00b5f92f704f75f0a01de746708
--- /dev/null
+++ b/Scriptable Variables/Variables/Base Types/StringVariable.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: d0b3993ca7cbd0e459f217e13ea06b66
+timeCreated: 1510599427
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Variables/Reference Types.meta b/Scriptable Variables/Variables/Reference Types.meta
new file mode 100644
index 0000000000000000000000000000000000000000..068fe2841dfc58f767d623a7e86cfcd2972a8fd9
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types.meta	
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: ddca758e9621a174280f922c14a157f7
+folderAsset: yes
+timeCreated: 1510599733
+licenseType: Pro
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Variables/Reference Types/Editor.meta b/Scriptable Variables/Variables/Reference Types/Editor.meta
new file mode 100644
index 0000000000000000000000000000000000000000..a0dc2b47950ae399db0cee229c0c572042767f4a
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/Editor.meta	
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: fff3d06e72902f446817e50679685a41
+folderAsset: yes
+timeCreated: 1510600555
+licenseType: Pro
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Variables/Reference Types/Editor/ReferenceBooleanVariableInspector.cs b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceBooleanVariableInspector.cs
new file mode 100644
index 0000000000000000000000000000000000000000..60dbfd67f0106b94ce25a24a1860341716c22b3e
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceBooleanVariableInspector.cs	
@@ -0,0 +1,9 @@
+using UnityEditor;
+
+namespace Shared.ScriptableVariables {
+  // A custom Inspector Editor for ReferenceBooleanVariables
+  [CustomEditor(typeof(ReferenceBooleanVariable))]
+  [CanEditMultipleObjects]
+  public class ReferenceBooleanVariableInspector : ReferenceScriptableVariableInspector {
+  }
+}
diff --git a/Scriptable Variables/Variables/Reference Types/Editor/ReferenceBooleanVariableInspector.cs.meta b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceBooleanVariableInspector.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..726f8b4536fa1d91dfaee835a46c5ed25f8cd9df
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceBooleanVariableInspector.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 46ec3998332a3a84682c6040a4185138
+timeCreated: 1510601506
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Variables/Reference Types/Editor/ReferenceFloatVariableInspector.cs b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceFloatVariableInspector.cs
new file mode 100644
index 0000000000000000000000000000000000000000..0264c9a3aef5e7d52a6de1e469c8cd3ecb77a2b8
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceFloatVariableInspector.cs	
@@ -0,0 +1,9 @@
+using UnityEditor;
+
+namespace Shared.ScriptableVariables {
+  // A custom Inspector Editor for ReferenceFloatVariables
+  [CustomEditor(typeof(ReferenceFloatVariable))]
+  [CanEditMultipleObjects]
+  public class ReferenceFloatVariableInspector : ReferenceScriptableVariableInspector {
+  }
+}
diff --git a/Scriptable Variables/Variables/Reference Types/Editor/ReferenceFloatVariableInspector.cs.meta b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceFloatVariableInspector.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..966aff812e74d467c35a880f7244a42f75fd5b81
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceFloatVariableInspector.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: fe01a7488e400f7439f0a7c65d6b1726
+timeCreated: 1510601506
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Variables/Reference Types/Editor/ReferenceIntVariableInspector.cs b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceIntVariableInspector.cs
new file mode 100644
index 0000000000000000000000000000000000000000..d9f9e9e10b5e98f47381c8a797b49eae7d4270a0
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceIntVariableInspector.cs	
@@ -0,0 +1,9 @@
+using UnityEditor;
+
+namespace Shared.ScriptableVariables {
+  // A custom Inspector Editor for ReferenceIntVariables
+  [CustomEditor(typeof(ReferenceIntVariable))]
+  [CanEditMultipleObjects]
+  public class ReferenceIntVariableInspector : ReferenceScriptableVariableInspector {
+  }
+}
diff --git a/Scriptable Variables/Variables/Reference Types/Editor/ReferenceIntVariableInspector.cs.meta b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceIntVariableInspector.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..49bb5661372d1e7e1a5a855a04cafaf4b3248cf2
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceIntVariableInspector.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: cc52a5deb1a87ce41a657ab42cd21cca
+timeCreated: 1510601506
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Variables/Reference Types/Editor/ReferenceScriptableVariableInspector.cs b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceScriptableVariableInspector.cs
new file mode 100644
index 0000000000000000000000000000000000000000..94c531aaee2ee602b6561d6b29f2df5507194c96
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceScriptableVariableInspector.cs	
@@ -0,0 +1,58 @@
+using UnityEditor;
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  // A custom Inspector Editor for ReferenceStringVariables
+  public class ReferenceScriptableVariableInspector : Editor {
+    SerializedProperty useConstant;
+    SerializedProperty constantValue;
+    SerializedProperty referenceValue;
+
+    // ---------------------------------------------------------------------------
+    void OnEnable() {
+      useConstant = serializedObject.FindProperty("useConstant");
+      constantValue = serializedObject.FindProperty("constantValue");
+      referenceValue = serializedObject.FindProperty("referenceValue");
+    }
+
+    // ---------------------------------------------------------------------------
+    public override void OnInspectorGUI() {
+      serializedObject.Update();
+
+      // Show the currently active value type (constant or reference)
+      if (useConstant.boolValue) {
+        EditorGUILayout.PropertyField(constantValue);
+      }
+      else {
+        EditorGUILayout.PropertyField(referenceValue);
+      }
+
+      // Setup right click to switch between the active value type
+      var labelRect = GUILayoutUtility.GetLastRect();
+      if (GUI.Button(labelRect, GUIContent.none, GUIStyle.none) && Event.current.button == 1) {
+        var menu = new GenericMenu();
+        if (useConstant.boolValue) {
+          menu.AddItem(new GUIContent("Use Reference Value"), false, UseReferenceValue);
+        }
+        else {
+          menu.AddItem(new GUIContent("Use Constant Value"), false, UseConstantValue);
+        }
+        menu.ShowAsContext();
+      }
+
+      serializedObject.ApplyModifiedProperties();
+    }
+
+    //---------------------------------------------------------------------------
+    private void UseReferenceValue() {
+      useConstant.boolValue = false;
+      serializedObject.ApplyModifiedProperties();
+    }
+
+    //---------------------------------------------------------------------------
+    private void UseConstantValue() {
+      useConstant.boolValue = true;
+      serializedObject.ApplyModifiedProperties();
+    }
+  }
+}
diff --git a/Scriptable Variables/Variables/Reference Types/Editor/ReferenceScriptableVariableInspector.cs.meta b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceScriptableVariableInspector.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..0da9b0c260725d2ecd5a50984fb6a755c89b181a
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceScriptableVariableInspector.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 8a0379305c24f1f4fba92dd1faee66af
+timeCreated: 1510601506
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Variables/Reference Types/Editor/ReferenceStringVariableInspector.cs b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceStringVariableInspector.cs
new file mode 100644
index 0000000000000000000000000000000000000000..03ff0230124ac46f23016633158eeb0636fd3145
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceStringVariableInspector.cs	
@@ -0,0 +1,9 @@
+using UnityEditor;
+
+namespace Shared.ScriptableVariables {
+  // A custom Inspector Editor for ReferenceStringVariables
+  [CustomEditor(typeof(ReferenceStringVariable))]
+  [CanEditMultipleObjects]
+  public class ReferenceStringVariableInspector : ReferenceScriptableVariableInspector {
+  }
+}
diff --git a/Scriptable Variables/Variables/Reference Types/Editor/ReferenceStringVariableInspector.cs.meta b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceStringVariableInspector.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..0f083e6341b76b2a4f2348d9645c25a7fe646d69
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceStringVariableInspector.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: b640fb82fd6813e40b5d8ed19aa1e9f6
+timeCreated: 1510601506
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Variables/Reference Types/ReferenceBooleanVariable.cs b/Scriptable Variables/Variables/Reference Types/ReferenceBooleanVariable.cs
new file mode 100644
index 0000000000000000000000000000000000000000..e0151fbac26607d0d40c04d3ed04bb9d6d6484cd
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/ReferenceBooleanVariable.cs	
@@ -0,0 +1,8 @@
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  // A reference to a boolean value to share across components, scenes, and prefabs that can be overridden to a constant different value
+  [CreateAssetMenu(menuName = "Scriptable Objects/Variables/Reference/Boolean")]
+  public class ReferenceBooleanVariable : ReferenceScriptableVariable<BooleanVariable, bool> {
+  }
+}
diff --git a/Scriptable Variables/Variables/Reference Types/ReferenceBooleanVariable.cs.meta b/Scriptable Variables/Variables/Reference Types/ReferenceBooleanVariable.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..13f24f480e7ccd1deabcaa8f5eaf5cbd022d59e3
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/ReferenceBooleanVariable.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: dc11cb8fa12bce349a901887a47e3cd1
+timeCreated: 1510599427
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Variables/Reference Types/ReferenceFloatVariable.cs b/Scriptable Variables/Variables/Reference Types/ReferenceFloatVariable.cs
new file mode 100644
index 0000000000000000000000000000000000000000..67076e665eff51fe69dfe1f490602dbb3d57b76b
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/ReferenceFloatVariable.cs	
@@ -0,0 +1,8 @@
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  // A reference to a float value to share across components, scenes, and prefabs that can be overridden to a constant different value
+  [CreateAssetMenu(menuName = "Scriptable Objects/Variables/Reference/Float")]
+  public class ReferenceFloatVariable : ReferenceScriptableVariable<FloatVariable, float> {
+  }
+}
diff --git a/Scriptable Variables/Variables/Reference Types/ReferenceFloatVariable.cs.meta b/Scriptable Variables/Variables/Reference Types/ReferenceFloatVariable.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..a77b408da39fa4a696393d6e1122b258f9fa6a41
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/ReferenceFloatVariable.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 0684b8ae3b58fd446b31ca3f0369dd7c
+timeCreated: 1510599427
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Variables/Reference Types/ReferenceIntVariable.cs b/Scriptable Variables/Variables/Reference Types/ReferenceIntVariable.cs
new file mode 100644
index 0000000000000000000000000000000000000000..7d91d8d1a8ffb59b1362a42d9f8502d66b25209c
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/ReferenceIntVariable.cs	
@@ -0,0 +1,8 @@
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  // A reference to an int value to share across components, scenes, and prefabs that can be overridden to a constant different value
+  [CreateAssetMenu(menuName = "Scriptable Objects/Variables/Reference/Int")]
+  public class ReferenceIntVariable : ReferenceScriptableVariable<IntVariable, int> {
+  }
+}
diff --git a/Scriptable Variables/Variables/Reference Types/ReferenceIntVariable.cs.meta b/Scriptable Variables/Variables/Reference Types/ReferenceIntVariable.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..8ba334433bb884b4e79e84cd3b90ae5f5ae04c59
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/ReferenceIntVariable.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 62673a73de96a294cb4c8729f0a38d22
+timeCreated: 1510599427
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Variables/Reference Types/ReferenceScriptableVariable.cs b/Scriptable Variables/Variables/Reference Types/ReferenceScriptableVariable.cs
new file mode 100644
index 0000000000000000000000000000000000000000..a8761b0a4ef790df5016a20f7830f47d0ad8d9bc
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/ReferenceScriptableVariable.cs	
@@ -0,0 +1,17 @@
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  // A reference to a boolean value to share across components, scenes, and prefabs that can be overridden to a constant different value
+  public class ReferenceScriptableVariable<TScriptableVariable, TValueType> : ScriptableVariable where TScriptableVariable : ScriptableVariable<TValueType> {
+    [Tooltip("Whether to use the referenced value or a constant value")]
+    public bool useConstant;
+
+    [Tooltip("An override constant value to use instead of the reference value")]
+    public TValueType constantValue;
+
+    [Tooltip("The variable this component is referencing")]
+    public TScriptableVariable referenceValue;
+
+    public TValueType Value { get { return useConstant ? constantValue : referenceValue.Value; } set { referenceValue.Value = value; } }
+  }
+}
diff --git a/Scriptable Variables/Variables/Reference Types/ReferenceScriptableVariable.cs.meta b/Scriptable Variables/Variables/Reference Types/ReferenceScriptableVariable.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..f14f4ec4ac0ff0a8ba8a17a113493017d448f81e
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/ReferenceScriptableVariable.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 036ed80159a9c6340a57b5ab8830d4b6
+timeCreated: 1510599427
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Variables/Reference Types/ReferenceStringVariable.cs b/Scriptable Variables/Variables/Reference Types/ReferenceStringVariable.cs
new file mode 100644
index 0000000000000000000000000000000000000000..6d53f415bea24dbccde2e1d57a71fbb697746ae1
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/ReferenceStringVariable.cs	
@@ -0,0 +1,8 @@
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  // A reference to a string value to share across components, scenes, and prefabs that can be overridden to a constant different value
+  [CreateAssetMenu(menuName = "Scriptable Objects/Variables/Reference/String")]
+  public class ReferenceStringVariable : ReferenceScriptableVariable<StringVariable, string> {
+  }
+}
diff --git a/Scriptable Variables/Variables/Reference Types/ReferenceStringVariable.cs.meta b/Scriptable Variables/Variables/Reference Types/ReferenceStringVariable.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..74ffa669b8a811f78b07448efd07b0b043667eca
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/ReferenceStringVariable.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 37c1a078c5908a54d9b514dcd4c35db1
+timeCreated: 1510599427
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: