// Magica Cloth.
// Copyright (c) MagicaSoft, 2020-2022.
// https://magicasoft.jp
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
namespace MagicaCloth
{
///
/// ビルドメニューウインドウ
///
public class BuildMenu : EditorWindow
{
[SerializeField]
BuildMenuData settingData = new BuildMenuData();
//=========================================================================================
[MenuItem("Tools/Magica Cloth/Build Menu", false)]
public static void InitWindow()
{
OpenBuildMenu();
}
public static void OpenBuildMenu()
{
// 全体で1つのみ起動を許可する
var settingMenu = EditorWindow.GetWindow(true, "Magica Cloth Build Menu", true);
if (settingMenu != null)
{
settingMenu.Init();
}
}
//=========================================================================================
public void Init()
{
// サイズ変更不可
maxSize = minSize = new Vector2(350, 520);
// 設定データ
settingData.Load();
// 現在アセットが選択中ならば対象を選択に変更する
//settingData.targetMode = Selection.activeObject ? 1 : 0;
}
void OnDestroy()
{
//Debug.Log("BuildMenu.OnDestroy()");
// 念の為
EditorUtility.ClearProgressBar();
}
void OnGUI()
{
if (settingData == null)
return;
GUILayout.Space(10);
GeneralGUI();
GUILayout.Space(10);
using (var horizontalScope = new GUILayout.HorizontalScope())
{
GUILayout.FlexibleSpace();
if (GUILayout.Button(settingData.VerificationOnly ? "Verify" : "Build", GUILayout.Width(80)))
{
Save();
Confirm();
}
GUILayout.Space(20);
if (GUILayout.Button("Close", GUILayout.Width(80)))
{
Save();
Close();
}
GUILayout.FlexibleSpace();
}
GUILayout.Space(10);
}
//=========================================================================================
void GeneralGUI()
{
EditorGUIUtility.labelWidth = 200;
// Target Object
EditorGUILayout.LabelField("Target Object", EditorStyles.boldLabel);
using (var verticalScope = new GUILayout.VerticalScope(GUI.skin.box))
{
settingData.TargetMode = GUILayout.SelectionGrid(settingData.TargetMode, new string[] { "All Assets", "Selected Assets" }, 1, new GUIStyle(EditorStyles.radioButton));
settingData.Prefab = EditorGUILayout.Toggle("Prefab", settingData.Prefab);
settingData.Scene = EditorGUILayout.Toggle("Scene", settingData.Scene);
}
GUILayout.Space(10);
// Target Component
EditorGUILayout.LabelField("Target Component", EditorStyles.boldLabel);
using (var verticalScope = new GUILayout.VerticalScope(GUI.skin.box))
{
settingData.BoneCloth = EditorGUILayout.Toggle("Bone Cloth", settingData.BoneCloth);
settingData.BoneSpring = EditorGUILayout.Toggle("Bone Spring", settingData.BoneSpring);
settingData.MeshCloth = EditorGUILayout.Toggle("Mesh Cloth", settingData.MeshCloth);
settingData.MeshSpring = EditorGUILayout.Toggle("Mesh Spring", settingData.MeshSpring);
settingData.RenderDeformer = EditorGUILayout.Toggle("Render Deformer", settingData.RenderDeformer);
settingData.VirtualDeformer = EditorGUILayout.Toggle("Virtual Deformer", settingData.VirtualDeformer);
}
GUILayout.Space(10);
// Build Conditions
EditorGUILayout.LabelField("Build Conditions", EditorStyles.boldLabel);
using (var verticalScope = new GUILayout.VerticalScope(GUI.skin.box))
{
using (var disableScope = new EditorGUI.DisabledGroupScope(settingData.VerificationOnly))
{
settingData.ForceBuild = EditorGUILayout.Toggle("Force Build", settingData.ForceBuild);
settingData.NotCreated = EditorGUILayout.Toggle("Not Created Or In Error", settingData.NotCreated);
settingData.UpgradeFormatAndAlgorithm = EditorGUILayout.Toggle("Upgrade Format And Algorithm", settingData.UpgradeFormatAndAlgorithm);
}
settingData.VerificationOnly = EditorGUILayout.Toggle("Verification Only (no build)", settingData.VerificationOnly);
}
GUILayout.Space(10);
// Option
EditorGUILayout.LabelField("Option", EditorStyles.boldLabel);
using (var verticalScope = new GUILayout.VerticalScope(GUI.skin.box))
{
settingData.ErrorStop = EditorGUILayout.Toggle("Error Stop", settingData.ErrorStop);
}
GUILayout.FlexibleSpace();
}
///
/// 設定保存
///
void Save()
{
settingData.Save();
}
//=========================================================================================
///
/// 実行確認
///
void Confirm()
{
// 対象guids
var guidList = new List();
if (settingData.TargetMode == 0)
{
// All Assets
if (settingData.Prefab)
guidList.AddRange(AssetDatabase.FindAssets("t:Prefab", new[] { "Assets" }));
if (settingData.Scene)
guidList.AddRange(AssetDatabase.FindAssets("t:Scene", new[] { "Assets" }));
}
else if (settingData.TargetMode == 1)
{
// Selected
foreach (var guid in Selection.assetGUIDs)
{
var path = AssetDatabase.GUIDToAssetPath(guid);
if (path.StartsWith("Assets"))
{
if (settingData.Prefab && Path.GetExtension(path) == ".prefab")
guidList.Add(guid);
if (settingData.Scene && Path.GetExtension(path) == ".unity")
guidList.Add(guid);
}
}
}
// 実行確認
if (guidList.Count == 0)
{
EditorUtility.DisplayDialog("Confirm", "Not applicable!", "OK");
}
else
{
if (EditorUtility.DisplayDialog("Confirm", $"Select [{guidList.Count}] Assets.\nDo you want to run it?\n\n<< Attention! >>\nThis operation cannot be undone.", "OK", "Cancel"))
{
Build(guidList);
GUIUtility.ExitGUI();
}
}
}
///
/// ビルド開始
///
void Build(List guidList)
{
Debug.Log("Start Build.");
// option
var option = new BuildOptions()
{
includeInactive = true,
buildBoneCloth = settingData.BoneCloth,
buildBoneSpring = settingData.BoneSpring,
buildMeshCloth = settingData.MeshCloth,
buildMeshSpring = settingData.MeshSpring,
buildRenderDeformer = settingData.RenderDeformer,
buildVirtualDeformer = settingData.VirtualDeformer,
forceBuild = settingData.ForceBuild,
notCreated = settingData.NotCreated,
upgradeFormatAndAlgorithm = settingData.UpgradeFormatAndAlgorithm,
verificationOnly = settingData.VerificationOnly,
errorStop = settingData.ErrorStop,
};
int cnt = guidList.Count;
var totalResult = new BuildResult();
for (int i = 0; i < cnt; i++)
{
// progress bar
float progress = (float)i / cnt;
bool isCancel = EditorUtility.DisplayCancelableProgressBar("Build", $"{i} / {cnt}", progress);
if (isCancel)
{
Debug.Log("Cancel Build!");
break;
}
var path = AssetDatabase.GUIDToAssetPath(guidList[i]);
var result = new BuildResult();
if (Path.GetExtension(path) == ".prefab")
{
result = BuildManager.BuildFromAssetPath(path, option);
}
if (Path.GetExtension(path) == ".unity")
{
result = BuildManager.BuildFromScenePath(path, option);
}
// total
totalResult.Merge(result);
if (result.IsError())
{
Debug.LogError($"Failed! [{path}]\n{result.GetErrorMessage()}");
if (option.errorStop)
{
Debug.Log("Error Stop!");
break;
}
}
}
EditorUtility.ClearProgressBar();
Debug.Log($"End Build. (Success={totalResult.SuccessCount}, Failed={totalResult.FailedCount})");
}
}
}