protected virtual void Update()
        {
            IMoveX bodyMoveX = body as IMoveX;
            IMoveY bodyMoveY = body as IMoveY;
            IMoveZ bodyMoveZ = body as IMoveZ;
            ITwist bodyTwist = body as ITwist;
            IJump  bodyJump  = body as IJump;

            if (bodyJump != null)
            {
                if (Input.GetButtonDown(jumpButtonName))
                {
                    bodyJump.JumpBegin();
                }
                else if (Input.GetButtonUp(jumpButtonName))
                {
                    bodyJump.JumpEnd();
                }
            }

            if (bodyMoveX != null)
            {
                bodyMoveX.MoveX(Input.GetAxis(xAxisName));
            }

            if (bodyMoveY != null)
            {
                bodyMoveY.MoveY(Input.GetAxis(yAxisName));
            }

            if (bodyMoveZ != null)
            {
                if (Input.GetAxis(zAxisName) < 0f)
                {
                    int x = 1;
                    x += 1;
                }

                bodyMoveZ.MoveZ(Input.GetAxis(zAxisName));
            }

            if (bodyTwist != null)
            {
                bodyTwist.Twist(Input.GetAxis(twistAxisName) * Time.deltaTime * maxTwistSpeed);
            }
        }
        protected virtual void Update()
        {
            IMoveX bodyMoveX = body as IMoveX;
            IMoveY bodyMoveY = body as IMoveY;
            IMoveZ bodyMoveZ = body as IMoveZ;
            ITwist bodyTwist = body as ITwist;
            IJump  bodyJump  = body as IJump;

            // For the sake of following the target, we need to see if they're
            // distant from us. This is going to be a pretty dumb follow
            // function and doesn't care how high-up they are. Thus, we will
            // project both our position and the target's position onto the
            // same plane. Then any heigh-difference gets ignored.
            //
            // If needed, we could also calculate the height pretty easily.
            // Just take the difference of the actual positions with their
            // respective projected positions, and these are their heights
            // relative to the plane. With this knowledge, we could calculate
            // the height relative to one another.
            Vector3 currentProjectedPos = Vector3.ProjectOnPlane(transform.position, transform.up);
            Vector3 targetProjectedPos  = Vector3.ProjectOnPlane(target.position, transform.up);

            if ((targetProjectedPos - currentProjectedPos).sqrMagnitude > maxDist * maxDist)
            {
                if (bodyMoveZ != null)
                {
                    walkingSpeed = Mathf.Clamp01(walkingSpeed + Time.deltaTime);
                    bodyMoveZ.MoveZ(walkingSpeed);
                }

                if (bodyTwist != null)
                {
                    bodyTwist.TwistToward(target.position);
                }
            }
            else
            {
                walkingSpeed = 0f;
            }
        }