using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using Bolt.Editor;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
namespace Bolt.Utils
|
|
{
|
|
public static class MenuUtililies
|
|
{
|
|
// ======= PUBLIC METHODS =====================================================================================
|
|
|
|
[MenuItem("Bolt/Utils/Find Missing Scripts", priority = 25)]
|
|
public static void FindMissingScriptsMenu()
|
|
{
|
|
BoltLog.Info("Searching for Missing Scripts");
|
|
if (FindMissingComponents() == 0)
|
|
{
|
|
BoltLog.Info("Not found any prefab with missing scripts");
|
|
}
|
|
}
|
|
|
|
[MenuItem("Bolt/Utils/Change DLL Mode", priority = 26)]
|
|
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())
|
|
{
|
|
UnityEngine.Debug.LogFormat("Bolt Mode swiched to {0}.", target);
|
|
}
|
|
else
|
|
{
|
|
UnityEngine.Debug.LogError("Error while swithing Bolt Mode, changes were reverted.");
|
|
}
|
|
}
|
|
}
|
|
|
|
public static bool ChangeDllMode()
|
|
{
|
|
return SwitchDebugReleaseMode(BoltNetwork.IsDebugMode);
|
|
}
|
|
|
|
// ======= PRIVATE METHODS =====================================================================================
|
|
|
|
public static int FindMissingComponents()
|
|
{
|
|
int missingScriptsCount = 0;
|
|
List<Component> 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 (int 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;
|
|
}
|
|
|
|
private static bool SwitchDebugReleaseMode(bool debug)
|
|
{
|
|
var from = debug ? ".debug" : ".release";
|
|
var to = debug ? ".release" : ".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)
|
|
{
|
|
FileUtils.BackupFile(path, true);
|
|
abort = true;
|
|
}
|
|
finally
|
|
{
|
|
FileUtils.DeleteFile(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; }
|
|
|
|
UnityEngine.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 = path + ".backup";
|
|
|
|
if (restore)
|
|
{
|
|
File.Copy(backup, path, true);
|
|
}
|
|
else
|
|
{
|
|
File.Copy(path, backup, true);
|
|
}
|
|
|
|
return backup;
|
|
}
|
|
|
|
public static void DeleteFile(string path)
|
|
{
|
|
if (string.IsNullOrEmpty(path) || File.Exists(path) == false) { return; }
|
|
File.Delete(path);
|
|
}
|
|
}
|
|
}
|
|
}
|