|
|
- using System;
- using System.Collections.Generic;
- using System.IO;
- using Photon.Bolt.Editor.Utils;
- using UnityEditor;
- using UnityEngine;
-
- namespace Photon.Bolt.Utils
- {
- public static class MenuUtililies
- {
- private const string DLL_SUFIX_DEBUG = ".debug";
- private const string DLL_SUFIX_RELEASE = ".release";
-
- // ======= PUBLIC METHODS =====================================================================================
-
- [MenuItem("Photon Bolt/Utils/Find Missing Scripts", priority = 125)]
- public static void FindMissingScriptsMenu()
- {
- BoltLog.Info("Searching for Missing Scripts");
- if (FindMissingComponents() == 0)
- {
- BoltLog.Info("Not found any prefab with missing scripts");
- }
- }
-
- [MenuItem("Photon Bolt/Utils/Remove Missing Scripts", priority = 126)]
- public static void RemoveMissingScriptMenu()
- {
- BoltLog.Info("Removing Missing Scripts");
-
- RemoveMissingScripts();
- }
-
- [MenuItem("Photon Bolt/Utils/Change DLL Mode", priority = 127)]
- public static void ChangeDllModeMenu()
- {
- var current = BoltNetwork.IsDebugMode ? "Debug" : "Release";
- var target = !BoltNetwork.IsDebugMode ? "Debug" : "Release";
-
- var msg = string.Format("Bolt is in {0} mode, want to change to {1}?", current, target);
-
- if (EditorUtility.DisplayDialog("Change Bolt DLL Mode", msg, "Yes", "Cancel"))
- {
- if (ChangeDllMode())
- {
- Debug.LogFormat("Bolt Mode swiched to {0}.", target);
- }
- else
- {
- Debug.LogError("Error while swithing Bolt Mode, changes were reverted.");
- }
- }
- }
-
- public static bool ChangeDllMode()
- {
- return SwitchDebugReleaseMode(BoltNetwork.IsDebugMode);
- }
-
- // ======= PRIVATE METHODS =====================================================================================
-
- public static int FindMissingComponents()
- {
- var missingScriptsCount = 0;
- var components = new List<Component>();
-
- var folders = new string[] { "Assets" };
- var iter = AssetDatabase.FindAssets("t:Prefab", folders).GetEnumerator();
-
- while (iter.MoveNext())
- {
- var guid = (string)iter.Current;
- var path = AssetDatabase.GUIDToAssetPath(guid);
- var go = AssetDatabase.LoadAssetAtPath<GameObject>(path);
-
- go.GetComponentsInChildren(true, components);
- for (var j = 0; j < components.Count; ++j)
- {
- if (components[j] == null)
- {
- ++missingScriptsCount;
- BoltLog.Error("Missing script: " + path);
- }
- }
- components.Clear();
- }
-
- if (missingScriptsCount != 0)
- {
- BoltLog.Info("Found {0} Missing Scripts", missingScriptsCount);
- }
-
- return missingScriptsCount;
- }
-
- public static void RemoveMissingScripts()
- {
- var folders = new string[] { "Assets" };
- var iter = AssetDatabase.FindAssets("t:Prefab", folders).GetEnumerator();
-
- while (iter.MoveNext())
- {
- var guid = (string)iter.Current;
- var path = AssetDatabase.GUIDToAssetPath(guid);
- var go = AssetDatabase.LoadAssetAtPath<GameObject>(path);
-
- var result = RemoveFromGO(go);
-
- if (result > 0)
- {
- BoltLog.Info("Removed scripts from {0}", path);
- }
- }
- }
-
- private static int RemoveFromGO(GameObject go)
- {
- var result = GameObjectUtility.RemoveMonoBehavioursWithMissingScript(go);
-
- for (int i = 0; i < go.transform.childCount; i++)
- {
- var child = go.transform.GetChild(i);
- result += RemoveFromGO(child.gameObject);
- }
-
- return result;
- }
-
- private static bool SwitchDebugReleaseMode(bool debug)
- {
- var from = debug ? DLL_SUFIX_DEBUG : DLL_SUFIX_RELEASE;
- var to = debug ? DLL_SUFIX_RELEASE : DLL_SUFIX_DEBUG;
-
- var paths = new string[]
- {
- BoltPathUtility.BoltDllPath,
- BoltPathUtility.BoltCompilerDLLPath,
- BoltPathUtility.BoltEditorDLLPath
- };
-
- var abort = false;
- var backup = "";
-
- foreach (var path in paths)
- {
- if (abort == true) { break; }
-
- try
- {
- backup = FileUtils.BackupFile(path);
- FileUtils.ExchangeFile(path, from, to);
- }
- catch (IOException ex)
- {
- Debug.LogError("Aborting...");
- Debug.LogException(ex);
- abort = true;
-
- try
- {
- FileUtils.BackupFile(path, true);
- }
- catch (Exception ex2)
- {
- Debug.LogException(ex2);
- }
- }
- finally
- {
- try
- {
- FileUtils.DeleteFile(backup);
- }
- catch (Exception ex)
- {
- Debug.LogException(ex);
- }
-
- backup = "";
- }
- }
-
- if (abort == false)
- {
- AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
- }
-
- return abort == false;
- }
-
- private class FileUtils
- {
- public static void ExchangeFile(string basePath, string fromSuffix, string toSuffix)
- {
- MoveFile(basePath, basePath + fromSuffix);
- MoveFile(basePath + toSuffix, basePath);
- }
-
- public static void MoveFile(string from, string to)
- {
- if (File.Exists(to)) { return; }
-
- if (from.EndsWith(DLL_SUFIX_DEBUG) || from.EndsWith(DLL_SUFIX_RELEASE))
- {
- DeleteFile(string.Format("{0}.meta", from));
- }
-
- Debug.LogFormat("Moving file from {0} to {1}", from, to);
- File.Move(from, to);
- }
-
- public static string BackupFile(string path, bool restore = false)
- {
- var backup = string.Format("{0}.backup", path);
-
- if (restore)
- {
- Debug.LogFormat("Restore backup from file {0}", backup);
- File.Copy(backup, path, true);
- }
- else
- {
- Debug.LogFormat("Creating backup from file {0}", path);
- File.Copy(path, backup, true);
- }
-
- return backup;
- }
-
- public static void DeleteFile(string path)
- {
- if (string.IsNullOrEmpty(path) || File.Exists(path) == false) { return; }
- Debug.LogFormat("Removing file {0}", path);
- File.Delete(path);
- }
- }
- }
- }
|