From 5179d8818441ad630b48955ced635009f1085c79 Mon Sep 17 00:00:00 2001
From: michael <insominx@yahoo.com>
Date: Tue, 26 Mar 2019 12:05:05 -0700
Subject: [PATCH] Added scriptable vars shared code and removed meta-less
 readme.

---
 README.md                                     |  2 -
 Scriptable Variables.meta                     |  8 +++
 .../AutomaticResettableResetter.cs            | 35 +++++++++++
 .../AutomaticResettableResetter.cs.meta       | 13 ++++
 Scriptable Variables/Events.meta              | 10 ++++
 .../Events/BooleanGameEvent.cs                | 19 ++++++
 .../Events/BooleanGameEvent.cs.meta           | 13 ++++
 Scriptable Variables/Events/Editor.meta       | 10 ++++
 .../Events/Editor/BooleanGameEventEditor.cs   | 22 +++++++
 .../Editor/BooleanGameEventEditor.cs.meta     | 13 ++++
 .../Events/Editor/FloatGameEventEditor.cs     | 22 +++++++
 .../Editor/FloatGameEventEditor.cs.meta       | 13 ++++
 .../Events/Editor/GameEventEditor.cs          | 17 ++++++
 .../Events/Editor/GameEventEditor.cs.meta     | 13 ++++
 .../Events/Editor/IntGameEventEditor.cs       | 22 +++++++
 .../Events/Editor/IntGameEventEditor.cs.meta  | 13 ++++
 .../Events/Editor/StringGameEventEditor.cs    | 22 +++++++
 .../Editor/StringGameEventEditor.cs.meta      | 13 ++++
 Scriptable Variables/Events/FloatGameEvent.cs |  8 +++
 .../Events/FloatGameEvent.cs.meta             | 13 ++++
 Scriptable Variables/Events/GameEvent.cs      | 31 ++++++++++
 Scriptable Variables/Events/GameEvent.cs.meta | 13 ++++
 Scriptable Variables/Events/IntGameEvent.cs   |  8 +++
 .../Events/IntGameEvent.cs.meta               | 13 ++++
 .../Events/StringGameEvent.cs                 |  8 +++
 .../Events/StringGameEvent.cs.meta            | 13 ++++
 Scriptable Variables/Interfaces.meta          | 10 ++++
 Scriptable Variables/Interfaces/Resettable.cs |  8 +++
 .../Interfaces/Resettable.cs.meta             | 13 ++++
 Scriptable Variables/Listeners.meta           | 10 ++++
 .../Listeners/BooleanGameEventListener.cs     | 22 +++++++
 .../BooleanGameEventListener.cs.meta          | 13 ++++
 .../Listeners/BooleanVariableListener.cs      | 25 ++++++++
 .../Listeners/BooleanVariableListener.cs.meta | 13 ++++
 .../Listeners/FloatGameEventListener.cs       | 22 +++++++
 .../Listeners/FloatGameEventListener.cs.meta  | 13 ++++
 .../Listeners/FloatVariableListener.cs        | 25 ++++++++
 .../Listeners/FloatVariableListener.cs.meta   | 13 ++++
 .../Listeners/GameEventListener.cs            | 57 ++++++++++++++++++
 .../Listeners/GameEventListener.cs.meta       | 13 ++++
 .../Listeners/IntGameEventListener.cs         | 22 +++++++
 .../Listeners/IntGameEventListener.cs.meta    | 13 ++++
 .../Listeners/IntVariableListener.cs          | 25 ++++++++
 .../Listeners/IntVariableListener.cs.meta     | 13 ++++
 .../Listeners/ScriptableVariableListener.cs   | 36 +++++++++++
 .../ScriptableVariableListener.cs.meta        | 13 ++++
 .../Listeners/StringGameEventListener.cs      | 22 +++++++
 .../Listeners/StringGameEventListener.cs.meta | 13 ++++
 .../Listeners/StringVariableListener.cs       | 25 ++++++++
 .../Listeners/StringVariableListener.cs.meta  | 13 ++++
 Scriptable Variables/Variables.meta           | 10 ++++
 .../Variables/Base Types.meta                 | 10 ++++
 .../Variables/Base Types/BooleanVariable.cs   | 21 +++++++
 .../Base Types/BooleanVariable.cs.meta        | 13 ++++
 .../Variables/Base Types/FloatVariable.cs     | 21 +++++++
 .../Base Types/FloatVariable.cs.meta          | 13 ++++
 .../Variables/Base Types/IntVariable.cs       | 21 +++++++
 .../Variables/Base Types/IntVariable.cs.meta  | 13 ++++
 .../Base Types/ScriptableVariable.cs          | 60 +++++++++++++++++++
 .../Base Types/ScriptableVariable.cs.meta     | 13 ++++
 .../Variables/Base Types/StringVariable.cs    | 21 +++++++
 .../Base Types/StringVariable.cs.meta         | 13 ++++
 .../Variables/Reference Types.meta            | 10 ++++
 .../Variables/Reference Types/Editor.meta     | 10 ++++
 .../ReferenceBooleanVariableInspector.cs      |  9 +++
 .../ReferenceBooleanVariableInspector.cs.meta | 13 ++++
 .../Editor/ReferenceFloatVariableInspector.cs |  9 +++
 .../ReferenceFloatVariableInspector.cs.meta   | 13 ++++
 .../Editor/ReferenceIntVariableInspector.cs   |  9 +++
 .../ReferenceIntVariableInspector.cs.meta     | 13 ++++
 .../ReferenceScriptableVariableInspector.cs   | 58 ++++++++++++++++++
 ...ferenceScriptableVariableInspector.cs.meta | 13 ++++
 .../ReferenceStringVariableInspector.cs       |  9 +++
 .../ReferenceStringVariableInspector.cs.meta  | 13 ++++
 .../ReferenceBooleanVariable.cs               |  8 +++
 .../ReferenceBooleanVariable.cs.meta          | 13 ++++
 .../Reference Types/ReferenceFloatVariable.cs |  8 +++
 .../ReferenceFloatVariable.cs.meta            | 13 ++++
 .../Reference Types/ReferenceIntVariable.cs   |  8 +++
 .../ReferenceIntVariable.cs.meta              | 13 ++++
 .../ReferenceScriptableVariable.cs            | 17 ++++++
 .../ReferenceScriptableVariable.cs.meta       | 13 ++++
 .../ReferenceStringVariable.cs                |  8 +++
 .../ReferenceStringVariable.cs.meta           | 13 ++++
 84 files changed, 1359 insertions(+), 2 deletions(-)
 delete mode 100644 README.md
 create mode 100644 Scriptable Variables.meta
 create mode 100644 Scriptable Variables/AutomaticResettableResetter.cs
 create mode 100644 Scriptable Variables/AutomaticResettableResetter.cs.meta
 create mode 100644 Scriptable Variables/Events.meta
 create mode 100644 Scriptable Variables/Events/BooleanGameEvent.cs
 create mode 100644 Scriptable Variables/Events/BooleanGameEvent.cs.meta
 create mode 100644 Scriptable Variables/Events/Editor.meta
 create mode 100644 Scriptable Variables/Events/Editor/BooleanGameEventEditor.cs
 create mode 100644 Scriptable Variables/Events/Editor/BooleanGameEventEditor.cs.meta
 create mode 100644 Scriptable Variables/Events/Editor/FloatGameEventEditor.cs
 create mode 100644 Scriptable Variables/Events/Editor/FloatGameEventEditor.cs.meta
 create mode 100644 Scriptable Variables/Events/Editor/GameEventEditor.cs
 create mode 100644 Scriptable Variables/Events/Editor/GameEventEditor.cs.meta
 create mode 100644 Scriptable Variables/Events/Editor/IntGameEventEditor.cs
 create mode 100644 Scriptable Variables/Events/Editor/IntGameEventEditor.cs.meta
 create mode 100644 Scriptable Variables/Events/Editor/StringGameEventEditor.cs
 create mode 100644 Scriptable Variables/Events/Editor/StringGameEventEditor.cs.meta
 create mode 100644 Scriptable Variables/Events/FloatGameEvent.cs
 create mode 100644 Scriptable Variables/Events/FloatGameEvent.cs.meta
 create mode 100644 Scriptable Variables/Events/GameEvent.cs
 create mode 100644 Scriptable Variables/Events/GameEvent.cs.meta
 create mode 100644 Scriptable Variables/Events/IntGameEvent.cs
 create mode 100644 Scriptable Variables/Events/IntGameEvent.cs.meta
 create mode 100644 Scriptable Variables/Events/StringGameEvent.cs
 create mode 100644 Scriptable Variables/Events/StringGameEvent.cs.meta
 create mode 100644 Scriptable Variables/Interfaces.meta
 create mode 100644 Scriptable Variables/Interfaces/Resettable.cs
 create mode 100644 Scriptable Variables/Interfaces/Resettable.cs.meta
 create mode 100644 Scriptable Variables/Listeners.meta
 create mode 100644 Scriptable Variables/Listeners/BooleanGameEventListener.cs
 create mode 100644 Scriptable Variables/Listeners/BooleanGameEventListener.cs.meta
 create mode 100644 Scriptable Variables/Listeners/BooleanVariableListener.cs
 create mode 100644 Scriptable Variables/Listeners/BooleanVariableListener.cs.meta
 create mode 100644 Scriptable Variables/Listeners/FloatGameEventListener.cs
 create mode 100644 Scriptable Variables/Listeners/FloatGameEventListener.cs.meta
 create mode 100644 Scriptable Variables/Listeners/FloatVariableListener.cs
 create mode 100644 Scriptable Variables/Listeners/FloatVariableListener.cs.meta
 create mode 100644 Scriptable Variables/Listeners/GameEventListener.cs
 create mode 100644 Scriptable Variables/Listeners/GameEventListener.cs.meta
 create mode 100644 Scriptable Variables/Listeners/IntGameEventListener.cs
 create mode 100644 Scriptable Variables/Listeners/IntGameEventListener.cs.meta
 create mode 100644 Scriptable Variables/Listeners/IntVariableListener.cs
 create mode 100644 Scriptable Variables/Listeners/IntVariableListener.cs.meta
 create mode 100644 Scriptable Variables/Listeners/ScriptableVariableListener.cs
 create mode 100644 Scriptable Variables/Listeners/ScriptableVariableListener.cs.meta
 create mode 100644 Scriptable Variables/Listeners/StringGameEventListener.cs
 create mode 100644 Scriptable Variables/Listeners/StringGameEventListener.cs.meta
 create mode 100644 Scriptable Variables/Listeners/StringVariableListener.cs
 create mode 100644 Scriptable Variables/Listeners/StringVariableListener.cs.meta
 create mode 100644 Scriptable Variables/Variables.meta
 create mode 100644 Scriptable Variables/Variables/Base Types.meta
 create mode 100644 Scriptable Variables/Variables/Base Types/BooleanVariable.cs
 create mode 100644 Scriptable Variables/Variables/Base Types/BooleanVariable.cs.meta
 create mode 100644 Scriptable Variables/Variables/Base Types/FloatVariable.cs
 create mode 100644 Scriptable Variables/Variables/Base Types/FloatVariable.cs.meta
 create mode 100644 Scriptable Variables/Variables/Base Types/IntVariable.cs
 create mode 100644 Scriptable Variables/Variables/Base Types/IntVariable.cs.meta
 create mode 100644 Scriptable Variables/Variables/Base Types/ScriptableVariable.cs
 create mode 100644 Scriptable Variables/Variables/Base Types/ScriptableVariable.cs.meta
 create mode 100644 Scriptable Variables/Variables/Base Types/StringVariable.cs
 create mode 100644 Scriptable Variables/Variables/Base Types/StringVariable.cs.meta
 create mode 100644 Scriptable Variables/Variables/Reference Types.meta
 create mode 100644 Scriptable Variables/Variables/Reference Types/Editor.meta
 create mode 100644 Scriptable Variables/Variables/Reference Types/Editor/ReferenceBooleanVariableInspector.cs
 create mode 100644 Scriptable Variables/Variables/Reference Types/Editor/ReferenceBooleanVariableInspector.cs.meta
 create mode 100644 Scriptable Variables/Variables/Reference Types/Editor/ReferenceFloatVariableInspector.cs
 create mode 100644 Scriptable Variables/Variables/Reference Types/Editor/ReferenceFloatVariableInspector.cs.meta
 create mode 100644 Scriptable Variables/Variables/Reference Types/Editor/ReferenceIntVariableInspector.cs
 create mode 100644 Scriptable Variables/Variables/Reference Types/Editor/ReferenceIntVariableInspector.cs.meta
 create mode 100644 Scriptable Variables/Variables/Reference Types/Editor/ReferenceScriptableVariableInspector.cs
 create mode 100644 Scriptable Variables/Variables/Reference Types/Editor/ReferenceScriptableVariableInspector.cs.meta
 create mode 100644 Scriptable Variables/Variables/Reference Types/Editor/ReferenceStringVariableInspector.cs
 create mode 100644 Scriptable Variables/Variables/Reference Types/Editor/ReferenceStringVariableInspector.cs.meta
 create mode 100644 Scriptable Variables/Variables/Reference Types/ReferenceBooleanVariable.cs
 create mode 100644 Scriptable Variables/Variables/Reference Types/ReferenceBooleanVariable.cs.meta
 create mode 100644 Scriptable Variables/Variables/Reference Types/ReferenceFloatVariable.cs
 create mode 100644 Scriptable Variables/Variables/Reference Types/ReferenceFloatVariable.cs.meta
 create mode 100644 Scriptable Variables/Variables/Reference Types/ReferenceIntVariable.cs
 create mode 100644 Scriptable Variables/Variables/Reference Types/ReferenceIntVariable.cs.meta
 create mode 100644 Scriptable Variables/Variables/Reference Types/ReferenceScriptableVariable.cs
 create mode 100644 Scriptable Variables/Variables/Reference Types/ReferenceScriptableVariable.cs.meta
 create mode 100644 Scriptable Variables/Variables/Reference Types/ReferenceStringVariable.cs
 create mode 100644 Scriptable Variables/Variables/Reference Types/ReferenceStringVariable.cs.meta

diff --git a/README.md b/README.md
deleted file mode 100644
index 0b7169f..0000000
--- 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 0000000..29e3754
--- /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 0000000..df295e8
--- /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 0000000..6ab671a
--- /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 0000000..e664f16
--- /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 0000000..799ab75
--- /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 0000000..d8d2f80
--- /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 0000000..eb02ced
--- /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 0000000..86c1cac
--- /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 0000000..100b199
--- /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 0000000..864e318
--- /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 0000000..5fc14d7
--- /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 0000000..de7a6a2
--- /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 0000000..8ab1d72
--- /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 0000000..3046342
--- /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 0000000..a00d18b
--- /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 0000000..1e94c71
--- /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 0000000..c64881b
--- /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 0000000..f46f495
--- /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 0000000..b8bd367
--- /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 0000000..a47dcaf
--- /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 0000000..a576a24
--- /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 0000000..fea804c
--- /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 0000000..4bcf7f3
--- /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 0000000..178b585
--- /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 0000000..0adce0b
--- /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 0000000..c4c2626
--- /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 0000000..e18337e
--- /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 0000000..20f309c
--- /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 0000000..1635af8
--- /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 0000000..36a63c5
--- /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 0000000..596e2e5
--- /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 0000000..87dc5ac
--- /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 0000000..809d0c7
--- /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 0000000..c98ee59
--- /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 0000000..88310ca
--- /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 0000000..bc8afc8
--- /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 0000000..da7a849
--- /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 0000000..1c3e7e8
--- /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 0000000..46d0888
--- /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 0000000..c6da58d
--- /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 0000000..9936bda
--- /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 0000000..dcaf622
--- /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 0000000..d2a2682
--- /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 0000000..d977e3b
--- /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 0000000..845702b
--- /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 0000000..9a86b2d
--- /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 0000000..f2e324a
--- /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 0000000..416b67f
--- /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 0000000..24a12ab
--- /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 0000000..1064394
--- /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 0000000..d5cf984
--- /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 0000000..ebb3a8d
--- /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 0000000..9da389d
--- /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 0000000..5defc9f
--- /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 0000000..2658199
--- /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 0000000..cf13273
--- /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 0000000..2d7d6a5
--- /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 0000000..59162d2
--- /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 0000000..8800472
--- /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 0000000..3d959db
--- /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 0000000..17e4c6c
--- /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 0000000..068fe28
--- /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 0000000..a0dc2b4
--- /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 0000000..60dbfd6
--- /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 0000000..726f8b4
--- /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 0000000..0264c9a
--- /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 0000000..966aff8
--- /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 0000000..d9f9e9e
--- /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 0000000..49bb566
--- /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 0000000..94c531a
--- /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 0000000..0da9b0c
--- /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 0000000..03ff023
--- /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 0000000..0f083e6
--- /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 0000000..e0151fb
--- /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 0000000..13f24f4
--- /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 0000000..67076e6
--- /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 0000000..a77b408
--- /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 0000000..7d91d8d
--- /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 0000000..8ba3344
--- /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 0000000..a8761b0
--- /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 0000000..f14f4ec
--- /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 0000000..6d53f41
--- /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 0000000..74ffa66
--- /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: 
-- 
GitLab