// Awake is called before Start()
 void Awake()
 {
     // set the reference to the current instance
     if (Instance == null)
     {
         Instance = this;
     }
     else if (Instance != this)
     {
         Destroy(gameObject);
     }
 }
 /*
  * We want a virtual overload of HandleCollision for every concrete subtype of CollisionHandler.
  * In AbstractCollisionHandler, every method should call the DefaultHandleCollision method.  Subclasses
  * can then override HandleCollision for specific cases or can also override DefaultHandleCollision if necessary.
  * Note, we don't need to include overloads for abstract subclasses as there will never be instances of
  * those classes and the dispatching is done based on the run-time type of the collision handlers, not
  * the compile-time type.
  */
 public virtual void HandleCollision(CharacterCollisionHandler other, Vector3 fromDirection, float distance, Vector3 normal)
 {
     DefaultHandleCollision(other, fromDirection, distance, normal);
 }
 /*
 We want a virtual overload of HandleCollision for every concrete subtype of CollisionHandler.
 In AbstractCollisionHandler, every method should call the DefaultHandleCollision method.  Subclasses
 can then override HandleCollision for specific cases or can also override DefaultHandleCollision if necessary.
 Note, we don't need to include overloads for abstract subclasses as there will never be instances of
 those classes and the dispatching is done based on the run-time type of the collision handlers, not
 the compile-time type.
 */
 public virtual void HandleCollision(CharacterCollisionHandler other, Vector3 fromDirection, float distance)
 {
     DefaultHandleCollision(other, fromDirection, distance);
 }