protected static void MenuItemOpenWizard() { PhotonEditor win = GetWindow <PhotonEditor>(false, CurrentLang.WindowTitle, true); if (win == null) { return; } win.photonSetupState = PhotonSetupStates.MainUi; win.isSetupWizard = false; }
/// <summary>Creates an Editor window, showing the cloud-registration wizard for Photon (entry point to setup PUN).</summary> protected static void ShowRegistrationWizard() { PhotonEditor win = GetWindow(WindowType, false, CurrentLang.WindowTitle, true) as PhotonEditor; if (win == null) { return; } win.photonSetupState = PhotonSetupStates.RegisterForPhotonCloud; win.isSetupWizard = true; }
private void RegisterWithEmailSuccessCallback(AccountServiceResponse res) { EditorUtility.ClearProgressBar(); this.emailSentToAccountIsRegistered = true; // email is either registered now, or was already if (res.ReturnCode == AccountServiceReturnCodes.Success) { string key = ((int)ServiceTypes.Pun).ToString(); string appId; if (res.ApplicationIds.TryGetValue(key, out appId)) { this.mailOrAppId = appId; PhotonNetwork.PhotonServerSettings.UseCloud(this.mailOrAppId, null); key = ((int)ServiceTypes.Chat).ToString(); if (res.ApplicationIds.TryGetValue(key, out appId)) { PhotonNetwork.PhotonServerSettings.AppSettings.AppIdChat = appId; } else if (PhotonEditorUtils.HasChat) { Debug.LogWarning("Registration successful but no Chat AppId returned"); } key = ((int)ServiceTypes.Voice).ToString(); if (res.ApplicationIds.TryGetValue(key, out appId)) { PhotonNetwork.PhotonServerSettings.AppSettings.AppIdVoice = appId; } else if (PhotonEditorUtils.HasVoice) { Debug.LogWarning("Registration successful but no Voice AppId returned"); } PhotonEditor.SaveSettings(); this.photonSetupState = PhotonSetupStates.GoEditPhotonServerSettings; } else { DisplayErrorMessage("Registration successful but no PUN AppId returned"); } } else { PhotonEditor.SaveSettings(); if (res.ReturnCode == AccountServiceReturnCodes.EmailAlreadyRegistered) { this.photonSetupState = PhotonSetupStates.EmailAlreadyRegistered; } else { DisplayErrorMessage(res.Message); } } }
// called 100 times / sec private static void OnUpdate() { // after a compile, check RPCs to create a cache-list if (!postCompileActionsDone && !EditorApplication.isCompiling && !EditorApplication.isPlayingOrWillChangePlaymode && PhotonNetwork.PhotonServerSettings != null) { if (EditorApplication.isUpdating) { return; } PhotonEditor.UpdateRpcList(); postCompileActionsDone = true; // on compile, this falls back to false (without actively doing anything) } }
protected virtual void RegisterWithEmail(string email) { EditorUtility.DisplayProgressBar(CurrentLang.ConnectionTitle, CurrentLang.ConnectionInfo, 0.5f); string accountServiceType = string.Empty; if (PhotonEditorUtils.HasVoice) { accountServiceType = "voice"; } AccountService client = new AccountService(); client.RegisterByEmail(email, RegisterOrigin, accountServiceType); // this is the synchronous variant using the static RegisterOrigin. "result" is in the client EditorUtility.ClearProgressBar(); if (client.ReturnCode == 0) { this.mailOrAppId = client.AppId; PhotonNetwork.PhotonServerSettings.UseCloud(this.mailOrAppId, null); if (PhotonEditorUtils.HasVoice) { PhotonNetwork.PhotonServerSettings.AppSettings.AppIdVoice = client.AppId2; } PhotonEditor.SaveSettings(); this.photonSetupState = PhotonSetupStates.GoEditPhotonServerSettings; } else { PhotonEditor.SaveSettings(); Debug.LogWarning(client.Message + " ReturnCode: " + client.ReturnCode); if (client.Message.Contains("registered")) { this.photonSetupState = PhotonSetupStates.EmailAlreadyRegistered; } else { EditorUtility.DisplayDialog(CurrentLang.ErrorTextTitle, client.Message, CurrentLang.OkButton); this.photonSetupState = PhotonSetupStates.RegisterForPhotonCloud; } } }
// setup once on load static PhotonEditor() { #if UNITY_2017_2_OR_NEWER EditorApplication.playModeStateChanged += PlaymodeStateChanged; #else EditorApplication.playmodeStateChanged += PlaymodeStateChanged; #endif #if UNITY_2018 EditorApplication.projectChanged += EditorUpdate; EditorApplication.hierarchyChanged += EditorUpdate; #else EditorApplication.projectWindowChanged += EditorUpdate; EditorApplication.hierarchyWindowChanged += EditorUpdate; #endif EditorApplication.update += OnUpdate; // detect optional packages PhotonEditor.CheckPunPlus(); }
// called in editor, opens wizard for initial setup, keeps scene PhotonViews up to date and closes connections when compiling (to avoid issues) private static void OnProjectChanged() { if (PhotonNetwork.PhotonServerSettings == null) { PhotonNetwork.CreateSettings(); if (PhotonNetwork.PhotonServerSettings == null) { Debug.LogError("CreateSettings() failed to create PhotonServerSettings."); return; } } // serverSetting is null when the file gets deleted. otherwise, the wizard should only run once and only if hosting option is not (yet) set if (!PhotonNetwork.PhotonServerSettings.DisableAutoOpenWizard) { ShowRegistrationWizard(); PhotonNetwork.PhotonServerSettings.DisableAutoOpenWizard = true; PhotonEditor.SaveSettings(); } }
// called in editor, opens wizard for initial setup, keeps scene PhotonViews up to date and closes connections when compiling (to avoid issues) private static void EditorUpdate() { if (PhotonNetwork.PhotonServerSettings == null) { PhotonNetwork.CreateSettings(); } if (PhotonNetwork.PhotonServerSettings == null) { return; } // serverSetting is null when the file gets deleted. otherwise, the wizard should only run once and only if hosting option is not (yet) set if (!PhotonNetwork.PhotonServerSettings.DisableAutoOpenWizard) { ShowRegistrationWizard(); PhotonNetwork.PhotonServerSettings.DisableAutoOpenWizard = true; PhotonEditor.SaveSettings(); } // Workaround for TCP crash. Plus this surpresses any other recompile errors. if (EditorApplication.isCompiling) { if (PhotonNetwork.IsConnected) { if (lastWarning > EditorApplication.timeSinceStartup - 3) { // Prevent error spam Debug.LogWarning(CurrentLang.WarningPhotonDisconnect); lastWarning = EditorApplication.timeSinceStartup; } PhotonNetwork.Disconnect(); } } }
protected virtual void UiSetupApp() { GUI.skin.label.wordWrap = true; if (!this.isSetupWizard) { GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button(CurrentLang.MainMenuButton, GUILayout.ExpandWidth(false))) { this.photonSetupState = PhotonSetupStates.MainUi; } GUILayout.EndHorizontal(); } // setup header this.UiTitleBox(CurrentLang.SetupWizardTitle, BackgroundImage); // setup info text GUI.skin.label.richText = true; GUILayout.Label(CurrentLang.SetupWizardInfo); // input of appid or mail EditorGUILayout.Separator(); GUILayout.Label(CurrentLang.EmailOrAppIdLabel); this.minimumInput = false; this.useMail = false; this.useAppId = false; this.mailOrAppId = EditorGUILayout.TextField(this.mailOrAppId); if (!string.IsNullOrEmpty(this.mailOrAppId)) { this.mailOrAppId = this.mailOrAppId.Trim(); // note: we trim all input if (AccountService.IsValidEmail(this.mailOrAppId)) { // this should be a mail address this.minimumInput = true; this.useMail = this.minimumInput; } else if (ServerSettings.IsAppId(this.mailOrAppId)) { // this should be an appId this.minimumInput = true; this.useAppId = this.minimumInput; } } // button to skip setup GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button(CurrentLang.SkipButton, GUILayout.Width(100))) { this.photonSetupState = PhotonSetupStates.GoEditPhotonServerSettings; this.useSkip = true; this.useMail = false; this.useAppId = false; } // SETUP button EditorGUI.BeginDisabledGroup(!this.minimumInput); if (GUILayout.Button(CurrentLang.SetupButton, GUILayout.Width(100))) { this.useSkip = false; GUIUtility.keyboardControl = 0; if (this.useMail) { this.RegisterWithEmail(this.mailOrAppId); // sets state } if (this.useAppId) { this.photonSetupState = PhotonSetupStates.GoEditPhotonServerSettings; Undo.RecordObject(PhotonNetwork.PhotonServerSettings, "Update PhotonServerSettings for PUN"); PhotonNetwork.PhotonServerSettings.UseCloud(this.mailOrAppId); PhotonEditor.SaveSettings(); } } EditorGUI.EndDisabledGroup(); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); // existing account needs to fetch AppId online if (this.photonSetupState == PhotonSetupStates.EmailAlreadyRegistered) { // button to open dashboard and get the AppId GUILayout.Space(15); GUILayout.Label(CurrentLang.AlreadyRegisteredInfo); GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button(new GUIContent(CurrentLang.OpenCloudDashboardText, CurrentLang.OpenCloudDashboardTooltip), GUILayout.Width(205))) { Application.OpenURL(string.Concat(UrlCloudDashboard, Uri.EscapeUriString(this.mailOrAppId))); this.mailOrAppId = string.Empty; } GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); } if (this.photonSetupState == PhotonSetupStates.GoEditPhotonServerSettings) { if (!this.highlightedSettings) { this.highlightedSettings = true; HighlightSettings(); } GUILayout.Space(15); if (this.useSkip) { GUILayout.Label(CurrentLang.SkipRegistrationInfo); } else if (this.useMail) { GUILayout.Label(CurrentLang.RegisteredNewAccountInfo); } else if (this.useAppId) { GUILayout.Label(CurrentLang.AppliedToSettingsInfo); } // setup-complete info GUILayout.Space(15); GUILayout.Label(CurrentLang.SetupCompleteInfo); // close window (done) GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button(CurrentLang.CloseWindowButton, GUILayout.Width(205))) { this.close = true; } GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); } GUI.skin.label.richText = false; }
private static void OnDidReloadScripts() { //Debug.Log("OnDidReloadScripts()"); PhotonEditor.UpdateRpcList(); }
private static void OnDidReloadScripts() { PhotonEditor.UpdateRpcList(); // could be called when compilation finished (instead of when reload / compile starts) }
public override void OnInspectorGUI() { if (vertboxStyle == null) { vertboxStyle = new GUIStyle("HelpBox") { padding = new RectOffset(6, 6, 6, 6) } } ; SerializedObject sObj = new SerializedObject(this.target); ServerSettings settings = this.target as ServerSettings; EditorGUI.BeginChangeCheck(); #region Version Vertical Box EditorGUILayout.BeginVertical(/*vertboxStyle*/); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel(new GUIContent("Version:", "Version of PUN and Photon3Unity3d.dll.")); GUILayout.FlexibleSpace(); var helpicorect = EditorGUILayout.GetControlRect(GUILayout.MaxWidth(16)); EditorGUIUtility.AddCursorRect(helpicorect, MouseCursor.Link); if (GUI.Button(helpicorect, PhotonGUI.HelpIcon, GUIStyle.none)) { Application.OpenURL(PhotonEditor.UrlPunSettings); } EditorGUILayout.EndHorizontal(); EditorGUILayout.LabelField("Pun: " + PhotonNetwork.PunVersion + " Photon lib: " + this.versionPhoton); EditorGUILayout.EndVertical(); #endregion Version Vertical Box EditorGUI.indentLevel--; SerializedProperty showSettingsProp = this.serializedObject.FindProperty("ShowSettings"); bool showSettings = showSettingsProp.Foldout(new GUIContent("Server/Cloud Settings", "Core Photon Server/Cloud settings.")); EditorGUI.indentLevel++; if (showSettings != settings.ShowSettings) { showSettingsProp.boolValue = showSettings; } if (showSettingsProp.boolValue) { SerializedProperty settingsSp = this.serializedObject.FindProperty("AppSettings"); EditorGUI.indentLevel++; //Realtime APP ID this.BuildAppIdField(settingsSp.FindPropertyRelative("AppIdRealtime"), "App Id PUN"); if (PhotonEditorUtils.HasChat) { this.BuildAppIdField(settingsSp.FindPropertyRelative("AppIdChat")); } if (PhotonEditorUtils.HasVoice) { this.BuildAppIdField(settingsSp.FindPropertyRelative("AppIdVoice")); } EditorGUILayout.PropertyField(settingsSp.FindPropertyRelative("AppVersion")); EditorGUILayout.PropertyField(settingsSp.FindPropertyRelative("UseNameServer"), new GUIContent("Use Name Server", "Photon Cloud requires this checked.\nUncheck for Photon Server SDK (OnPremise).")); EditorGUILayout.PropertyField(settingsSp.FindPropertyRelative("FixedRegion"), new GUIContent("Fixed Region", "Photon Cloud setting, needs a Name Server.\nDefine one region to always connect to.\nLeave empty to use the best region from a server-side region list.")); EditorGUILayout.PropertyField(settingsSp.FindPropertyRelative("Server"), new GUIContent("Server", "Typically empty for Photon Cloud.\nFor Photon OnPremise, enter your host name or IP. Also uncheck \"Use Name Server\" for older Photon OnPremise servers.")); EditorGUILayout.PropertyField(settingsSp.FindPropertyRelative("Port"), new GUIContent("Port", "Leave 0 to use default Photon Cloud ports for the Name Server.\nOnPremise defaults to 5055 for UDP and 4530 for TCP.")); EditorGUILayout.PropertyField(settingsSp.FindPropertyRelative("ProxyServer"), new GUIContent("Proxy Server", "HTTP Proxy Server for WebSocket connection. See LoadBalancingClient.ProxyServerAddress for options.")); EditorGUILayout.PropertyField(settingsSp.FindPropertyRelative("Protocol"), new GUIContent("Protocol", "Use UDP where possible.\nWSS works on WebGL and Xbox exports.\nDefine WEBSOCKET for use on other platforms.")); EditorGUILayout.PropertyField(settingsSp.FindPropertyRelative("EnableProtocolFallback"), new GUIContent("Protocol Fallback", "Automatically try another network protocol, if initial connect fails.\nWill use default Name Server ports.")); EditorGUILayout.PropertyField(settingsSp.FindPropertyRelative("EnableLobbyStatistics"), new GUIContent("Lobby Statistics", "When using multiple room lists (lobbies), the server can send info about their usage.")); EditorGUILayout.PropertyField(settingsSp.FindPropertyRelative("NetworkLogging"), new GUIContent("Network Logging", "Log level for the Photon libraries.")); EditorGUI.indentLevel--; } EditorGUILayout.PropertyField(this.serializedObject.FindProperty("PunLogging"), new GUIContent("PUN Logging", "Log level for the PUN layer.")); EditorGUILayout.PropertyField(this.serializedObject.FindProperty("EnableSupportLogger"), new GUIContent("Support Logger", "Logs additional info for debugging.\nUse this when you submit bugs to the Photon Team.")); EditorGUILayout.PropertyField(this.serializedObject.FindProperty("RunInBackground"), new GUIContent("Run In Background", "Enables apps to keep the connection without focus. Android and iOS ignore this.")); EditorGUILayout.PropertyField(this.serializedObject.FindProperty("StartInOfflineMode"), new GUIContent("Start In Offline Mode", "Simulates an online connection.\nPUN can be used as usual.")); EditorGUILayout.PropertyField(this.serializedObject.FindProperty("DevRegion"), new GUIContent("Dev Region", "Photon Cloud setting, needs a Name Server.\nDefine region the Editor and Development builds will always connect to - ensuring all users can find common rooms.\nLeave empty to use the Fixed Region or best region from a server-side region list. This value will be ignored for non-Development builds.")); #region Best Region Box EditorGUILayout.BeginVertical(vertboxStyle); if (!string.IsNullOrEmpty(PhotonNetwork.BestRegionSummaryInPreferences)) { this.regionsPrefsList = PhotonNetwork.BestRegionSummaryInPreferences.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); if (this.regionsPrefsList.Length < 2) { this.prefLabel = notAvailableLabel; } else { this.prefLabel = string.Format("'{0}' ping:{1}ms ", this.regionsPrefsList[0], this.regionsPrefsList[1]); } } else { this.prefLabel = notAvailableLabel; } EditorGUILayout.LabelField(new GUIContent("Best Region Preference: " + prefLabel, "Best region is used if Fixed Region is empty.")); EditorGUILayout.BeginHorizontal(); var resetrect = EditorGUILayout.GetControlRect(GUILayout.MinWidth(64)); var editrect = EditorGUILayout.GetControlRect(GUILayout.MinWidth(64)); if (GUI.Button(resetrect, "Reset", EditorStyles.miniButton)) { ServerSettings.ResetBestRegionCodeInPreferences(); } if (GUI.Button(editrect, "Edit WhiteList", EditorStyles.miniButton)) { Application.OpenURL("https://dashboard.photonengine.com/en-US/App/RegionsWhitelistEdit/" + PhotonNetwork.PhotonServerSettings.AppSettings.AppIdRealtime); } EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); #endregion Best Region Box //this.showRpcs = EditorGUILayout.Foldout(this.showRpcs, new GUIContent("RPCs", "RPC shortcut list.")); EditorGUI.indentLevel--; this.showRpcs = this.showRpcs.Foldout(new GUIContent("RPCs", "RPC shortcut list.")); EditorGUI.indentLevel++; if (this.showRpcs) { // first time check to get the rpc has proper if (string.IsNullOrEmpty(this.rpcCrc)) { this.rpcCrc = this.RpcListHashCode().ToString("X"); } #region Begin Vertical Box CRC EditorGUILayout.BeginVertical(vertboxStyle); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("List CRC"); EditorGUI.indentLevel--; var copyrect = EditorGUILayout.GetControlRect(GUILayout.MaxWidth(16)); EditorGUILayout.GetControlRect(GUILayout.MaxWidth(12)); var hashrect = EditorGUILayout.GetControlRect(GUILayout.MinWidth(16)); // new Rect(copyrect) { xMin = copyrect.xMin + 32 }; EditorGUIUtility.AddCursorRect(copyrect, MouseCursor.Link); EditorGUI.LabelField(copyrect, new GUIContent("", "Copy Hashcode to Clipboard")); if (GUI.Button(copyrect, PhotonGUI.CopyIcon, GUIStyle.none)) { Debug.Log("RPC-List HashCode copied into your ClipBoard: " + this.rpcCrc + ". Make sure clients that send each other RPCs have the same RPC-List."); EditorGUIUtility.systemCopyBuffer = this.rpcCrc; } EditorGUI.SelectableLabel(hashrect, this.rpcCrc); EditorGUILayout.EndHorizontal(); EditorGUI.indentLevel++; EditorGUILayout.BeginHorizontal(); var refreshrect = EditorGUILayout.GetControlRect(GUILayout.MinWidth(64)); var clearrect = EditorGUILayout.GetControlRect(GUILayout.MinWidth(64)); if (GUI.Button(refreshrect, "Refresh RPCs", EditorStyles.miniButton)) { PhotonEditor.UpdateRpcList(); this.Repaint(); } if (GUI.Button(clearrect, "Clear RPCs", EditorStyles.miniButton)) { PhotonEditor.ClearRpcList(); } EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); #endregion End Vertical Box CRC EditorGUI.indentLevel++; SerializedProperty sRpcs = sObj.FindProperty("RpcList"); EditorGUILayout.PropertyField(sRpcs, true); EditorGUI.indentLevel--; } if (EditorGUI.EndChangeCheck()) { sObj.ApplyModifiedProperties(); this.serializedObject.ApplyModifiedProperties(); // cache the rpc hash this.rpcCrc = this.RpcListHashCode().ToString("X"); } #region Simple Settings /// Conditional Simple Sync Settings DrawGUI - Uses reflection to avoid having to hard connect the libraries var SettingsScriptableObjectBaseType = GetType("Photon.Utilities.SettingsScriptableObjectBase"); if (SettingsScriptableObjectBaseType != null) { EditorGUILayout.GetControlRect(false, 3); EditorGUILayout.LabelField("Simple Extension Settings", (GUIStyle)"BoldLabel"); var drawAllMethod = SettingsScriptableObjectBaseType.GetMethod("DrawAllSettings"); if (drawAllMethod != null && this != null) { bool initializeAsOpen = false; drawAllMethod.Invoke(null, new object[2] { this, initializeAsOpen }); } } #endregion }