From fb6eceabfb8a35e20b1434611577c89ce5019134 Mon Sep 17 00:00:00 2001
From: erheine <erheine@nps.edu>
Date: Fri, 6 Mar 2020 15:23:40 -0800
Subject: [PATCH] Added UI, variables, events, and listeners for Vector2, 3,
 and 4 values.

---
 .../Vector2VariableInput.cs                   |  82 +++++++++++++
 .../Vector2VariableInput.cs.meta              |  13 ++
 .../Vector2VariableLabel.cs                   |  21 ++++
 .../Vector2VariableLabel.cs.meta              |  13 ++
 .../Vector3VariableInput.cs                   |  97 +++++++++++++++
 .../Vector3VariableInput.cs.meta              |  13 ++
 .../Vector3VariableLabel.cs                   |  21 ++++
 .../Vector3VariableLabel.cs.meta              |  13 ++
 .../Vector4VariableInput.cs                   | 112 ++++++++++++++++++
 .../Vector4VariableInput.cs.meta              |  13 ++
 .../Vector4VariableLabel.cs                   |  21 ++++
 .../Vector4VariableLabel.cs.meta              |  13 ++
 .../Conditionals/Vector2VariableComparison.cs |  48 ++++++++
 .../Vector2VariableComparison.cs.meta         |  11 ++
 .../Conditionals/Vector3VariableComparison.cs |  48 ++++++++
 .../Vector3VariableComparison.cs.meta         |  11 ++
 .../Conditionals/Vector4VariableComparison.cs |  48 ++++++++
 .../Vector4VariableComparison.cs.meta         |  11 ++
 .../Events/Editor/Vector2GameEventEditor.cs   |  22 ++++
 .../Editor/Vector2GameEventEditor.cs.meta     |  13 ++
 .../Events/Editor/Vector3GameEventEditor.cs   |  22 ++++
 .../Editor/Vector3GameEventEditor.cs.meta     |  13 ++
 .../Events/Editor/Vector4GameEventEditor.cs   |  22 ++++
 .../Editor/Vector4GameEventEditor.cs.meta     |  13 ++
 .../Events/Vector2GameEvent.cs                |   8 ++
 .../Events/Vector2GameEvent.cs.meta           |  13 ++
 .../Events/Vector2UnityEvent.cs               |   7 ++
 .../Events/Vector2UnityEvent.cs.meta          |  13 ++
 .../Events/Vector3GameEvent.cs                |   8 ++
 .../Events/Vector3GameEvent.cs.meta           |  13 ++
 .../Events/Vector3UnityEvent.cs               |   7 ++
 .../Events/Vector3UnityEvent.cs.meta          |  13 ++
 .../Events/Vector4GameEvent.cs                |   8 ++
 .../Events/Vector4GameEvent.cs.meta           |  13 ++
 .../Events/Vector4UnityEvent.cs               |   7 ++
 .../Events/Vector4UnityEvent.cs.meta          |  13 ++
 .../Listeners/Vector2GameEventListener.cs     |  19 +++
 .../Vector2GameEventListener.cs.meta          |  13 ++
 .../Listeners/Vector2VariableListener.cs      |  21 ++++
 .../Listeners/Vector2VariableListener.cs.meta |  13 ++
 .../Listeners/Vector3GameEventListener.cs     |  19 +++
 .../Vector3GameEventListener.cs.meta          |  13 ++
 .../Listeners/Vector3VariableListener.cs      |  21 ++++
 .../Listeners/Vector3VariableListener.cs.meta |  13 ++
 .../Listeners/Vector4GameEventListener.cs     |  19 +++
 .../Vector4GameEventListener.cs.meta          |  13 ++
 .../Listeners/Vector4VariableListener.cs      |  21 ++++
 .../Listeners/Vector4VariableListener.cs.meta |  13 ++
 .../Variables/Base Types/Vector2Variable.cs   |  21 ++++
 .../Base Types/Vector2Variable.cs.meta        |  13 ++
 .../Variables/Base Types/Vector3Variable.cs   |  21 ++++
 .../Base Types/Vector3Variable.cs.meta        |  13 ++
 .../Variables/Base Types/Vector4Variable.cs   |  21 ++++
 .../Base Types/Vector4Variable.cs.meta        |  13 ++
 .../ReferenceVector2VariableInspector.cs      |   9 ++
 .../ReferenceVector2VariableInspector.cs.meta |  13 ++
 .../ReferenceVector3VariableInspector.cs      |   9 ++
 .../ReferenceVector3VariableInspector.cs.meta |  13 ++
 .../ReferenceVector4VariableInspector.cs      |   9 ++
 .../ReferenceVector4VariableInspector.cs.meta |  13 ++
 .../ReferenceVector2Variable.cs               |   8 ++
 .../ReferenceVector2Variable.cs.meta          |  13 ++
 .../ReferenceVector3Variable.cs               |   8 ++
 .../ReferenceVector3Variable.cs.meta          |  13 ++
 .../ReferenceVector4Variable.cs               |   8 ++
 .../ReferenceVector4Variable.cs.meta          |  13 ++
 66 files changed, 1266 insertions(+)
 create mode 100644 Sane Eric's UI/Scriptable Variables/Vector2VariableInput.cs
 create mode 100644 Sane Eric's UI/Scriptable Variables/Vector2VariableInput.cs.meta
 create mode 100644 Sane Eric's UI/Scriptable Variables/Vector2VariableLabel.cs
 create mode 100644 Sane Eric's UI/Scriptable Variables/Vector2VariableLabel.cs.meta
 create mode 100644 Sane Eric's UI/Scriptable Variables/Vector3VariableInput.cs
 create mode 100644 Sane Eric's UI/Scriptable Variables/Vector3VariableInput.cs.meta
 create mode 100644 Sane Eric's UI/Scriptable Variables/Vector3VariableLabel.cs
 create mode 100644 Sane Eric's UI/Scriptable Variables/Vector3VariableLabel.cs.meta
 create mode 100644 Sane Eric's UI/Scriptable Variables/Vector4VariableInput.cs
 create mode 100644 Sane Eric's UI/Scriptable Variables/Vector4VariableInput.cs.meta
 create mode 100644 Sane Eric's UI/Scriptable Variables/Vector4VariableLabel.cs
 create mode 100644 Sane Eric's UI/Scriptable Variables/Vector4VariableLabel.cs.meta
 create mode 100644 Scriptable Variables/Conditionals/Vector2VariableComparison.cs
 create mode 100644 Scriptable Variables/Conditionals/Vector2VariableComparison.cs.meta
 create mode 100644 Scriptable Variables/Conditionals/Vector3VariableComparison.cs
 create mode 100644 Scriptable Variables/Conditionals/Vector3VariableComparison.cs.meta
 create mode 100644 Scriptable Variables/Conditionals/Vector4VariableComparison.cs
 create mode 100644 Scriptable Variables/Conditionals/Vector4VariableComparison.cs.meta
 create mode 100644 Scriptable Variables/Events/Editor/Vector2GameEventEditor.cs
 create mode 100644 Scriptable Variables/Events/Editor/Vector2GameEventEditor.cs.meta
 create mode 100644 Scriptable Variables/Events/Editor/Vector3GameEventEditor.cs
 create mode 100644 Scriptable Variables/Events/Editor/Vector3GameEventEditor.cs.meta
 create mode 100644 Scriptable Variables/Events/Editor/Vector4GameEventEditor.cs
 create mode 100644 Scriptable Variables/Events/Editor/Vector4GameEventEditor.cs.meta
 create mode 100644 Scriptable Variables/Events/Vector2GameEvent.cs
 create mode 100644 Scriptable Variables/Events/Vector2GameEvent.cs.meta
 create mode 100644 Scriptable Variables/Events/Vector2UnityEvent.cs
 create mode 100644 Scriptable Variables/Events/Vector2UnityEvent.cs.meta
 create mode 100644 Scriptable Variables/Events/Vector3GameEvent.cs
 create mode 100644 Scriptable Variables/Events/Vector3GameEvent.cs.meta
 create mode 100644 Scriptable Variables/Events/Vector3UnityEvent.cs
 create mode 100644 Scriptable Variables/Events/Vector3UnityEvent.cs.meta
 create mode 100644 Scriptable Variables/Events/Vector4GameEvent.cs
 create mode 100644 Scriptable Variables/Events/Vector4GameEvent.cs.meta
 create mode 100644 Scriptable Variables/Events/Vector4UnityEvent.cs
 create mode 100644 Scriptable Variables/Events/Vector4UnityEvent.cs.meta
 create mode 100644 Scriptable Variables/Listeners/Vector2GameEventListener.cs
 create mode 100644 Scriptable Variables/Listeners/Vector2GameEventListener.cs.meta
 create mode 100644 Scriptable Variables/Listeners/Vector2VariableListener.cs
 create mode 100644 Scriptable Variables/Listeners/Vector2VariableListener.cs.meta
 create mode 100644 Scriptable Variables/Listeners/Vector3GameEventListener.cs
 create mode 100644 Scriptable Variables/Listeners/Vector3GameEventListener.cs.meta
 create mode 100644 Scriptable Variables/Listeners/Vector3VariableListener.cs
 create mode 100644 Scriptable Variables/Listeners/Vector3VariableListener.cs.meta
 create mode 100644 Scriptable Variables/Listeners/Vector4GameEventListener.cs
 create mode 100644 Scriptable Variables/Listeners/Vector4GameEventListener.cs.meta
 create mode 100644 Scriptable Variables/Listeners/Vector4VariableListener.cs
 create mode 100644 Scriptable Variables/Listeners/Vector4VariableListener.cs.meta
 create mode 100644 Scriptable Variables/Variables/Base Types/Vector2Variable.cs
 create mode 100644 Scriptable Variables/Variables/Base Types/Vector2Variable.cs.meta
 create mode 100644 Scriptable Variables/Variables/Base Types/Vector3Variable.cs
 create mode 100644 Scriptable Variables/Variables/Base Types/Vector3Variable.cs.meta
 create mode 100644 Scriptable Variables/Variables/Base Types/Vector4Variable.cs
 create mode 100644 Scriptable Variables/Variables/Base Types/Vector4Variable.cs.meta
 create mode 100644 Scriptable Variables/Variables/Reference Types/Editor/ReferenceVector2VariableInspector.cs
 create mode 100644 Scriptable Variables/Variables/Reference Types/Editor/ReferenceVector2VariableInspector.cs.meta
 create mode 100644 Scriptable Variables/Variables/Reference Types/Editor/ReferenceVector3VariableInspector.cs
 create mode 100644 Scriptable Variables/Variables/Reference Types/Editor/ReferenceVector3VariableInspector.cs.meta
 create mode 100644 Scriptable Variables/Variables/Reference Types/Editor/ReferenceVector4VariableInspector.cs
 create mode 100644 Scriptable Variables/Variables/Reference Types/Editor/ReferenceVector4VariableInspector.cs.meta
 create mode 100644 Scriptable Variables/Variables/Reference Types/ReferenceVector2Variable.cs
 create mode 100644 Scriptable Variables/Variables/Reference Types/ReferenceVector2Variable.cs.meta
 create mode 100644 Scriptable Variables/Variables/Reference Types/ReferenceVector3Variable.cs
 create mode 100644 Scriptable Variables/Variables/Reference Types/ReferenceVector3Variable.cs.meta
 create mode 100644 Scriptable Variables/Variables/Reference Types/ReferenceVector4Variable.cs
 create mode 100644 Scriptable Variables/Variables/Reference Types/ReferenceVector4Variable.cs.meta

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 0000000..a3b3df4
--- /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 0000000..99a989e
--- /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 0000000..14ba647
--- /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 0000000..0a8abb9
--- /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 0000000..44fc3bc
--- /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 0000000..1c919a7
--- /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 0000000..24cabbd
--- /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 0000000..829bd1e
--- /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 0000000..9a96d37
--- /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 0000000..04fb898
--- /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 0000000..c17bed6
--- /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 0000000..4873c49
--- /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 0000000..c292d68
--- /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 0000000..6c35658
--- /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 0000000..dc81fcf
--- /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 0000000..3390f62
--- /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 0000000..ab3965a
--- /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 0000000..70705d2
--- /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 0000000..d7df31d
--- /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 0000000..620ce9c
--- /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 0000000..09d6998
--- /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 0000000..4e373f8
--- /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 0000000..5beb0f2
--- /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 0000000..3b30ac4
--- /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 0000000..6814b96
--- /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 0000000..c81fdcc
--- /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 0000000..9a92b41
--- /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 0000000..8f53e3b
--- /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 0000000..c6cfbc7
--- /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 0000000..b4a220c
--- /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 0000000..03da8a3
--- /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 0000000..ab04115
--- /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 0000000..4b24de3
--- /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 0000000..15ecedb
--- /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 0000000..482637e
--- /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 0000000..0e2112d
--- /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 0000000..6642f1b
--- /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 0000000..26e3fe7
--- /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 0000000..03b83ba
--- /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 0000000..f7cff42
--- /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 0000000..32fd777
--- /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 0000000..135551a
--- /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 0000000..4036010
--- /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 0000000..db51de4
--- /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 0000000..3b4d60b
--- /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 0000000..0e7e340
--- /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 0000000..5c2814e
--- /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 0000000..6c94184
--- /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 0000000..604f328
--- /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 0000000..b86a8be
--- /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 0000000..03a653b
--- /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 0000000..2dea28b
--- /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 0000000..446a8e0
--- /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 0000000..daeaa87
--- /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 0000000..8b259de
--- /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 0000000..ae679c0
--- /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 0000000..f4c957a
--- /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 0000000..995458f
--- /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 0000000..1f04a6c
--- /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 0000000..a6e9251
--- /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 0000000..af87d13
--- /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 0000000..0e65002
--- /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 0000000..6c846ef
--- /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 0000000..12a34d7
--- /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 0000000..6d20dbd
--- /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 0000000..530a45d
--- /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: 
-- 
GitLab