public static bool CanEditTargetPosition(PositionOptions option, NamedVariable position, FsmGameObject target)
        {
            switch (option)
            {
            case PositionOptions.CurrentPosition:
                return(false);

            case PositionOptions.WorldPosition:
            case PositionOptions.LocalPosition:
            case PositionOptions.WorldOffset:
            case PositionOptions.LocalOffset:
                return(!position.IsNone);

            case PositionOptions.TargetGameObject:
                return(target.Value != null);

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
        public static Vector3 DoTargetPositionHandle(Vector3 worldPos, PositionOptions option, Transform owner, FsmGameObject target)
        {
            //var worldPos = GetTargetPosition(option, owner, target, position);

            EditorGUI.BeginChangeCheck();

            var rotation = Quaternion.identity;
            var newPos   = worldPos;

            switch (option)
            {
            case PositionOptions.CurrentPosition:
                break;

            case PositionOptions.WorldPosition:
                newPos = Handles.PositionHandle(worldPos, rotation);
                break;

            case PositionOptions.LocalPosition:
                if (owner.parent != null)
                {
                    rotation = owner.parent.transform.rotation;
                    newPos   = owner.parent.InverseTransformPoint(Handles.PositionHandle(worldPos, rotation));
                }
                else
                {
                    newPos = Handles.PositionHandle(worldPos, rotation);
                }
                break;

            case PositionOptions.WorldOffset:
                newPos = Handles.PositionHandle(worldPos, rotation) - owner.position;
                break;

            case PositionOptions.LocalOffset:
                rotation = owner.rotation;
                newPos   = owner.InverseTransformPoint(Handles.PositionHandle(worldPos, rotation));
                break;

            case PositionOptions.TargetGameObject:
                if (target.Value == null)
                {
                    return(worldPos);
                }
                rotation = target.Value.transform.rotation;
                newPos   = target.Value.transform.InverseTransformPoint(Handles.PositionHandle(worldPos, rotation));
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(owner, "Move Scene Gizmo");
            }

            return(newPos);
        }
        private static bool CanEditTargetRotation(RotationOptions option, NamedVariable rotation, FsmGameObject target)
        {
            switch (option)
            {
            case RotationOptions.CurrentRotation:
                return(false);

            case RotationOptions.WorldRotation:
            case RotationOptions.LocalRotation:
            case RotationOptions.WorldOffsetRotation:
            case RotationOptions.LocalOffsetRotation:
                return(!rotation.IsNone);

            case RotationOptions.MatchGameObjectRotation:
                return(target.Value != null);

            default:
                throw new ArgumentOutOfRangeException();
            }
        }