Streamingle_URP/Assets/Scripts/KindRetargeting/Editor/LimbWeightControllerEditor.cs
2025-12-01 03:36:18 +09:00

214 lines
9.8 KiB
C#

using UnityEngine;
using UnityEditor;
namespace KindRetargeting
{
[CustomEditor(typeof(LimbWeightController))]
public class LimbWeightControllerEditor : BaseRetargetingEditor
{
SerializedProperty maxDistance;
SerializedProperty minDistance;
SerializedProperty weightSmoothSpeed;
SerializedProperty middleWeightMultiplier;
SerializedProperty hipsMinDistance;
SerializedProperty hipsMaxDistance;
SerializedProperty props;
SerializedProperty characterRoot;
SerializedProperty groundHipsMinHeight;
SerializedProperty groundHipsMaxHeight;
SerializedProperty footHeightMinThreshold;
SerializedProperty footHeightMaxThreshold;
SerializedProperty enableLeftArmIK;
SerializedProperty enableRightArmIK;
SerializedProperty chairSeatHeightOffset;
private bool showDistanceSettings = true;
private bool showWeightSettings = true;
private bool showHipsSettings = true;
private bool showReferences = true;
private bool showGroundHipsSettings = true;
private bool showFootHeightSettings = true;
private bool showIKActivationSettings = true;
private bool showChairSeatSettings = true;
protected override void OnEnable()
{
base.OnEnable();
// SerializedProperty들 초기화
if (serializedObject != null)
{
maxDistance = serializedObject.FindProperty("maxDistance");
minDistance = serializedObject.FindProperty("minDistance");
weightSmoothSpeed = serializedObject.FindProperty("weightSmoothSpeed");
middleWeightMultiplier = serializedObject.FindProperty("middleWeightMultiplier");
hipsMinDistance = serializedObject.FindProperty("hipsMinDistance");
hipsMaxDistance = serializedObject.FindProperty("hipsMaxDistance");
props = serializedObject.FindProperty("props");
characterRoot = serializedObject.FindProperty("characterRoot");
groundHipsMinHeight = serializedObject.FindProperty("groundHipsMinHeight");
groundHipsMaxHeight = serializedObject.FindProperty("groundHipsMaxHeight");
footHeightMinThreshold = serializedObject.FindProperty("footHeightMinThreshold");
footHeightMaxThreshold = serializedObject.FindProperty("footHeightMaxThreshold");
enableLeftArmIK = serializedObject.FindProperty("enableLeftArmIK");
enableRightArmIK = serializedObject.FindProperty("enableRightArmIK");
chairSeatHeightOffset = serializedObject.FindProperty("chairSeatHeightOffset");
}
}
public override void OnInspectorGUI()
{
if (serializedObject == null || target == null)
return;
serializedObject.Update();
EditorGUI.BeginChangeCheck();
EditorGUILayout.Space(10);
GUI.backgroundColor = new Color(0.8f, 0.9f, 1f);
showIKActivationSettings = EditorGUILayout.Foldout(showIKActivationSettings, "IK 활성화 설정", true);
if (showIKActivationSettings)
{
EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(enableLeftArmIK, new GUIContent("왼팔 IK 활성화"));
EditorGUILayout.PropertyField(enableRightArmIK, new GUIContent("오른팔 IK 활성화"));
EditorGUI.indentLevel--;
}
EditorGUILayout.Space(5);
showDistanceSettings = EditorGUILayout.Foldout(showDistanceSettings, "거리 기반 가중치 설정", true);
if (showDistanceSettings)
{
EditorGUI.indentLevel++;
// 일반 거리 범위 슬라이더
float minVal = minDistance.floatValue;
float maxVal = maxDistance.floatValue;
EditorGUILayout.LabelField("거리 범위 (가중치 1 -> 0)");
EditorGUILayout.BeginHorizontal();
minVal = EditorGUILayout.FloatField(minVal, GUILayout.Width(50));
EditorGUILayout.MinMaxSlider(ref minVal, ref maxVal, 0f, 1f);
maxVal = EditorGUILayout.FloatField(maxVal, GUILayout.Width(50));
EditorGUILayout.EndHorizontal();
minDistance.floatValue = minVal;
maxDistance.floatValue = maxVal;
EditorGUI.indentLevel--;
}
EditorGUILayout.Space(5);
showWeightSettings = EditorGUILayout.Foldout(showWeightSettings, "가중치 변화 설정", true);
if (showWeightSettings)
{
EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(weightSmoothSpeed, new GUIContent("가중치 변화 속도"));
EditorGUI.indentLevel--;
}
EditorGUILayout.Space(5);
showHipsSettings = EditorGUILayout.Foldout(showHipsSettings, "허리 가중치 설정", true);
if (showHipsSettings)
{
EditorGUI.indentLevel++;
// 허리 거리 범위 슬라이더
float hipsMin = hipsMinDistance.floatValue;
float hipsMax = hipsMaxDistance.floatValue;
EditorGUILayout.LabelField("허리 거리 범위 (가중치 1 -> 0)");
EditorGUILayout.BeginHorizontal();
hipsMin = EditorGUILayout.FloatField(hipsMin, GUILayout.Width(50));
EditorGUILayout.MinMaxSlider(ref hipsMin, ref hipsMax, 0f, 1f);
hipsMax = EditorGUILayout.FloatField(hipsMax, GUILayout.Width(50));
EditorGUILayout.EndHorizontal();
hipsMinDistance.floatValue = hipsMin;
hipsMaxDistance.floatValue = hipsMax;
EditorGUI.indentLevel--;
}
EditorGUILayout.Space(5);
showGroundHipsSettings = EditorGUILayout.Foldout(showGroundHipsSettings, "바닥 기준 히프 보정 설정", true);
if (showGroundHipsSettings)
{
EditorGUI.indentLevel++;
// 바닥 기준 히프 거리 범위 슬라이더
float groundMin = groundHipsMinHeight.floatValue;
float groundMax = groundHipsMaxHeight.floatValue;
EditorGUILayout.LabelField("바닥 기준 히프 높이 범위 (가중치 0 -> 1)");
EditorGUILayout.BeginHorizontal();
groundMin = EditorGUILayout.FloatField(groundMin, GUILayout.Width(50));
EditorGUILayout.MinMaxSlider(ref groundMin, ref groundMax, 0f, 2f);
groundMax = EditorGUILayout.FloatField(groundMax, GUILayout.Width(50));
EditorGUILayout.EndHorizontal();
groundHipsMinHeight.floatValue = groundMin;
groundHipsMaxHeight.floatValue = groundMax;
EditorGUI.indentLevel--;
}
EditorGUILayout.Space(5);
showFootHeightSettings = EditorGUILayout.Foldout(showFootHeightSettings, "발 높이 기반 가중치 설정", true);
if (showFootHeightSettings)
{
EditorGUI.indentLevel++;
// 발 높이 범위 슬라이더
float footMin = footHeightMinThreshold.floatValue;
float footMax = footHeightMaxThreshold.floatValue;
EditorGUILayout.LabelField("발 높이 범위 (가중치 1 -> 0)");
EditorGUILayout.BeginHorizontal();
footMin = EditorGUILayout.FloatField(footMin, GUILayout.Width(50));
EditorGUILayout.MinMaxSlider(ref footMin, ref footMax, 0.1f, 1f);
footMax = EditorGUILayout.FloatField(footMax, GUILayout.Width(50));
EditorGUILayout.EndHorizontal();
footHeightMinThreshold.floatValue = footMin;
footHeightMaxThreshold.floatValue = footMax;
EditorGUI.indentLevel--;
}
EditorGUILayout.Space(5);
showChairSeatSettings = EditorGUILayout.Foldout(showChairSeatSettings, "의자 앉기 높이 설정", true);
if (showChairSeatSettings)
{
EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(chairSeatHeightOffset, new GUIContent("좌석 높이 오프셋", "의자에 앉을 때 엉덩이가 좌석면에서 떠있는 높이 (월드 Y 기준)"));
EditorGUI.indentLevel--;
}
EditorGUILayout.Space(5);
showReferences = EditorGUILayout.Foldout(showReferences, "참조 설정", true);
if (showReferences)
{
EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(props, new GUIContent("프랍 오브젝트"));
EditorGUILayout.PropertyField(characterRoot, new GUIContent("캐릭터 루트"));
EditorGUI.indentLevel--;
}
if (EditorGUI.EndChangeCheck())
{
MarkDirty();
// 연관된 컴포넌트들도 업데이트
var script = (LimbWeightController)target;
var retargeting = script.GetComponent<CustomRetargetingScript>();
if (retargeting != null)
{
EditorUtility.SetDirty(retargeting);
var window = EditorWindow.GetWindow<RetargetingControlWindow>();
if (window != null)
{
window.Repaint();
}
}
}
}
}
}