-
-
Notifications
You must be signed in to change notification settings - Fork 3
/
MenuItems.cs
119 lines (104 loc) · 4.16 KB
/
MenuItems.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#nullable enable
using System.Linq;
using System.Threading.Tasks;
using UnityEngine;
using UnityEditor;
using UnityEditor.PackageManager;
using VRM;
using Esperecyan.UniVRMExtensions.CopyVRMSettingsComponents;
using SwayingObjectsConverterWizard = Esperecyan.UniVRMExtensions.SwayingObjects.Wizard;
namespace Esperecyan.UniVRMExtensions
{
/// <summary>
/// メニューアイテムへの追加とバリデート。
/// </summary>
public static class MenuItems
{
/// <summary>
/// 当エディタ拡張の名称。
/// </summary>
internal const string Name = "UniVRMExtensions";
/// <summary>
/// 追加するメニューアイテムの、「VRM」メニュー内の位置。
/// </summary>
private const int Priority = 1100;
/// <summary>
/// 当エディタ拡張のバージョンを取得します。
/// </summary>
/// <returns></returns>
public static Task<string> GetVersion()
{
var request = Client.List(offlineMode: true, includeIndirectDependencies: true);
var taskCompleteSource = new TaskCompletionSource<string>();
void Handler()
{
if (!request.IsCompleted)
{
return;
}
EditorApplication.update -= Handler;
taskCompleteSource.SetResult(
request.Result.FirstOrDefault(info => info.name == "jp.pokemori.univrm-extensions").version
);
}
EditorApplication.update += Handler;
return taskCompleteSource.Task;
}
[MenuItem("VRM0/プレハブバリアントを作ってVRMプレハブ化", false, MenuItems.Priority)]
private static async void Initialize()
{
var gameObject = (GameObject)Selection.activeObject;
var animator = gameObject.GetComponent<Animator>();
if (animator == null || !animator.isHuman)
{
EditorUtility.DisplayDialog(
MenuItems.Name + "-" + await MenuItems.GetVersion(),
"HumanoidのAnimatorコンポーネントがアタッチされたGameObjectを選択した状態で実行してください。",
"OK"
);
return;
}
if (gameObject.GetComponent<VRMMeta>() != null)
{
EditorUtility.DisplayDialog(
MenuItems.Name + "-" + await MenuItems.GetVersion(),
"選択中のアバターはVRMプレハブです。",
"OK"
);
return;
}
var path = AssetUtility.CreatePrefabVariant(gameObject);
VRMInitializer.Initialize(path);
EditorUtility.DisplayDialog(
MenuItems.Name + "-" + await MenuItems.GetVersion(),
$"「{path}」へVRMプレハブを生成しました。",
"OK"
);
}
/// <summary>
/// 選択されているオブジェクトがGameObject、かつサブアセットではなければ <c>true</c> を返します。
/// </summary>
/// <returns></returns>
[MenuItem("VRM0/プレハブバリアントを作ってVRMプレハブ化", true)]
private static bool ActiveObjectIsGameObject()
{
return Selection.activeObject is GameObject gameObject && !AssetDatabase.IsSubAsset(gameObject);
}
/// <summary>
/// 選択されているアバターの変換ダイアログを開きます。
/// </summary>
[MenuItem("VRM0/Open CopyVRMSettings Wizard", false, MenuItems.Priority + 1)]
private static void OpenWizard()
{
Wizard.Open();
}
/// <summary>
/// 揺れ物の相互変換ダイアログを開きます。
/// </summary>
[MenuItem("VRM0/Open Swaying Objects Converter Wizard", false, MenuItems.Priority + 2)]
private static void OpenSwayingObjectsConverterWizard()
{
SwayingObjectsConverterWizard.Open();
}
}
}