public void OnNucleonCollisionExit(NucleonCollisionExit CollisionExit)
        {
            TouchingFaces.Remove(CollisionExit.OtherCollider.GetInstanceID());

            if (CollisionExit.OtherCollider == Ground)
            {
                Grounded     = false;
                Ground       = null;
                GravityTimer = (sfloat)0;
            }
        }
        public void OnNucleonCollisionEnter(NucleonCollision Collision)
        {
            if (!TouchingFaces.ContainsKey(Collision.OtherCollider.GetInstanceID()))
            {
                TouchingFaces.Add(Collision.OtherCollider.GetInstanceID(), new bool[0]);
            }
            bool[] FacesArray = { Collision.TouchingMinX, Collision.TouchingMaxX, Collision.TouchingMinY, Collision.TouchingMaxY, Collision.TouchingMinZ, Collision.TouchingMaxZ };
            TouchingFaces[Collision.OtherCollider.GetInstanceID()] = FacesArray;

            transform.position = (Vector3)PrepareDetunnel(FacesArray, Collision);

            if (Collision.CollisionDirection.y < (sfloat)0 && !FacesArray[0] && !FacesArray[1] && !FacesArray[4] && !FacesArray[5])
            {
                Grounded = true;
                Ground   = Collision.OtherCollider;
                CalculationVelocity.y = 0;
                GravityTimer          = (sfloat)0;
                transform.position    = (Vector3) new svector3(
                    (sfloat)transform.position.x,
                    (((sfloat)transform.localScale.y + (sfloat)Collision.SelfCollider.Scale.y) / (sfloat)2) + Collision.OtherCollider.CubeModel.MaxY - (sfloat)Collision.SelfCollider.CollisionOverlapThreshold - (sfloat)Collision.SelfCollider.Position.y,
                    (sfloat)transform.position.z);
            }
        }