private ICourseController GetCourseControllerFromType()
        {
            Type courseControllerType          = RetrieveCourseControllerType();
            ICourseController courseController = ReflectionUtils.CreateInstanceOfType(courseControllerType) as ICourseController;

            return(courseController);
        }
        private void CreateCourseController()
        {
            if (enforcedCourseController != null)
            {
                CurrentCourseController = enforcedCourseController;
            }
            else if (useCustomPrefab && customPrefab != null)
            {
                Instantiate(customPrefab);
                return;
            }

            ICourseController defaultCourseController = GetCourseControllerFromType();

            if (CurrentCourseController == null)
            {
                CurrentCourseController = defaultCourseController;
                if (CurrentCourseController == null)
                {
                    Debug.LogError("CourseControllerSetup was not configured properly.");
                    return;
                }
            }
            else
            {
                RemoveComponents(defaultCourseController.GetRequiredSetupComponents().Except(CurrentCourseController.GetRequiredSetupComponents()).ToList());
            }

            GameObject courseControllerPrefab = CurrentCourseController.GetCourseControllerPrefab();

            if (courseControllerPrefab != null)
            {
                Instantiate(CurrentCourseController.GetCourseControllerPrefab());
            }
        }
        protected override LocalizationConfig GetLocalizationConfig()
        {
            ICourseController controller = FindObjectOfType <CourseControllerSetup>().CurrentCourseController;

            if (controller is ILocalizationProvider localizationProvider)
            {
                return(localizationProvider.LocalizationConfig);
            }

            return(Resources.Load <LocalizationConfig>(LocalizationConfig.StandaloneDefaultLocalizationConfig));
        }
            /// <summary>
            /// Workaround to set the focus to the CourseControllerSetup if it has missing components that are required by the CourseController.
            /// </summary>
            private static void SetupCourseController()
            {
                CourseControllerSetup setup = FindObjectOfType <CourseControllerSetup>();

                if (setup == null)
                {
                    return;
                }
                List <Type>       currentTypes            = setup.GetComponents <Component>().Select(c => c.GetType()).ToList();
                ICourseController courseController        = setup.GetCourseControllerFromType();
                bool courseControllerHasMissingComponents = courseController.GetRequiredSetupComponents().Except(currentTypes).Any();

                if (courseControllerHasMissingComponents)
                {
                    Selection.activeObject = setup;
                    Debug.LogWarning($"Automatically added missing required components to {setup}.");
                }
            }
 /// <summary>
 /// Enforces the given controller to be used, if possible.
 /// </summary>
 /// <param name="courseController">Controller to be used.</param>
 /// <remarks>Scene has to be reloaded to use enforced CourseController.</remarks>
 public static void SetEnforcedCourseController(ICourseController courseController)
 {
     enforcedCourseController = courseController;
 }