您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
130 行
3.7 KiB
130 行
3.7 KiB
using System.Collections.Generic;
|
|
using UnityEditor;
|
|
using UnityEditor.EditorTools;
|
|
using UnityEngine;
|
|
|
|
#if UNITY_2021_OR_NEWER
|
|
#else
|
|
using ToolManager = UnityEditor.EditorTools.EditorTools;
|
|
#endif
|
|
|
|
namespace UniVRM10
|
|
{
|
|
[EditorTool("vrm-1.0/Expression", typeof(UniVRM10.Vrm10Instance))]
|
|
class VRM10ExpressionEditorTool : EditorTool
|
|
{
|
|
static GUIContent s_cachedIcon;
|
|
public override GUIContent toolbarIcon
|
|
{
|
|
get
|
|
{
|
|
if (s_cachedIcon == null)
|
|
{
|
|
s_cachedIcon = EditorGUIUtility.IconContent("d_Audio Mixer@2x", "|vrm-1.0 Expression");
|
|
}
|
|
return s_cachedIcon;
|
|
}
|
|
}
|
|
|
|
void OnEnable()
|
|
{
|
|
ToolManager.activeToolChanged += ActiveToolDidChange;
|
|
}
|
|
|
|
void OnDisable()
|
|
{
|
|
ToolManager.activeToolChanged -= ActiveToolDidChange;
|
|
}
|
|
|
|
void ActiveToolDidChange()
|
|
{
|
|
if (!ToolManager.IsActiveTool(this))
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
|
|
public override void OnToolGUI(EditorWindow window)
|
|
{
|
|
if (Selection.activeTransform == null)
|
|
{
|
|
return;
|
|
}
|
|
var root = Selection.activeTransform.GetComponent<Vrm10Instance>();
|
|
if (root == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Handles.BeginGUI();
|
|
if (Application.isPlaying)
|
|
{
|
|
ExpressionPreviewInPlay(root?.Vrm?.Expression, root?.Runtime.Expression);
|
|
}
|
|
else
|
|
{
|
|
EditorGUILayout.HelpBox("expression preview in play mode", MessageType.Warning);
|
|
}
|
|
Handles.EndGUI();
|
|
}
|
|
|
|
void ExpressionPreviewInPlay(VRM10ObjectExpression expression, Vrm10RuntimeExpression runtime)
|
|
{
|
|
if (expression == null)
|
|
{
|
|
EditorGUILayout.HelpBox("no expression settings", MessageType.Warning);
|
|
return;
|
|
}
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
{
|
|
GUILayout.FlexibleSpace();
|
|
|
|
// 右よせ
|
|
EditorGUILayout.BeginVertical();
|
|
{
|
|
GUILayout.FlexibleSpace();
|
|
|
|
m_map.Clear();
|
|
foreach (var kv in runtime.GetWeights())
|
|
{
|
|
var key = kv.Key;
|
|
if (kv.Key.Preset != ExpressionPreset.custom)
|
|
{
|
|
var value = ExpressionPresetSlider(expression, kv.Key.Preset, kv.Value);
|
|
m_map[key] = value;
|
|
}
|
|
}
|
|
GUILayout.FlexibleSpace();
|
|
|
|
runtime.SetWeights(m_map);
|
|
}
|
|
EditorGUILayout.EndVertical();
|
|
}
|
|
EditorGUILayout.EndHorizontal();
|
|
}
|
|
|
|
Dictionary<ExpressionKey, float> m_map = new Dictionary<ExpressionKey, float>();
|
|
static GUIStyle s_style;
|
|
static GUIStyle Style
|
|
{
|
|
get
|
|
{
|
|
if (s_style == null)
|
|
{
|
|
s_style = GUI.skin.GetStyle("box");
|
|
}
|
|
return s_style;
|
|
}
|
|
}
|
|
|
|
float ExpressionPresetSlider(VRM10ObjectExpression expression, ExpressionPreset preset, float value)
|
|
{
|
|
EditorGUILayout.BeginHorizontal(Style);
|
|
EditorGUILayout.LabelField(preset.ToString());
|
|
value = EditorGUILayout.Slider(value, 0, 1.0f);
|
|
EditorGUILayout.EndHorizontal();
|
|
return value;
|
|
}
|
|
}
|
|
}
|