internal static void Initialize(Config config = null)
        {
#if (UNITY_WEBGL || UNITY_PS4 || UNITY_XBOXONE || UNITY_SWITCH || UNITY_STADIA || ENABLE_IL2CPP) && !UNITY_EDITOR
            AccelBytePlugin.RegisterUtf8JsonResolver();
#endif
            AccelBytePlugin.ResetApis();
            AccelBytePlugin.initialized = true;

            if (config == null)
            {
                var configFile = Resources.Load("AccelByteSDKConfig");

                if (configFile == null)
                {
                    throw new Exception("'AccelByteSDKConfig.json' isn't found in the Project/Assets/Resources directory");
                }

                string wholeJsonText = ((TextAsset)configFile).text;

                AccelBytePlugin.config = wholeJsonText.ToObject <Config>();
            }
            else
            {
                AccelBytePlugin.config = config;
            }

            AccelBytePlugin.config.CheckRequiredField();
            AccelBytePlugin.config.Expand();

            AccelBytePlugin.coroutineRunner = new CoroutineRunner();

            AccelBytePlugin.httpClient = new AccelByteHttpClient();
            AccelBytePlugin.httpClient.SetCredentials(AccelBytePlugin.config.ClientId, AccelBytePlugin.config.ClientSecret);
            AccelBytePlugin.httpClient.SetBaseUri(new Uri(AccelBytePlugin.config.BaseUrl));

            var session = new LoginSession(
                AccelBytePlugin.config.IamServerUrl,
                AccelBytePlugin.config.Namespace,
                AccelBytePlugin.config.RedirectUri,
                AccelBytePlugin.httpClient,
                AccelBytePlugin.coroutineRunner,
                AccelBytePlugin.config.UsePlayerPrefs);

            AccelBytePlugin.gameClient = new GameClient(AccelBytePlugin.config, AccelBytePlugin.httpClient);

            AccelBytePlugin.user = new User(
                session,
                new UserAccount(
                    AccelBytePlugin.config.IamServerUrl,
                    AccelBytePlugin.config.Namespace,
                    session,
                    AccelBytePlugin.httpClient),
                AccelBytePlugin.coroutineRunner);

            ServicePointManager.ServerCertificateValidationCallback = AccelBytePlugin.OnCertificateValidated;
        }
        static AccelBytePlugin()
        {
#if UNITY_EDITOR // Handle an unexpected behaviour if Domain Reload (experimental) is disabled
            EditorApplication.playModeStateChanged += state =>
            {
                if (state == PlayModeStateChange.ExitingEditMode)
                {
                    AccelBytePlugin.initialized = false;

                    AccelBytePlugin.ResetApis();
                }
            };
#endif
        }