// This is called by FixedUpdate(), but with a quick exit if there is no change.
    private void SetUserMode(bool force = false)
    {
        if (force || (userMode != curMode))
        {
            switch (userMode)
            {
                case DroneMode.Follow:
                    SetFollowMode();
                    break;
                case DroneMode.Hover:
                    SetHoverMode();
                    break;
                case DroneMode.Land:
                    SetLandMode();
                    break;
                case DroneMode.Maintain:
                    SetMaintainMode();
                    break;
                case DroneMode.Manual:
                    SetManualMode();
                    break;
                case DroneMode.Patrol:
                    SetPatrolMode();
                    break;
                default:
                    SetMaintainMode();
                    break;
            }
        }

        // Adjust the targetBehavior if necessary.
        if (userMode == DroneMode.Follow && (force || userFollowMode != curFollowMode))
        {
            switch (userFollowMode)
            {
                case DroneFollowMode.Constrained:
                    targetBehavior = targetConstrainedBehavior;
                    curFollowMode = DroneFollowMode.Constrained;
                    break;
                default:
                    targetBehavior = targetDirectBehavior;
                    curFollowMode = DroneFollowMode.Direct;
                    break;
            }
        }

    }