diff --git a/Sane Eric's UI/Scriptable Variables/Vector2VariableInput.cs b/Sane Eric's UI/Scriptable Variables/Vector2VariableInput.cs
new file mode 100644
index 0000000000000000000000000000000000000000..a3b3df477afffd6343cd1087a1c11e00ec0fd18f
--- /dev/null
+++ b/Sane Eric's UI/Scriptable Variables/Vector2VariableInput.cs	
@@ -0,0 +1,82 @@
+using System;
+using UnityEngine;
+using UnityEngine.Events;
+using TMPro;
+using Shared.ScriptableVariables;
+
+namespace Shared.SEUI {
+  // UI Editor for a Vector2Variable
+  // Depends on ScriptableVariable package
+  public class Vector2VariableInput : ScriptableVariableInput<Vector2> {
+    [Tooltip("The variable we are editing")]
+    public Vector2Variable variable;
+
+    [Tooltip("The input UI to edit the variable's x value with")]
+    public TMP_InputField xInput;
+
+    [Tooltip("The input UI to edit the variable's y value with")]
+    public TMP_InputField yInput;
+
+    // Temporary callbackx to bridge value changes in the UI and the variable
+    private UnityAction<string> xValueConverter;
+    private UnityAction<string> yValueConverter;
+
+    //---------------------------------------------------------------------------
+    void Start() {
+      // Make sure the input handles the right content type
+      xInput.contentType = TMP_InputField.ContentType.DecimalNumber;
+      yInput.contentType = TMP_InputField.ContentType.DecimalNumber;
+    }
+
+    //---------------------------------------------------------------------------
+    protected override void AddUIListener(UnityAction<Vector2> callback) {
+      // Define the value converting bridge callback to add to the UI listener
+      xValueConverter = delegate(string value) {
+        callback(new Vector2(StringToFloat(value), variable.Value.y));
+      };
+      yValueConverter = delegate(string value) {
+        callback(new Vector2(variable.Value.x, StringToFloat(value)));
+      };
+
+      xInput.onValueChanged.AddListener(xValueConverter);
+      yInput.onValueChanged.AddListener(yValueConverter);
+    }
+
+    //---------------------------------------------------------------------------
+    protected override void RemoveUIListener(UnityAction<Vector2> callback) {
+      if (xValueConverter != null) {
+        xInput.onValueChanged.RemoveListener(xValueConverter);
+        xValueConverter = null;
+      }
+      if (yValueConverter != null) {
+        yInput.onValueChanged.RemoveListener(yValueConverter);
+        yValueConverter = null;
+      }
+    }
+
+    //---------------------------------------------------------------------------
+    protected override bool DoValuesMatch() {
+      return !String.IsNullOrEmpty(xInput.text) && Convert.ToSingle(xInput.text) == variable.Value.x &&
+        !String.IsNullOrEmpty(yInput.text) && Convert.ToSingle(yInput.text) == variable.Value.y;
+    }
+
+    //---------------------------------------------------------------------------
+    protected override void UpdateUIValue() {
+      xInput.SetTextWithoutNotify(variable.Value.x.ToString());
+      yInput.SetTextWithoutNotify(variable.Value.y.ToString());
+    }
+
+    //---------------------------------------------------------------------------
+    protected override void UpdateVariableValue(Vector2 value) {
+      variable.Value = value;
+    }
+
+    //---------------------------------------------------------------------------
+    private float StringToFloat(string value) {
+      if (!String.IsNullOrEmpty(xInput.text)) {
+        return Convert.ToSingle(value);
+      }
+      return 0.0f;
+    }
+  }
+}
diff --git a/Sane Eric's UI/Scriptable Variables/Vector2VariableInput.cs.meta b/Sane Eric's UI/Scriptable Variables/Vector2VariableInput.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..99a989e5ab9112eadc582700e35303033decf1a8
--- /dev/null
+++ b/Sane Eric's UI/Scriptable Variables/Vector2VariableInput.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 62a6de5a919aefe42bd6f5ac8c5eb4bd
+timeCreated: 1510784910
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Sane Eric's UI/Scriptable Variables/Vector2VariableLabel.cs b/Sane Eric's UI/Scriptable Variables/Vector2VariableLabel.cs
new file mode 100644
index 0000000000000000000000000000000000000000..14ba647b2d5f98705c1dd02f53ae1f1bc397d3a6
--- /dev/null
+++ b/Sane Eric's UI/Scriptable Variables/Vector2VariableLabel.cs	
@@ -0,0 +1,21 @@
+using UnityEngine;
+using Shared.ScriptableVariables;
+
+namespace Shared.SEUI {
+  // Read only UI for a Vector2Variable
+  // Depends on ScriptableVariable package
+  public class Vector2VariableLabel : ScriptableVariableLabel<Vector2> {
+    [Tooltip("The variable whose value we are displaying")]
+    public Vector2Variable value;
+
+    //---------------------------------------------------------------------------
+    protected override string GetName() {
+      return value.name;
+    }
+
+    //---------------------------------------------------------------------------
+    protected override Vector2 GetValue() {
+      return value.Value;
+    }
+  }
+}
diff --git a/Sane Eric's UI/Scriptable Variables/Vector2VariableLabel.cs.meta b/Sane Eric's UI/Scriptable Variables/Vector2VariableLabel.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..0a8abb9a30900a7ff2bf916411f3b45b44208863
--- /dev/null
+++ b/Sane Eric's UI/Scriptable Variables/Vector2VariableLabel.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 19ff1aa3c5bfbae4189e9d7e9cdb8fbe
+timeCreated: 1510784910
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Sane Eric's UI/Scriptable Variables/Vector3VariableInput.cs b/Sane Eric's UI/Scriptable Variables/Vector3VariableInput.cs
new file mode 100644
index 0000000000000000000000000000000000000000..44fc3bc6a1fb794f42fa9bb63db5bb468a95b9c8
--- /dev/null
+++ b/Sane Eric's UI/Scriptable Variables/Vector3VariableInput.cs	
@@ -0,0 +1,97 @@
+using System;
+using UnityEngine;
+using UnityEngine.Events;
+using TMPro;
+using Shared.ScriptableVariables;
+
+namespace Shared.SEUI {
+  // UI Editor for a Vector3Variable
+  // Depends on ScriptableVariable package
+  public class Vector3VariableInput : ScriptableVariableInput<Vector3> {
+    [Tooltip("The variable we are editing")]
+    public Vector3Variable variable;
+
+    [Tooltip("The input UI to edit the variable's x value with")]
+    public TMP_InputField xInput;
+
+    [Tooltip("The input UI to edit the variable's y value with")]
+    public TMP_InputField yInput;
+
+    [Tooltip("The input UI to edit the variable's z value with")]
+    public TMP_InputField zInput;
+
+    // Temporary callbackx to bridge value changes in the UI and the variable
+    private UnityAction<string> xValueConverter;
+    private UnityAction<string> yValueConverter;
+    private UnityAction<string> zValueConverter;
+
+    //---------------------------------------------------------------------------
+    void Start() {
+      // Make sure the input handles the right content type
+      xInput.contentType = TMP_InputField.ContentType.DecimalNumber;
+      yInput.contentType = TMP_InputField.ContentType.DecimalNumber;
+      zInput.contentType = TMP_InputField.ContentType.DecimalNumber;
+    }
+
+    //---------------------------------------------------------------------------
+    protected override void AddUIListener(UnityAction<Vector3> callback) {
+      // Define the value converting bridge callback to add to the UI listener
+      xValueConverter = delegate(string value) {
+        callback(new Vector3(StringToFloat(value), variable.Value.y, variable.Value.z));
+      };
+      yValueConverter = delegate(string value) {
+        callback(new Vector3(variable.Value.x, StringToFloat(value), variable.Value.z));
+      };
+      zValueConverter = delegate(string value) {
+        callback(new Vector3(variable.Value.x, variable.Value.y, StringToFloat(value)));
+      };
+
+      xInput.onValueChanged.AddListener(xValueConverter);
+      yInput.onValueChanged.AddListener(yValueConverter);
+      zInput.onValueChanged.AddListener(zValueConverter);
+    }
+
+    //---------------------------------------------------------------------------
+    protected override void RemoveUIListener(UnityAction<Vector3> callback) {
+      if (xValueConverter != null) {
+        xInput.onValueChanged.RemoveListener(xValueConverter);
+        xValueConverter = null;
+      }
+      if (yValueConverter != null) {
+        yInput.onValueChanged.RemoveListener(yValueConverter);
+        yValueConverter = null;
+      }
+      if (zValueConverter != null) {
+        zInput.onValueChanged.RemoveListener(zValueConverter);
+        zValueConverter = null;
+      }
+    }
+
+    //---------------------------------------------------------------------------
+    protected override bool DoValuesMatch() {
+      return !String.IsNullOrEmpty(xInput.text) && Convert.ToSingle(xInput.text) == variable.Value.x &&
+        !String.IsNullOrEmpty(yInput.text) && Convert.ToSingle(yInput.text) == variable.Value.y &&
+        !String.IsNullOrEmpty(zInput.text) && Convert.ToSingle(zInput.text) == variable.Value.z;
+    }
+
+    //---------------------------------------------------------------------------
+    protected override void UpdateUIValue() {
+      xInput.SetTextWithoutNotify(variable.Value.x.ToString());
+      yInput.SetTextWithoutNotify(variable.Value.y.ToString());
+      zInput.SetTextWithoutNotify(variable.Value.z.ToString());
+    }
+
+    //---------------------------------------------------------------------------
+    protected override void UpdateVariableValue(Vector3 value) {
+      variable.Value = value;
+    }
+
+    //---------------------------------------------------------------------------
+    private float StringToFloat(string value) {
+      if (!String.IsNullOrEmpty(xInput.text)) {
+        return Convert.ToSingle(value);
+      }
+      return 0.0f;
+    }
+  }
+}
diff --git a/Sane Eric's UI/Scriptable Variables/Vector3VariableInput.cs.meta b/Sane Eric's UI/Scriptable Variables/Vector3VariableInput.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..1c919a7f6a4a0fba6d552ff125d833c8803b5148
--- /dev/null
+++ b/Sane Eric's UI/Scriptable Variables/Vector3VariableInput.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: c051b053eaff99d4a94087f69d61e3ed
+timeCreated: 1510784910
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Sane Eric's UI/Scriptable Variables/Vector3VariableLabel.cs b/Sane Eric's UI/Scriptable Variables/Vector3VariableLabel.cs
new file mode 100644
index 0000000000000000000000000000000000000000..24cabbd44d719eb1a93121cfd54998419419842f
--- /dev/null
+++ b/Sane Eric's UI/Scriptable Variables/Vector3VariableLabel.cs	
@@ -0,0 +1,21 @@
+using UnityEngine;
+using Shared.ScriptableVariables;
+
+namespace Shared.SEUI {
+  // Read only UI for a Vector3Variable
+  // Depends on ScriptableVariable package
+  public class Vector3VariableLabel : ScriptableVariableLabel<Vector3> {
+    [Tooltip("The variable whose value we are displaying")]
+    public Vector3Variable value;
+
+    //---------------------------------------------------------------------------
+    protected override string GetName() {
+      return value.name;
+    }
+
+    //---------------------------------------------------------------------------
+    protected override Vector3 GetValue() {
+      return value.Value;
+    }
+  }
+}
diff --git a/Sane Eric's UI/Scriptable Variables/Vector3VariableLabel.cs.meta b/Sane Eric's UI/Scriptable Variables/Vector3VariableLabel.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..829bd1ee611967ec40e126b4a146a56aec1a0368
--- /dev/null
+++ b/Sane Eric's UI/Scriptable Variables/Vector3VariableLabel.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 6b90857e4d335c248877cef27d2847a0
+timeCreated: 1510784910
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Sane Eric's UI/Scriptable Variables/Vector4VariableInput.cs b/Sane Eric's UI/Scriptable Variables/Vector4VariableInput.cs
new file mode 100644
index 0000000000000000000000000000000000000000..9a96d37f9d7c60a43ef4a1a4d270db8f310b0fb7
--- /dev/null
+++ b/Sane Eric's UI/Scriptable Variables/Vector4VariableInput.cs	
@@ -0,0 +1,112 @@
+using System;
+using UnityEngine;
+using UnityEngine.Events;
+using TMPro;
+using Shared.ScriptableVariables;
+
+namespace Shared.SEUI {
+  // UI Editor for a Vector4Variable
+  // Depends on ScriptableVariable package
+  public class Vector4VariableInput : ScriptableVariableInput<Vector4> {
+    [Tooltip("The variable we are editing")]
+    public Vector4Variable variable;
+
+    [Tooltip("The input UI to edit the variable's x value with")]
+    public TMP_InputField xInput;
+
+    [Tooltip("The input UI to edit the variable's y value with")]
+    public TMP_InputField yInput;
+
+    [Tooltip("The input UI to edit the variable's z value with")]
+    public TMP_InputField zInput;
+
+    [Tooltip("The input UI to edit the variable's w value with")]
+    public TMP_InputField wInput;
+
+    // Temporary callbackx to bridge value changes in the UI and the variable
+    private UnityAction<string> xValueConverter;
+    private UnityAction<string> yValueConverter;
+    private UnityAction<string> zValueConverter;
+    private UnityAction<string> wValueConverter;
+
+    //---------------------------------------------------------------------------
+    void Start() {
+      // Make sure the input handles the right content type
+      xInput.contentType = TMP_InputField.ContentType.DecimalNumber;
+      yInput.contentType = TMP_InputField.ContentType.DecimalNumber;
+      zInput.contentType = TMP_InputField.ContentType.DecimalNumber;
+      wInput.contentType = TMP_InputField.ContentType.DecimalNumber;
+    }
+
+    //---------------------------------------------------------------------------
+    protected override void AddUIListener(UnityAction<Vector4> callback) {
+      // Define the value converting bridge callback to add to the UI listener
+      xValueConverter = delegate(string value) {
+        callback(new Vector4(StringToFloat(value), variable.Value.y, variable.Value.z, variable.Value.w));
+      };
+      yValueConverter = delegate(string value) {
+        callback(new Vector4(variable.Value.x, StringToFloat(value), variable.Value.z, variable.Value.w));
+      };
+      zValueConverter = delegate(string value) {
+        callback(new Vector4(variable.Value.x, variable.Value.y, StringToFloat(value), variable.Value.w));
+      };
+      wValueConverter = delegate(string value) {
+        callback(new Vector4(variable.Value.x, variable.Value.y, variable.Value.z, StringToFloat(value)));
+      };
+
+      xInput.onValueChanged.AddListener(xValueConverter);
+      yInput.onValueChanged.AddListener(yValueConverter);
+      yInput.onValueChanged.AddListener(zValueConverter);
+      yInput.onValueChanged.AddListener(wValueConverter);
+    }
+
+    //---------------------------------------------------------------------------
+    protected override void RemoveUIListener(UnityAction<Vector4> callback) {
+      if (xValueConverter != null) {
+        xInput.onValueChanged.RemoveListener(xValueConverter);
+        xValueConverter = null;
+      }
+      if (yValueConverter != null) {
+        yInput.onValueChanged.RemoveListener(yValueConverter);
+        yValueConverter = null;
+      }
+      if (zValueConverter != null) {
+        zInput.onValueChanged.RemoveListener(zValueConverter);
+        zValueConverter = null;
+      }
+      if (wValueConverter != null) {
+        wInput.onValueChanged.RemoveListener(wValueConverter);
+        wValueConverter = null;
+      }
+    }
+
+    //---------------------------------------------------------------------------
+    protected override bool DoValuesMatch() {
+      return !String.IsNullOrEmpty(xInput.text) && Convert.ToSingle(xInput.text) == variable.Value.x &&
+        !String.IsNullOrEmpty(yInput.text) && Convert.ToSingle(yInput.text) == variable.Value.y &&
+        !String.IsNullOrEmpty(zInput.text) && Convert.ToSingle(zInput.text) == variable.Value.z &&
+        !String.IsNullOrEmpty(wInput.text) && Convert.ToSingle(wInput.text) == variable.Value.w;
+    }
+
+    //---------------------------------------------------------------------------
+    protected override void UpdateUIValue() {
+      xInput.SetTextWithoutNotify(variable.Value.x.ToString());
+      yInput.SetTextWithoutNotify(variable.Value.y.ToString());
+      zInput.SetTextWithoutNotify(variable.Value.z.ToString());
+      wInput.SetTextWithoutNotify(variable.Value.w.ToString());
+    }
+
+    //---------------------------------------------------------------------------
+    protected override void UpdateVariableValue(Vector4 value) {
+      variable.Value = value;
+    }
+
+    //---------------------------------------------------------------------------
+    private float StringToFloat(string value) {
+      if (!String.IsNullOrEmpty(xInput.text)) {
+        return Convert.ToSingle(value);
+      }
+      return 0.0f;
+    }
+  }
+}
diff --git a/Sane Eric's UI/Scriptable Variables/Vector4VariableInput.cs.meta b/Sane Eric's UI/Scriptable Variables/Vector4VariableInput.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..04fb89898c97226fd78b3929836f56781b77fffc
--- /dev/null
+++ b/Sane Eric's UI/Scriptable Variables/Vector4VariableInput.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 5cfc33bad7311744585edb4617313baf
+timeCreated: 1510784910
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Sane Eric's UI/Scriptable Variables/Vector4VariableLabel.cs b/Sane Eric's UI/Scriptable Variables/Vector4VariableLabel.cs
new file mode 100644
index 0000000000000000000000000000000000000000..c17bed68a1670140837c9c110b67c8202c7d2299
--- /dev/null
+++ b/Sane Eric's UI/Scriptable Variables/Vector4VariableLabel.cs	
@@ -0,0 +1,21 @@
+using UnityEngine;
+using Shared.ScriptableVariables;
+
+namespace Shared.SEUI {
+  // Read only UI for a Vector4Variable
+  // Depends on ScriptableVariable package
+  public class Vector4VariableLabel : ScriptableVariableLabel<Vector4> {
+    [Tooltip("The variable whose value we are displaying")]
+    public Vector4Variable value;
+
+    //---------------------------------------------------------------------------
+    protected override string GetName() {
+      return value.name;
+    }
+
+    //---------------------------------------------------------------------------
+    protected override Vector4 GetValue() {
+      return value.Value;
+    }
+  }
+}
diff --git a/Sane Eric's UI/Scriptable Variables/Vector4VariableLabel.cs.meta b/Sane Eric's UI/Scriptable Variables/Vector4VariableLabel.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..4873c49365d952c6c79b9135ae76983c8f5dfc2f
--- /dev/null
+++ b/Sane Eric's UI/Scriptable Variables/Vector4VariableLabel.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 35dd2766ae2da1d48aeaf81da26d347a
+timeCreated: 1510784910
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Conditionals/Vector2VariableComparison.cs b/Scriptable Variables/Conditionals/Vector2VariableComparison.cs
new file mode 100644
index 0000000000000000000000000000000000000000..c292d68424bddcde64a51fb67fc38ba8f8f6100f
--- /dev/null
+++ b/Scriptable Variables/Conditionals/Vector2VariableComparison.cs	
@@ -0,0 +1,48 @@
+using UnityEngine;
+using UnityEngine.Events;
+
+namespace Shared.ScriptableVariables {
+  // Component to tie Unity's event system to variable values based on conditions
+  public class Vector2VariableComparison : MonoBehaviour {
+    [Tooltip("The variable we are watching value changes to compare against something else")]
+    public Vector2Variable variable;
+
+    [Tooltip("Scriptable Variable to compare, if null then comparison value will be used to compare")]
+    public Vector2Variable comparisonVariable;
+
+    [Tooltip("Hardcoded value to compare against variable if comparisonVariable isn't set")]
+    public Vector2 comparisonValue;
+
+    [Tooltip("Fires if variable changes and its value is equal to the comparison amount")]
+    public UnityEvent onEqual;
+
+    [Tooltip("Fires if variable changes and its value is not equal to the comparison amount")]
+    public UnityEvent onNotEqual;
+
+    [Tooltip("Fires true or false if the values are equal whenever variable's value changes")]
+    public BooleanUnityEvent onValueChanged;
+
+    // --------------------------------------------------------------------------
+    void OnEnable() {
+      variable.OnValueChanged += OnValueChanged;
+      OnValueChanged();
+    }
+
+    // --------------------------------------------------------------------------
+    void OnDisable() {
+      variable.OnValueChanged -= OnValueChanged;
+    }
+
+    // --------------------------------------------------------------------------
+    private void OnValueChanged() {
+      var equal = variable.Value == (comparisonVariable != null ? comparisonVariable.Value : comparisonValue);
+      if (equal) {
+        onEqual?.Invoke();
+      }
+      else {
+        onNotEqual?.Invoke();
+      }
+      onValueChanged?.Invoke(equal);
+    }
+  }
+}
diff --git a/Scriptable Variables/Conditionals/Vector2VariableComparison.cs.meta b/Scriptable Variables/Conditionals/Vector2VariableComparison.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..6c356588b3e83294263731e01db5ce89173c0b23
--- /dev/null
+++ b/Scriptable Variables/Conditionals/Vector2VariableComparison.cs.meta	
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 8b8faad62b642b2428528c3a916c6328
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Conditionals/Vector3VariableComparison.cs b/Scriptable Variables/Conditionals/Vector3VariableComparison.cs
new file mode 100644
index 0000000000000000000000000000000000000000..dc81fcffd11a74368845b3355f0bb23e33f388ae
--- /dev/null
+++ b/Scriptable Variables/Conditionals/Vector3VariableComparison.cs	
@@ -0,0 +1,48 @@
+using UnityEngine;
+using UnityEngine.Events;
+
+namespace Shared.ScriptableVariables {
+  // Component to tie Unity's event system to variable values based on conditions
+  public class Vector3VariableComparison : MonoBehaviour {
+    [Tooltip("The variable we are watching value changes to compare against something else")]
+    public Vector3Variable variable;
+
+    [Tooltip("Scriptable Variable to compare, if null then comparison value will be used to compare")]
+    public Vector3Variable comparisonVariable;
+
+    [Tooltip("Hardcoded value to compare against variable if comparisonVariable isn't set")]
+    public Vector3 comparisonValue;
+
+    [Tooltip("Fires if variable changes and its value is equal to the comparison amount")]
+    public UnityEvent onEqual;
+
+    [Tooltip("Fires if variable changes and its value is not equal to the comparison amount")]
+    public UnityEvent onNotEqual;
+
+    [Tooltip("Fires true or false if the values are equal whenever variable's value changes")]
+    public BooleanUnityEvent onValueChanged;
+
+    // --------------------------------------------------------------------------
+    void OnEnable() {
+      variable.OnValueChanged += OnValueChanged;
+      OnValueChanged();
+    }
+
+    // --------------------------------------------------------------------------
+    void OnDisable() {
+      variable.OnValueChanged -= OnValueChanged;
+    }
+
+    // --------------------------------------------------------------------------
+    private void OnValueChanged() {
+      var equal = variable.Value == (comparisonVariable != null ? comparisonVariable.Value : comparisonValue);
+      if (equal) {
+        onEqual?.Invoke();
+      }
+      else {
+        onNotEqual?.Invoke();
+      }
+      onValueChanged?.Invoke(equal);
+    }
+  }
+}
diff --git a/Scriptable Variables/Conditionals/Vector3VariableComparison.cs.meta b/Scriptable Variables/Conditionals/Vector3VariableComparison.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..3390f6280e1dc6ccaa3f3a945f9560299c19b33a
--- /dev/null
+++ b/Scriptable Variables/Conditionals/Vector3VariableComparison.cs.meta	
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: c44be721b807a4e438f7bf132387bb5c
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Conditionals/Vector4VariableComparison.cs b/Scriptable Variables/Conditionals/Vector4VariableComparison.cs
new file mode 100644
index 0000000000000000000000000000000000000000..ab3965a96acbc897bbaf6e6aae0641a6f43d003a
--- /dev/null
+++ b/Scriptable Variables/Conditionals/Vector4VariableComparison.cs	
@@ -0,0 +1,48 @@
+using UnityEngine;
+using UnityEngine.Events;
+
+namespace Shared.ScriptableVariables {
+  // Component to tie Unity's event system to variable values based on conditions
+  public class Vector4VariableComparison : MonoBehaviour {
+    [Tooltip("The variable we are watching value changes to compare against something else")]
+    public Vector4Variable variable;
+
+    [Tooltip("Scriptable Variable to compare, if null then comparison value will be used to compare")]
+    public Vector4Variable comparisonVariable;
+
+    [Tooltip("Hardcoded value to compare against variable if comparisonVariable isn't set")]
+    public Vector4 comparisonValue;
+
+    [Tooltip("Fires if variable changes and its value is equal to the comparison amount")]
+    public UnityEvent onEqual;
+
+    [Tooltip("Fires if variable changes and its value is not equal to the comparison amount")]
+    public UnityEvent onNotEqual;
+
+    [Tooltip("Fires true or false if the values are equal whenever variable's value changes")]
+    public BooleanUnityEvent onValueChanged;
+
+    // --------------------------------------------------------------------------
+    void OnEnable() {
+      variable.OnValueChanged += OnValueChanged;
+      OnValueChanged();
+    }
+
+    // --------------------------------------------------------------------------
+    void OnDisable() {
+      variable.OnValueChanged -= OnValueChanged;
+    }
+
+    // --------------------------------------------------------------------------
+    private void OnValueChanged() {
+      var equal = variable.Value == (comparisonVariable != null ? comparisonVariable.Value : comparisonValue);
+      if (equal) {
+        onEqual?.Invoke();
+      }
+      else {
+        onNotEqual?.Invoke();
+      }
+      onValueChanged?.Invoke(equal);
+    }
+  }
+}
diff --git a/Scriptable Variables/Conditionals/Vector4VariableComparison.cs.meta b/Scriptable Variables/Conditionals/Vector4VariableComparison.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..70705d2f9fcdd9fb753eed4deac0824541dd2ce5
--- /dev/null
+++ b/Scriptable Variables/Conditionals/Vector4VariableComparison.cs.meta	
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 69f20c2bd66f017499dc99f0948e14e3
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Events/Editor/Vector2GameEventEditor.cs b/Scriptable Variables/Events/Editor/Vector2GameEventEditor.cs
new file mode 100644
index 0000000000000000000000000000000000000000..d7df31d3c23ef5f32f639b8ae4b5178a16cbc154
--- /dev/null
+++ b/Scriptable Variables/Events/Editor/Vector2GameEventEditor.cs	
@@ -0,0 +1,22 @@
+using UnityEditor;
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  //---------------------------------------------------------------------------
+  [CustomEditor(typeof(Vector2GameEvent))]
+  public class Vector2GameEventEditor : Editor {
+    private Vector2 testValue;
+
+    //---------------------------------------------------------------------------
+    public override void OnInspectorGUI() {
+      base.OnInspectorGUI();
+
+      EditorGUILayout.BeginHorizontal();
+      testValue = EditorGUILayout.Vector2Field("Test Value", testValue);
+      if (GUILayout.Button("Fire Event")) {
+        ((Vector2GameEvent)target).Raise(testValue);
+      }
+      EditorGUILayout.EndHorizontal();
+    }
+  }
+}
diff --git a/Scriptable Variables/Events/Editor/Vector2GameEventEditor.cs.meta b/Scriptable Variables/Events/Editor/Vector2GameEventEditor.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..620ce9cd359bc803970619110b51c2f23aed6958
--- /dev/null
+++ b/Scriptable Variables/Events/Editor/Vector2GameEventEditor.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 31c51078b2c87fc46ae2939707c50efc
+timeCreated: 1513206436
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Events/Editor/Vector3GameEventEditor.cs b/Scriptable Variables/Events/Editor/Vector3GameEventEditor.cs
new file mode 100644
index 0000000000000000000000000000000000000000..09d699863afdbea51d2375d26282822a5d242e3e
--- /dev/null
+++ b/Scriptable Variables/Events/Editor/Vector3GameEventEditor.cs	
@@ -0,0 +1,22 @@
+using UnityEditor;
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  //---------------------------------------------------------------------------
+  [CustomEditor(typeof(Vector3GameEvent))]
+  public class Vector3GameEventEditor : Editor {
+    private Vector3 testValue;
+
+    //---------------------------------------------------------------------------
+    public override void OnInspectorGUI() {
+      base.OnInspectorGUI();
+
+      EditorGUILayout.BeginHorizontal();
+      testValue = EditorGUILayout.Vector3Field("Test Value", testValue);
+      if (GUILayout.Button("Fire Event")) {
+        ((Vector3GameEvent)target).Raise(testValue);
+      }
+      EditorGUILayout.EndHorizontal();
+    }
+  }
+}
diff --git a/Scriptable Variables/Events/Editor/Vector3GameEventEditor.cs.meta b/Scriptable Variables/Events/Editor/Vector3GameEventEditor.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..4e373f8b4371a2dc90aef896f5e054486fd0333d
--- /dev/null
+++ b/Scriptable Variables/Events/Editor/Vector3GameEventEditor.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 9c45777e68a6d034c8f46124e39775c8
+timeCreated: 1513206436
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Events/Editor/Vector4GameEventEditor.cs b/Scriptable Variables/Events/Editor/Vector4GameEventEditor.cs
new file mode 100644
index 0000000000000000000000000000000000000000..5beb0f229a7ef302d745a0d7f6d6fc3a958d2b38
--- /dev/null
+++ b/Scriptable Variables/Events/Editor/Vector4GameEventEditor.cs	
@@ -0,0 +1,22 @@
+using UnityEditor;
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  //---------------------------------------------------------------------------
+  [CustomEditor(typeof(Vector4GameEvent))]
+  public class Vector4GameEventEditor : Editor {
+    private Vector4 testValue;
+
+    //---------------------------------------------------------------------------
+    public override void OnInspectorGUI() {
+      base.OnInspectorGUI();
+
+      EditorGUILayout.BeginHorizontal();
+      testValue = EditorGUILayout.Vector4Field("Test Value", testValue);
+      if (GUILayout.Button("Fire Event")) {
+        ((Vector4GameEvent)target).Raise(testValue);
+      }
+      EditorGUILayout.EndHorizontal();
+    }
+  }
+}
diff --git a/Scriptable Variables/Events/Editor/Vector4GameEventEditor.cs.meta b/Scriptable Variables/Events/Editor/Vector4GameEventEditor.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..3b30ac45df4ac1bc02ffc0534b2710e9a52df311
--- /dev/null
+++ b/Scriptable Variables/Events/Editor/Vector4GameEventEditor.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 83588b537590a804fa9a02cb32f1aa1c
+timeCreated: 1513206436
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Events/Vector2GameEvent.cs b/Scriptable Variables/Events/Vector2GameEvent.cs
new file mode 100644
index 0000000000000000000000000000000000000000..6814b96c3cf8b89ce12a4f7321b36d2d4c6432e7
--- /dev/null
+++ b/Scriptable Variables/Events/Vector2GameEvent.cs	
@@ -0,0 +1,8 @@
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  // ScriptableVariable that decouples components firing and listening to game events that require a Vector2 parameter
+  [CreateAssetMenu(menuName = "Scriptable Objects/Events/Vector2 Game Event")]
+  public class Vector2GameEvent : GameEvent<Vector2> {
+  }
+}
diff --git a/Scriptable Variables/Events/Vector2GameEvent.cs.meta b/Scriptable Variables/Events/Vector2GameEvent.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..c81fdccc5c6658d548f84916e7dc47c30b274116
--- /dev/null
+++ b/Scriptable Variables/Events/Vector2GameEvent.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 199a9e36449139548be39a6aba952bdd
+timeCreated: 1510599448
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Events/Vector2UnityEvent.cs b/Scriptable Variables/Events/Vector2UnityEvent.cs
new file mode 100644
index 0000000000000000000000000000000000000000..9a92b412f29849c6e15889d42bfc61367bf09895
--- /dev/null
+++ b/Scriptable Variables/Events/Vector2UnityEvent.cs	
@@ -0,0 +1,7 @@
+using UnityEngine;
+using UnityEngine.Events;
+
+namespace Shared.ScriptableVariables {
+  [System.Serializable]
+  public class Vector2UnityEvent : UnityEvent<Vector2> {}
+}
diff --git a/Scriptable Variables/Events/Vector2UnityEvent.cs.meta b/Scriptable Variables/Events/Vector2UnityEvent.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..8f53e3b6dcbbe36c314793ee173ee05ca2ccd4fc
--- /dev/null
+++ b/Scriptable Variables/Events/Vector2UnityEvent.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 8631c5c574b586744a72bb3cb2e6d895
+timeCreated: 1510599448
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Events/Vector3GameEvent.cs b/Scriptable Variables/Events/Vector3GameEvent.cs
new file mode 100644
index 0000000000000000000000000000000000000000..c6cfbc7a3cec659e2b9e060a49776e967937d3fd
--- /dev/null
+++ b/Scriptable Variables/Events/Vector3GameEvent.cs	
@@ -0,0 +1,8 @@
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  // ScriptableVariable that decouples components firing and listening to game events that require a Vector3 parameter
+  [CreateAssetMenu(menuName = "Scriptable Objects/Events/Vector3 Game Event")]
+  public class Vector3GameEvent : GameEvent<Vector3> {
+  }
+}
diff --git a/Scriptable Variables/Events/Vector3GameEvent.cs.meta b/Scriptable Variables/Events/Vector3GameEvent.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..b4a220c2e3f1c86565d6549d4557223664d66ab6
--- /dev/null
+++ b/Scriptable Variables/Events/Vector3GameEvent.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 702e747f33d46c44ca802bcbd47d8a67
+timeCreated: 1510599448
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Events/Vector3UnityEvent.cs b/Scriptable Variables/Events/Vector3UnityEvent.cs
new file mode 100644
index 0000000000000000000000000000000000000000..03da8a3e0546177fe7700ecca3e25df4ca6d1b07
--- /dev/null
+++ b/Scriptable Variables/Events/Vector3UnityEvent.cs	
@@ -0,0 +1,7 @@
+using UnityEngine;
+using UnityEngine.Events;
+
+namespace Shared.ScriptableVariables {
+  [System.Serializable]
+  public class Vector3UnityEvent : UnityEvent<Vector3> {}
+}
diff --git a/Scriptable Variables/Events/Vector3UnityEvent.cs.meta b/Scriptable Variables/Events/Vector3UnityEvent.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..ab041153d1b103ee7d3725ffd6d6a32097167bf3
--- /dev/null
+++ b/Scriptable Variables/Events/Vector3UnityEvent.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: f2031184b1866fd44b65ba7847d09f9e
+timeCreated: 1510599448
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Events/Vector4GameEvent.cs b/Scriptable Variables/Events/Vector4GameEvent.cs
new file mode 100644
index 0000000000000000000000000000000000000000..4b24de380c9011c9f05fb0c527efcc9f47610142
--- /dev/null
+++ b/Scriptable Variables/Events/Vector4GameEvent.cs	
@@ -0,0 +1,8 @@
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  // ScriptableVariable that decouples components firing and listening to game events that require a Vector4 parameter
+  [CreateAssetMenu(menuName = "Scriptable Objects/Events/Vector4 Game Event")]
+  public class Vector4GameEvent : GameEvent<Vector4> {
+  }
+}
diff --git a/Scriptable Variables/Events/Vector4GameEvent.cs.meta b/Scriptable Variables/Events/Vector4GameEvent.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..15ecedb0b0e8ded95ce4b045258c1f3f88d4a1ec
--- /dev/null
+++ b/Scriptable Variables/Events/Vector4GameEvent.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: b56a05dc9ce107549b23670cd0cac21c
+timeCreated: 1510599448
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Events/Vector4UnityEvent.cs b/Scriptable Variables/Events/Vector4UnityEvent.cs
new file mode 100644
index 0000000000000000000000000000000000000000..482637e789546a21c5397f3b484c69807164ad5c
--- /dev/null
+++ b/Scriptable Variables/Events/Vector4UnityEvent.cs	
@@ -0,0 +1,7 @@
+using UnityEngine;
+using UnityEngine.Events;
+
+namespace Shared.ScriptableVariables {
+  [System.Serializable]
+  public class Vector4UnityEvent : UnityEvent<Vector4> {}
+}
diff --git a/Scriptable Variables/Events/Vector4UnityEvent.cs.meta b/Scriptable Variables/Events/Vector4UnityEvent.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..0e2112dc07254cb8d5695d959e88fed74c40ccb3
--- /dev/null
+++ b/Scriptable Variables/Events/Vector4UnityEvent.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 8e67a65cc275e80429b9f42d8315e26d
+timeCreated: 1510599448
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Listeners/Vector2GameEventListener.cs b/Scriptable Variables/Listeners/Vector2GameEventListener.cs
new file mode 100644
index 0000000000000000000000000000000000000000..6642f1bdac6fc8928c318e377f2c877f9dbf4b13
--- /dev/null
+++ b/Scriptable Variables/Listeners/Vector2GameEventListener.cs	
@@ -0,0 +1,19 @@
+using UnityEngine;
+using UnityEngine.Events;
+
+namespace Shared.ScriptableVariables {
+  // Component to tie Vector2GameEvents to Unity's event system
+  public class Vector2GameEventListener : GameEventListener<Vector2> {
+    [Tooltip("The game event to listen to")]
+    public Vector2GameEvent eventToListenTo;
+
+    [Tooltip("The UnityEvent to raise in response to the game event being raised")]
+    public Vector2UnityEvent response;
+
+    //---------------------------------------------------------------------------
+    protected override GameEvent<Vector2> GetGameEvent() { return eventToListenTo; }
+
+    //---------------------------------------------------------------------------
+    protected override UnityEvent<Vector2> GetUnityEvent() { return response; }
+  }
+}
diff --git a/Scriptable Variables/Listeners/Vector2GameEventListener.cs.meta b/Scriptable Variables/Listeners/Vector2GameEventListener.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..26e3fe70ba4f6ac2c4cefdfe022288b29fafe2ff
--- /dev/null
+++ b/Scriptable Variables/Listeners/Vector2GameEventListener.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: bdf1be86524e4644eb3deda08e7e2f6b
+timeCreated: 1510599448
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Listeners/Vector2VariableListener.cs b/Scriptable Variables/Listeners/Vector2VariableListener.cs
new file mode 100644
index 0000000000000000000000000000000000000000..03b83ba09706d1980e6f64bddb1f107e0c7ad6f4
--- /dev/null
+++ b/Scriptable Variables/Listeners/Vector2VariableListener.cs	
@@ -0,0 +1,21 @@
+using UnityEngine;
+using UnityEngine.Events;
+
+namespace Shared.ScriptableVariables {
+  /// <summary>
+  /// Used to trigger a UnityEvent in response to changes on a Vector2Variable
+  /// </summary>
+  public class Vector2VariableListener : ScriptableVariableListener<Vector2> {
+    [Tooltip("The ScriptableVariable to listen for changes")]
+    public Vector2Variable variable;
+
+    [Tooltip("The UnityEvent that gets triggered when the variable changes value")]
+    public Vector2UnityEvent OnValueChangedEvent;
+
+    //---------------------------------------------------------------------------
+    protected override ScriptableVariable<Vector2> GetScriptableVariable() { return variable; }
+
+    //---------------------------------------------------------------------------
+    protected override UnityEvent<Vector2> GetUnityEvent() { return OnValueChangedEvent; }
+  }
+}
diff --git a/Scriptable Variables/Listeners/Vector2VariableListener.cs.meta b/Scriptable Variables/Listeners/Vector2VariableListener.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..f7cff427fdb2310ece2e89df8b69a267e382bfa2
--- /dev/null
+++ b/Scriptable Variables/Listeners/Vector2VariableListener.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: c23eebf64ae491247b42c9e8681ae7e3
+timeCreated: 1513208270
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Listeners/Vector3GameEventListener.cs b/Scriptable Variables/Listeners/Vector3GameEventListener.cs
new file mode 100644
index 0000000000000000000000000000000000000000..32fd7779884f7607a102a55435c8900e6cc7ac1f
--- /dev/null
+++ b/Scriptable Variables/Listeners/Vector3GameEventListener.cs	
@@ -0,0 +1,19 @@
+using UnityEngine;
+using UnityEngine.Events;
+
+namespace Shared.ScriptableVariables {
+  // Component to tie Vector3GameEvents to Unity's event system
+  public class Vector3GameEventListener : GameEventListener<Vector3> {
+    [Tooltip("The game event to listen to")]
+    public Vector3GameEvent eventToListenTo;
+
+    [Tooltip("The UnityEvent to raise in response to the game event being raised")]
+    public Vector3UnityEvent response;
+
+    //---------------------------------------------------------------------------
+    protected override GameEvent<Vector3> GetGameEvent() { return eventToListenTo; }
+
+    //---------------------------------------------------------------------------
+    protected override UnityEvent<Vector3> GetUnityEvent() { return response; }
+  }
+}
diff --git a/Scriptable Variables/Listeners/Vector3GameEventListener.cs.meta b/Scriptable Variables/Listeners/Vector3GameEventListener.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..135551ae556f98cd7116a0bd7be3da0ef7d26c7d
--- /dev/null
+++ b/Scriptable Variables/Listeners/Vector3GameEventListener.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 5ec009a88dcb5144697ce093c13e3d83
+timeCreated: 1510599448
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Listeners/Vector3VariableListener.cs b/Scriptable Variables/Listeners/Vector3VariableListener.cs
new file mode 100644
index 0000000000000000000000000000000000000000..403601047c7934a084e620b7411675924e98953a
--- /dev/null
+++ b/Scriptable Variables/Listeners/Vector3VariableListener.cs	
@@ -0,0 +1,21 @@
+using UnityEngine;
+using UnityEngine.Events;
+
+namespace Shared.ScriptableVariables {
+  /// <summary>
+  /// Used to trigger a UnityEvent in response to changes on a Vector3Variable
+  /// </summary>
+  public class Vector3VariableListener : ScriptableVariableListener<Vector3> {
+    [Tooltip("The ScriptableVariable to listen for changes")]
+    public Vector3Variable variable;
+
+    [Tooltip("The UnityEvent that gets triggered when the variable changes value")]
+    public Vector3UnityEvent OnValueChangedEvent;
+
+    //---------------------------------------------------------------------------
+    protected override ScriptableVariable<Vector3> GetScriptableVariable() { return variable; }
+
+    //---------------------------------------------------------------------------
+    protected override UnityEvent<Vector3> GetUnityEvent() { return OnValueChangedEvent; }
+  }
+}
diff --git a/Scriptable Variables/Listeners/Vector3VariableListener.cs.meta b/Scriptable Variables/Listeners/Vector3VariableListener.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..db51de4543b36b36cd4a731821e32884542bcb60
--- /dev/null
+++ b/Scriptable Variables/Listeners/Vector3VariableListener.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: d5af93d9ba9b41e4ab55b5abe12edb2c
+timeCreated: 1513208270
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Listeners/Vector4GameEventListener.cs b/Scriptable Variables/Listeners/Vector4GameEventListener.cs
new file mode 100644
index 0000000000000000000000000000000000000000..3b4d60b771f03652ef362e49a7a0903456bdc671
--- /dev/null
+++ b/Scriptable Variables/Listeners/Vector4GameEventListener.cs	
@@ -0,0 +1,19 @@
+using UnityEngine;
+using UnityEngine.Events;
+
+namespace Shared.ScriptableVariables {
+  // Component to tie Vector4GameEvents to Unity's event system
+  public class Vector4GameEventListener : GameEventListener<Vector4> {
+    [Tooltip("The game event to listen to")]
+    public Vector4GameEvent eventToListenTo;
+
+    [Tooltip("The UnityEvent to raise in response to the game event being raised")]
+    public Vector4UnityEvent response;
+
+    //---------------------------------------------------------------------------
+    protected override GameEvent<Vector4> GetGameEvent() { return eventToListenTo; }
+
+    //---------------------------------------------------------------------------
+    protected override UnityEvent<Vector4> GetUnityEvent() { return response; }
+  }
+}
diff --git a/Scriptable Variables/Listeners/Vector4GameEventListener.cs.meta b/Scriptable Variables/Listeners/Vector4GameEventListener.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..0e7e3401d492da6abe7b6d2870f46c3369e55fed
--- /dev/null
+++ b/Scriptable Variables/Listeners/Vector4GameEventListener.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 8ca17874c6c50a147986d2d5ab155d5d
+timeCreated: 1510599448
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Listeners/Vector4VariableListener.cs b/Scriptable Variables/Listeners/Vector4VariableListener.cs
new file mode 100644
index 0000000000000000000000000000000000000000..5c2814e12b37847e39b85c2125c47a1d4ff99748
--- /dev/null
+++ b/Scriptable Variables/Listeners/Vector4VariableListener.cs	
@@ -0,0 +1,21 @@
+using UnityEngine;
+using UnityEngine.Events;
+
+namespace Shared.ScriptableVariables {
+  /// <summary>
+  /// Used to trigger a UnityEvent in response to changes on a Vector4Variable
+  /// </summary>
+  public class Vector4VariableListener : ScriptableVariableListener<Vector4> {
+    [Tooltip("The ScriptableVariable to listen for changes")]
+    public Vector4Variable variable;
+
+    [Tooltip("The UnityEvent that gets triggered when the variable changes value")]
+    public Vector4UnityEvent OnValueChangedEvent;
+
+    //---------------------------------------------------------------------------
+    protected override ScriptableVariable<Vector4> GetScriptableVariable() { return variable; }
+
+    //---------------------------------------------------------------------------
+    protected override UnityEvent<Vector4> GetUnityEvent() { return OnValueChangedEvent; }
+  }
+}
diff --git a/Scriptable Variables/Listeners/Vector4VariableListener.cs.meta b/Scriptable Variables/Listeners/Vector4VariableListener.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..6c94184340e2fe43fde254c4419971d504e6d5de
--- /dev/null
+++ b/Scriptable Variables/Listeners/Vector4VariableListener.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: c4d5d5145e1deb945bb5b29e2b332e48
+timeCreated: 1513208270
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Scriptable Variables/Variables/Base Types/Vector2Variable.cs b/Scriptable Variables/Variables/Base Types/Vector2Variable.cs
new file mode 100644
index 0000000000000000000000000000000000000000..604f328344909ed45f37ef8e2a6a4b1931496f4f
--- /dev/null
+++ b/Scriptable Variables/Variables/Base Types/Vector2Variable.cs	
@@ -0,0 +1,21 @@
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  // A Vector2 value to share across components, scenes, and prefabs
+  [CreateAssetMenu(menuName = "Scriptable Objects/Variables/Vector2")]
+  public class Vector2Variable : ScriptableVariable<Vector2> {
+    //---------------------------------------------------------------------------
+    [ContextMenu("Reset To Default Value")]
+    public void ContextMenuReset() {
+      Reset();
+    }
+  }
+
+#if UNITY_EDITOR
+  //-----------------------------------------------------------------------------
+  [UnityEditor.CustomEditor(typeof(Vector2Variable))]
+  [UnityEditor.CanEditMultipleObjects]
+  public class Vector2ScriptableVariableEditor : Vector2Variable.BaseScriptableVariableEditor {
+  }
+#endif
+}
diff --git a/Scriptable Variables/Variables/Base Types/Vector2Variable.cs.meta b/Scriptable Variables/Variables/Base Types/Vector2Variable.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..b86a8be1d27aa96f33c517309b5e391da2b6320e
--- /dev/null
+++ b/Scriptable Variables/Variables/Base Types/Vector2Variable.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: ae328bc50f421254396a03e58e8b0638
+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/Vector3Variable.cs b/Scriptable Variables/Variables/Base Types/Vector3Variable.cs
new file mode 100644
index 0000000000000000000000000000000000000000..03a653b4219457c0ff73bbf12579ec755c29fb48
--- /dev/null
+++ b/Scriptable Variables/Variables/Base Types/Vector3Variable.cs	
@@ -0,0 +1,21 @@
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  // A Vector3 value to share across components, scenes, and prefabs
+  [CreateAssetMenu(menuName = "Scriptable Objects/Variables/Vector3")]
+  public class Vector3Variable : ScriptableVariable<Vector3> {
+    //---------------------------------------------------------------------------
+    [ContextMenu("Reset To Default Value")]
+    public void ContextMenuReset() {
+      Reset();
+    }
+  }
+
+#if UNITY_EDITOR
+  //-----------------------------------------------------------------------------
+  [UnityEditor.CustomEditor(typeof(Vector3Variable))]
+  [UnityEditor.CanEditMultipleObjects]
+  public class Vector3ScriptableVariableEditor : Vector3Variable.BaseScriptableVariableEditor {
+  }
+#endif
+}
diff --git a/Scriptable Variables/Variables/Base Types/Vector3Variable.cs.meta b/Scriptable Variables/Variables/Base Types/Vector3Variable.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..2dea28b4fb121e2ddfffb10673b60f957d04806c
--- /dev/null
+++ b/Scriptable Variables/Variables/Base Types/Vector3Variable.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: e9c61337ff4dbe8469dc49c3886561ec
+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/Vector4Variable.cs b/Scriptable Variables/Variables/Base Types/Vector4Variable.cs
new file mode 100644
index 0000000000000000000000000000000000000000..446a8e0db75c34fdf7603fa9ee9513ec5b8f8f8b
--- /dev/null
+++ b/Scriptable Variables/Variables/Base Types/Vector4Variable.cs	
@@ -0,0 +1,21 @@
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  // A Vector4 value to share across components, scenes, and prefabs
+  [CreateAssetMenu(menuName = "Scriptable Objects/Variables/Vector4")]
+  public class Vector4Variable : ScriptableVariable<Vector4> {
+    //---------------------------------------------------------------------------
+    [ContextMenu("Reset To Default Value")]
+    public void ContextMenuReset() {
+      Reset();
+    }
+  }
+
+#if UNITY_EDITOR
+  //-----------------------------------------------------------------------------
+  [UnityEditor.CustomEditor(typeof(Vector4Variable))]
+  [UnityEditor.CanEditMultipleObjects]
+  public class Vector4ScriptableVariableEditor : Vector4Variable.BaseScriptableVariableEditor {
+  }
+#endif
+}
diff --git a/Scriptable Variables/Variables/Base Types/Vector4Variable.cs.meta b/Scriptable Variables/Variables/Base Types/Vector4Variable.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..daeaa87a5a8af24d07e59345629af5a3f871c670
--- /dev/null
+++ b/Scriptable Variables/Variables/Base Types/Vector4Variable.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 1fe0e4fa8a8022442a1d26ad60b9a2bb
+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/Editor/ReferenceVector2VariableInspector.cs b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceVector2VariableInspector.cs
new file mode 100644
index 0000000000000000000000000000000000000000..8b259decddb7f28a2991ebd4c6837ff0bd59c160
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceVector2VariableInspector.cs	
@@ -0,0 +1,9 @@
+using UnityEditor;
+
+namespace Shared.ScriptableVariables {
+  // A custom Inspector Editor for ReferenceVector2Variables
+  [CustomEditor(typeof(ReferenceVector2Variable))]
+  [CanEditMultipleObjects]
+  public class ReferenceVector2VariableInspector : ReferenceScriptableVariableInspector {
+  }
+}
diff --git a/Scriptable Variables/Variables/Reference Types/Editor/ReferenceVector2VariableInspector.cs.meta b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceVector2VariableInspector.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..ae679c060d279d51eac185050dd56172e801c457
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceVector2VariableInspector.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 200dc1216ca52e948b1697340f3744e6
+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/ReferenceVector3VariableInspector.cs b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceVector3VariableInspector.cs
new file mode 100644
index 0000000000000000000000000000000000000000..f4c957a4feca45a6d9cb560b5090019670f70e40
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceVector3VariableInspector.cs	
@@ -0,0 +1,9 @@
+using UnityEditor;
+
+namespace Shared.ScriptableVariables {
+  // A custom Inspector Editor for ReferenceVector3Variables
+  [CustomEditor(typeof(ReferenceVector3Variable))]
+  [CanEditMultipleObjects]
+  public class ReferenceVector3VariableInspector : ReferenceScriptableVariableInspector {
+  }
+}
diff --git a/Scriptable Variables/Variables/Reference Types/Editor/ReferenceVector3VariableInspector.cs.meta b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceVector3VariableInspector.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..995458f409c06337e66cfb0b7ebe4b9adbdc8ad3
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceVector3VariableInspector.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 199e2653d66c1164185b434bc83f2818
+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/ReferenceVector4VariableInspector.cs b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceVector4VariableInspector.cs
new file mode 100644
index 0000000000000000000000000000000000000000..1f04a6c4a6682b9329bd5a1f6ebbb09f0e75f0b8
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceVector4VariableInspector.cs	
@@ -0,0 +1,9 @@
+using UnityEditor;
+
+namespace Shared.ScriptableVariables {
+  // A custom Inspector Editor for ReferenceVector4Variables
+  [CustomEditor(typeof(ReferenceVector4Variable))]
+  [CanEditMultipleObjects]
+  public class ReferenceVector4VariableInspector : ReferenceScriptableVariableInspector {
+  }
+}
diff --git a/Scriptable Variables/Variables/Reference Types/Editor/ReferenceVector4VariableInspector.cs.meta b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceVector4VariableInspector.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..a6e9251717d9d0c8673dc796cf884b441d66cf0e
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/Editor/ReferenceVector4VariableInspector.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: d99bdf84ff7e0c24e89e982049f18891
+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/ReferenceVector2Variable.cs b/Scriptable Variables/Variables/Reference Types/ReferenceVector2Variable.cs
new file mode 100644
index 0000000000000000000000000000000000000000..af87d13ddbdf5991ea5050ed2354a02301e43b5c
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/ReferenceVector2Variable.cs	
@@ -0,0 +1,8 @@
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  // A reference to a Vector2 value to share across components, scenes, and prefabs that can be overridden to a constant different value
+  [CreateAssetMenu(menuName = "Scriptable Objects/Variables/Reference/Vector2")]
+  public class ReferenceVector2Variable : ReferenceScriptableVariable<Vector2Variable, Vector2> {
+  }
+}
diff --git a/Scriptable Variables/Variables/Reference Types/ReferenceVector2Variable.cs.meta b/Scriptable Variables/Variables/Reference Types/ReferenceVector2Variable.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..0e6500248148996a1ed51e8bd764e58e303a4d24
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/ReferenceVector2Variable.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 6023d86a1b7c7e249abe7940152bd48b
+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/ReferenceVector3Variable.cs b/Scriptable Variables/Variables/Reference Types/ReferenceVector3Variable.cs
new file mode 100644
index 0000000000000000000000000000000000000000..6c846ef580fb58dceedcafec7119cdb3c2b61a6f
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/ReferenceVector3Variable.cs	
@@ -0,0 +1,8 @@
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  // A reference to a Vector3 value to share across components, scenes, and prefabs that can be overridden to a constant different value
+  [CreateAssetMenu(menuName = "Scriptable Objects/Variables/Reference/Vector3")]
+  public class ReferenceVector3Variable : ReferenceScriptableVariable<Vector3Variable, Vector3> {
+  }
+}
diff --git a/Scriptable Variables/Variables/Reference Types/ReferenceVector3Variable.cs.meta b/Scriptable Variables/Variables/Reference Types/ReferenceVector3Variable.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..12a34d7d18a06cef6174b1237b124b1eb6f230a1
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/ReferenceVector3Variable.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 2dc931012aa15ab47b6e1512d0e4bbca
+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/ReferenceVector4Variable.cs b/Scriptable Variables/Variables/Reference Types/ReferenceVector4Variable.cs
new file mode 100644
index 0000000000000000000000000000000000000000..6d20dbd6de31f661f37649acb5293521522d8b33
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/ReferenceVector4Variable.cs	
@@ -0,0 +1,8 @@
+using UnityEngine;
+
+namespace Shared.ScriptableVariables {
+  // A reference to a Vector4 value to share across components, scenes, and prefabs that can be overridden to a constant different value
+  [CreateAssetMenu(menuName = "Scriptable Objects/Variables/Reference/Vector4")]
+  public class ReferenceVector4Variable : ReferenceScriptableVariable<Vector4Variable, Vector4> {
+  }
+}
diff --git a/Scriptable Variables/Variables/Reference Types/ReferenceVector4Variable.cs.meta b/Scriptable Variables/Variables/Reference Types/ReferenceVector4Variable.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..530a45d763f2cc198496434fc79ce308fc4e679a
--- /dev/null
+++ b/Scriptable Variables/Variables/Reference Types/ReferenceVector4Variable.cs.meta	
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: a8be70176b441a647b33d4a57fcfe471
+timeCreated: 1510599427
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: