diff --git a/LinearAlgebra/Spherical.cs b/LinearAlgebra/Spherical.cs
index 111a637..e9c2b5b 100644
--- a/LinearAlgebra/Spherical.cs
+++ b/LinearAlgebra/Spherical.cs
@@ -1,4 +1,4 @@
-using Vector3 = UnityEngine.Vector3;
+using UnityEngine;
 
 namespace Passer.LinearAlgebra {
     public class Spherical {
@@ -6,6 +6,7 @@ namespace Passer.LinearAlgebra {
         public Direction direction;
 
         public static Spherical zero = new(0, 0, 0);
+        public static Spherical forward = new(1, 0, 0);
 
         public Spherical(float distance, float horizontal, float vertical) {
             this.distance = distance;
@@ -16,6 +17,17 @@ namespace Passer.LinearAlgebra {
             this.direction = direction;
         }
 
+        public static Spherical FromVector3(Vector3 v) {
+            float distance = v.magnitude;
+            if (distance == 0.0f)
+                return new Spherical(distance, 0, 0);
+            else {
+                float verticalAngle = (Mathf.PI / 2 - Mathf.Acos(v.y / distance)) * Mathf.Rad2Deg;
+                float horizontalAngle = Mathf.Atan2(v.x, v.z) * Mathf.Rad2Deg;
+                return new Spherical(distance, horizontalAngle, verticalAngle);
+            }
+        }
+
         public Vector3 ToVector3() {
             float verticalRad = (UnityEngine.Mathf.PI / 2) - this.direction.vertical * UnityEngine.Mathf.Deg2Rad;
             float horizontalRad = this.direction.horizontal * UnityEngine.Mathf.Deg2Rad;
@@ -30,7 +42,6 @@ namespace Passer.LinearAlgebra {
 
             Vector3 v = new Vector3(x, y, z);
             return v;
-
         }
     }
 }
\ No newline at end of file
diff --git a/Thing.cs b/Thing.cs
index 74fd51c..c78851a 100644
--- a/Thing.cs
+++ b/Thing.cs
@@ -7,6 +7,7 @@ namespace Passer.Control.Core {
     /// <summary>
     /// A thing is the basic building block
     /// </summary>
+    [Serializable]
     public class Thing {
 
         #region Types
@@ -126,6 +127,7 @@ namespace Passer.Control.Core {
         public Spherical angularVelocity;
 
 #if UNITY_5_3_OR_NEWER
+        [NonSerialized]
         public Unity.Thing component;
 #endif
 
diff --git a/Unity/DistanceSensor.cs b/Unity/DistanceSensor.cs
index 1b7c9c4..c623c15 100644
--- a/Unity/DistanceSensor.cs
+++ b/Unity/DistanceSensor.cs
@@ -7,7 +7,7 @@ namespace Passer.Control.Unity {
     public class DistanceSensor : Thing {
 
         public new Core.DistanceSensor core {
-            get => (Core.DistanceSensor)base.core; 
+            get => (Core.DistanceSensor)base.core;
             set => base.core = value;
         }
 
@@ -29,12 +29,16 @@ namespace Passer.Control.Unity {
 
         IEnumerator MeasureDistance() {
             while (Application.isPlaying) {
-                if (Physics.Raycast(this.transform.position, this.transform.forward, out RaycastHit hitInfo, 10.0f)) {
-                    core.distance = hitInfo.distance;
-
-                    // send distance to...
-                    yield return new WaitForSeconds(1);
+                if (Physics.Raycast(this.transform.position, this.transform.forward, out RaycastHit hitInfo, 2.0f)) {
+                    Thing thing = hitInfo.transform.GetComponentInParent<Thing>();
+                    if (thing == null) {
+                        Debug.Log($"collision {hitInfo.transform.name} {hitInfo.distance}");
+                        core.distance = hitInfo.distance;
+                    }
+                    else
+                        core.distance = 0;
                 }
+                yield return new WaitForSeconds(0.1f);
             }
         }
 
diff --git a/Unity/Thing.cs b/Unity/Thing.cs
index 2687f52..a280ca2 100644
--- a/Unity/Thing.cs
+++ b/Unity/Thing.cs
@@ -5,6 +5,7 @@ namespace Passer.Control.Unity {
 
     public class Thing : MonoBehaviour {
 
+        [field: SerializeField]
         public Core.Thing core {get; set; }
 
         protected void SetCoreThing(Core.Thing thing) {