Merge pull request #2591 from ousttrue/fix/curvemap_editor

[LookAt] VRM10ObjectLookAtEditor
This commit is contained in:
ousttrue 2025-02-27 13:05:22 +09:00 committed by GitHub
commit c240f6c3ef
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 181 additions and 54 deletions

View File

@ -59,12 +59,12 @@ namespace UniVRM10
m_showJointSettings = EditorGUILayout.Foldout(m_showJointSettings, "Joint Settings");
if (m_showJointSettings)
{
LimitBreakSlider(m_stiffnessForceProp, 0.0f, 4.0f, 0.0f, Mathf.Infinity);
LimitBreakSlider(m_gravityPowerProp, 0.0f, 2.0f, 0.0f, Mathf.Infinity);
Vrm10EditorUtility.LimitBreakSlider(m_stiffnessForceProp, 0.0f, 4.0f, 0.0f, Mathf.Infinity);
Vrm10EditorUtility.LimitBreakSlider(m_gravityPowerProp, 0.0f, 2.0f, 0.0f, Mathf.Infinity);
EditorGUILayout.PropertyField(m_gravityDirProp);
EditorGUILayout.PropertyField(m_dragForceProp);
EditorGUILayout.Space();
LimitBreakSlider(m_jointRadiusProp, 0.0f, 0.5f, 0.0f, Mathf.Infinity);
Vrm10EditorUtility.LimitBreakSlider(m_jointRadiusProp, 0.0f, 0.5f, 0.0f, Mathf.Infinity);
}
if (serializedObject.ApplyModifiedProperties())
@ -143,53 +143,6 @@ namespace UniVRM10
return jointIndex == (spring.Joints.Count - 1);
}
/// <summary>
/// スライダーと数値入力で限界値の違う、所謂「限界突破スライダー」を作成する
/// `EditorGUILayout.PropertyField` の代替として利用する
/// </summary>
private static void LimitBreakSlider(SerializedProperty property, float sliderLeft, float sliderRight, float numberLeft, float numberRight)
{
var label = new GUIContent(property.displayName);
var currentValue = property.floatValue;
var rect = EditorGUILayout.GetControlRect();
EditorGUI.BeginProperty(rect, label, property);
rect = EditorGUI.PrefixLabel(rect, label);
// slider
{
EditorGUI.BeginChangeCheck();
var sliderRect = rect;
sliderRect.width -= 55.0f;
rect.xMin += rect.width - 50.0f;
var clampedvalue = Mathf.Clamp(currentValue, sliderLeft, sliderRight);
var sliderValue = GUI.HorizontalSlider(sliderRect, clampedvalue, sliderLeft, sliderRight);
if (EditorGUI.EndChangeCheck())
{
property.floatValue = sliderValue;
}
}
// number
{
EditorGUI.BeginChangeCheck();
var numberValue = Mathf.Clamp(EditorGUI.FloatField(rect, currentValue), numberLeft, numberRight);
if (EditorGUI.EndChangeCheck())
{
property.floatValue = numberValue;
}
}
EditorGUI.EndProperty();
}
void OnSceneGUI()
{
if (m_root == null)

View File

@ -22,7 +22,7 @@ namespace UniVRM10
// for SerializedProperty
SerializedPropertyEditor m_expression;
SerializedPropertyEditor m_meta;
SerializedPropertyEditor m_lookAt;
VRM10ObjectLookAtEditor m_lookAt;
SerializedPropertyEditor m_firstPerson;
SerializedProperty m_prefab;
@ -36,7 +36,7 @@ namespace UniVRM10
m_expression = SerializedPropertyEditor.Create(serializedObject, nameof(m_target.Expression));
m_meta = VRM10MetaEditor.Create(serializedObject);
m_lookAt = SerializedPropertyEditor.Create(serializedObject, nameof(m_target.LookAt));
m_lookAt = new(serializedObject);
m_firstPerson = SerializedPropertyEditor.Create(serializedObject, nameof(m_target.FirstPerson));
m_prefab = serializedObject.FindProperty("m_prefab");

View File

@ -0,0 +1,87 @@
using UniGLTF.Extensions.VRMC_vrm;
using UnityEditor;
namespace UniVRM10
{
public class VRM10ObjectLookAtEditor
{
private readonly SerializedObject _serializedObject;
private readonly SerializedProperty _OffsetFromHead;
private readonly SerializedProperty _LookAtType;
class CurveMapEditor
{
private readonly SerializedProperty _CurveXRangeDegree;
private readonly SerializedProperty _CurveYRangeDegree;
private readonly string _name;
public CurveMapEditor(SerializedObject serializedObject, string name)
{
_CurveXRangeDegree = serializedObject.FindProperty($"LookAt.{name}.CurveXRangeDegree");
_CurveYRangeDegree = serializedObject.FindProperty($"LookAt.{name}.CurveYRangeDegree");
_name = name;
}
public void OnInspectorGUI(float yMax)
{
EditorGUILayout.LabelField(_name);
EditorGUI.indentLevel++;
Vrm10EditorUtility.LimitBreakSlider(_CurveXRangeDegree, 0, 90.0f, 0, 90.0f);
Vrm10EditorUtility.LimitBreakSlider(_CurveYRangeDegree, 0, yMax, 0, 90.0f);
EditorGUI.indentLevel--;
EditorGUILayout.Space();
}
}
private readonly CurveMapEditor _HorizontalOuter;
private readonly CurveMapEditor _HorizontalInner;
private readonly CurveMapEditor _VerticalDown;
private readonly CurveMapEditor _VerticalUp;
public VRM10ObjectLookAtEditor(SerializedObject serializedObject)
{
_serializedObject = serializedObject;
_OffsetFromHead = serializedObject.FindProperty("LookAt.OffsetFromHead");
_LookAtType = serializedObject.FindProperty("LookAt.LookAtType");
_HorizontalOuter = new(serializedObject, "HorizontalOuter");
_HorizontalInner = new(serializedObject, "HorizontalInner");
_VerticalDown = new(serializedObject, "VerticalDown");
_VerticalUp = new(serializedObject, "VerticalUp");
}
public void OnInspectorGUI()
{
EditorGUILayout.PropertyField(_OffsetFromHead);
EditorGUILayout.PropertyField(_LookAtType);
EditorGUILayout.Space();
switch ((LookAtType)_LookAtType.enumValueIndex)
{
case LookAtType.bone:
{
EditorGUILayout.HelpBox("Degree Input (0-90) => EyeBone Degree(0-90)", MessageType.Info);
_HorizontalOuter.OnInspectorGUI(90);
_HorizontalInner.OnInspectorGUI(90);
_VerticalDown.OnInspectorGUI(90);
_VerticalUp.OnInspectorGUI(90);
}
break;
case LookAtType.expression:
{
EditorGUILayout.HelpBox("Degree Input (0-90) => Expression Weight(0-1.0)", MessageType.Info);
_HorizontalOuter.OnInspectorGUI(1);
_HorizontalInner.OnInspectorGUI(1);
_VerticalDown.OnInspectorGUI(1);
_VerticalUp.OnInspectorGUI(1);
}
break;
default:
break;
}
_serializedObject.ApplyModifiedProperties();
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d31d0e4c86e078746b74b86dc473e15a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,55 @@
using UnityEditor;
using UnityEngine;
namespace UniVRM10
{
public static class Vrm10EditorUtility
{
/// <summary>
/// スライダーと数値入力で限界値の違う、所謂「限界突破スライダー」を作成する
/// `EditorGUILayout.PropertyField` の代替として利用する
/// </summary>
public static void LimitBreakSlider(SerializedProperty property, float sliderLeft, float sliderRight, float numberLeft, float numberRight)
{
var label = new GUIContent(property.displayName);
var currentValue = property.floatValue;
var rect = EditorGUILayout.GetControlRect();
EditorGUI.BeginProperty(rect, label, property);
rect = EditorGUI.PrefixLabel(rect, label);
// slider
{
EditorGUI.BeginChangeCheck();
var sliderRect = rect;
sliderRect.width -= 55.0f;
rect.xMin += rect.width - 50.0f;
var clampedvalue = Mathf.Clamp(currentValue, sliderLeft, sliderRight);
var sliderValue = GUI.HorizontalSlider(sliderRect, clampedvalue, sliderLeft, sliderRight);
if (EditorGUI.EndChangeCheck())
{
property.floatValue = sliderValue;
}
}
// number
{
EditorGUI.BeginChangeCheck();
var numberValue = Mathf.Clamp(EditorGUI.FloatField(rect, currentValue), numberLeft, numberRight);
if (EditorGUI.EndChangeCheck())
{
property.floatValue = numberValue;
}
}
EditorGUI.EndProperty();
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4b75cffea6a5f03418a9a698a32c15cb
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -7,10 +7,20 @@ namespace UniVRM10
[Serializable]
public class CurveMapper
{
[Range(20.0f, 90.0f)]
/// <summary>
/// v0.128.3 VRM10ObjectLookAtEditor
///
/// DegreeINput 0-90
/// </summary>
public float CurveXRangeDegree;
[Range(0, 90.0f)]
/// <summary>
/// v0.128.3 VRM10ObjectLookAtEditor
///
/// EyeBoneDegree 0-90
/// or
/// ExpressionWeight 0-1.0
/// </summary>
public float CurveYRangeDegree;
public CurveMapper(float xRange, float yRange)