-
Notifications
You must be signed in to change notification settings - Fork 433
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #541 from ousttrue/feature/backport_humanoid
1.0 からバックポート。こっちで管理する。
- Loading branch information
Showing
9 changed files
with
1,307 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,324 @@ | ||
using System.Collections; | ||
using System.Collections.Generic; | ||
using System.Linq; | ||
using System.IO; | ||
using UnityEditor; | ||
using UnityEngine; | ||
using System; | ||
|
||
namespace MeshUtility | ||
{ | ||
[CustomEditor(typeof(Humanoid))] | ||
public class HumanoidEditor : Editor | ||
{ | ||
const int LABEL_WIDTH = 100; | ||
|
||
Humanoid m_target; | ||
|
||
SerializedProperty m_Hips; | ||
#region leg | ||
SerializedProperty m_LeftUpperLeg; | ||
SerializedProperty m_RightUpperLeg; | ||
SerializedProperty m_LeftLowerLeg; | ||
SerializedProperty m_RightLowerLeg; | ||
SerializedProperty m_LeftFoot; | ||
SerializedProperty m_RightFoot; | ||
SerializedProperty m_LeftToes; | ||
SerializedProperty m_RightToes; | ||
|
||
#endregion | ||
|
||
#region spine | ||
SerializedProperty m_Spine; | ||
SerializedProperty m_Chest; | ||
SerializedProperty m_UpperChest; | ||
SerializedProperty m_Neck; | ||
SerializedProperty m_Head; | ||
SerializedProperty m_LeftEye; | ||
SerializedProperty m_RightEye; | ||
SerializedProperty m_Jaw; | ||
|
||
#endregion | ||
|
||
#region arm | ||
SerializedProperty m_LeftShoulder; | ||
SerializedProperty m_RightShoulder; | ||
SerializedProperty m_LeftUpperArm; | ||
SerializedProperty m_RightUpperArm; | ||
SerializedProperty m_LeftLowerArm; | ||
SerializedProperty m_RightLowerArm; | ||
SerializedProperty m_LeftHand; | ||
SerializedProperty m_RightHand; | ||
|
||
#endregion | ||
|
||
#region fingers | ||
SerializedProperty m_LeftThumbProximal; | ||
SerializedProperty m_LeftThumbIntermediate; | ||
SerializedProperty m_LeftThumbDistal; | ||
SerializedProperty m_LeftIndexProximal; | ||
SerializedProperty m_LeftIndexIntermediate; | ||
SerializedProperty m_LeftIndexDistal; | ||
SerializedProperty m_LeftMiddleProximal; | ||
SerializedProperty m_LeftMiddleIntermediate; | ||
SerializedProperty m_LeftMiddleDistal; | ||
SerializedProperty m_LeftRingProximal; | ||
SerializedProperty m_LeftRingIntermediate; | ||
SerializedProperty m_LeftRingDistal; | ||
SerializedProperty m_LeftLittleProximal; | ||
SerializedProperty m_LeftLittleIntermediate; | ||
SerializedProperty m_LeftLittleDistal; | ||
SerializedProperty m_RightThumbProximal; | ||
SerializedProperty m_RightThumbIntermediate; | ||
SerializedProperty m_RightThumbDistal; | ||
SerializedProperty m_RightIndexProximal; | ||
SerializedProperty m_RightIndexIntermediate; | ||
SerializedProperty m_RightIndexDistal; | ||
SerializedProperty m_RightMiddleProximal; | ||
SerializedProperty m_RightMiddleIntermediate; | ||
SerializedProperty m_RightMiddleDistal; | ||
SerializedProperty m_RightRingProximal; | ||
SerializedProperty m_RightRingIntermediate; | ||
SerializedProperty m_RightRingDistal; | ||
SerializedProperty m_RightLittleProximal; | ||
SerializedProperty m_RightLittleIntermediate; | ||
SerializedProperty m_RightLittleDistal; | ||
|
||
#endregion | ||
|
||
void OnEnable() | ||
{ | ||
m_target = target as Humanoid; | ||
m_Hips = serializedObject.FindProperty($"m_{nameof(Humanoid.Hips)}"); | ||
|
||
#region legs | ||
m_LeftUpperLeg = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftUpperLeg)}"); | ||
m_RightUpperLeg = serializedObject.FindProperty($"m_{nameof(Humanoid.RightUpperLeg)}"); | ||
m_LeftLowerLeg = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftLowerLeg)}"); | ||
m_RightLowerLeg = serializedObject.FindProperty($"m_{nameof(Humanoid.RightLowerLeg)}"); | ||
m_LeftFoot = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftFoot)}"); | ||
m_RightFoot = serializedObject.FindProperty($"m_{nameof(Humanoid.RightFoot)}"); | ||
m_LeftToes = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftToes)}"); | ||
m_RightToes = serializedObject.FindProperty($"m_{nameof(Humanoid.RightToes)}"); | ||
#endregion | ||
|
||
#region spine | ||
m_Spine = serializedObject.FindProperty($"m_{nameof(Humanoid.Spine)}"); | ||
m_Chest = serializedObject.FindProperty($"m_{nameof(Humanoid.Chest)}"); | ||
m_UpperChest = serializedObject.FindProperty($"m_{nameof(Humanoid.UpperChest)}"); | ||
m_Neck = serializedObject.FindProperty($"m_{nameof(Humanoid.Neck)}"); | ||
m_Head = serializedObject.FindProperty($"m_{nameof(Humanoid.Head)}"); | ||
m_LeftEye = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftEye)}"); | ||
m_RightEye = serializedObject.FindProperty($"m_{nameof(Humanoid.RightEye)}"); | ||
m_Jaw = serializedObject.FindProperty($"m_{nameof(Humanoid.Jaw)}"); | ||
|
||
#endregion | ||
|
||
#region arm | ||
m_LeftShoulder = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftShoulder)}"); | ||
m_RightShoulder = serializedObject.FindProperty($"m_{nameof(Humanoid.RightShoulder)}"); | ||
m_LeftUpperArm = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftUpperArm)}"); | ||
m_RightUpperArm = serializedObject.FindProperty($"m_{nameof(Humanoid.RightUpperArm)}"); | ||
m_LeftLowerArm = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftLowerArm)}"); | ||
m_RightLowerArm = serializedObject.FindProperty($"m_{nameof(Humanoid.RightLowerArm)}"); | ||
m_LeftHand = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftHand)}"); | ||
m_RightHand = serializedObject.FindProperty($"m_{nameof(Humanoid.RightHand)}"); | ||
|
||
#endregion | ||
|
||
#region fingers | ||
m_LeftThumbProximal = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftThumbProximal)}"); | ||
m_LeftThumbIntermediate = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftThumbIntermediate)}"); | ||
m_LeftThumbDistal = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftThumbDistal)}"); | ||
m_LeftIndexProximal = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftIndexProximal)}"); | ||
m_LeftIndexIntermediate = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftIndexIntermediate)}"); | ||
m_LeftIndexDistal = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftIndexDistal)}"); | ||
m_LeftMiddleProximal = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftMiddleProximal)}"); | ||
m_LeftMiddleIntermediate = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftMiddleIntermediate)}"); | ||
m_LeftMiddleDistal = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftMiddleDistal)}"); | ||
m_LeftRingProximal = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftRingProximal)}"); | ||
m_LeftRingIntermediate = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftRingIntermediate)}"); | ||
m_LeftRingDistal = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftRingDistal)}"); | ||
m_LeftLittleProximal = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftLittleProximal)}"); | ||
m_LeftLittleIntermediate = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftLittleIntermediate)}"); | ||
m_LeftLittleDistal = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftLittleDistal)}"); | ||
m_RightThumbProximal = serializedObject.FindProperty($"m_{nameof(Humanoid.RightThumbProximal)}"); | ||
m_RightThumbIntermediate = serializedObject.FindProperty($"m_{nameof(Humanoid.RightThumbIntermediate)}"); | ||
m_RightThumbDistal = serializedObject.FindProperty($"m_{nameof(Humanoid.RightThumbDistal)}"); | ||
m_RightIndexProximal = serializedObject.FindProperty($"m_{nameof(Humanoid.RightIndexProximal)}"); | ||
m_RightIndexIntermediate = serializedObject.FindProperty($"m_{nameof(Humanoid.RightIndexIntermediate)}"); | ||
m_RightIndexDistal = serializedObject.FindProperty($"m_{nameof(Humanoid.RightIndexDistal)}"); | ||
m_RightMiddleProximal = serializedObject.FindProperty($"m_{nameof(Humanoid.RightMiddleProximal)}"); | ||
m_RightMiddleIntermediate = serializedObject.FindProperty($"m_{nameof(Humanoid.RightMiddleIntermediate)}"); | ||
m_RightMiddleDistal = serializedObject.FindProperty($"m_{nameof(Humanoid.RightMiddleDistal)}"); | ||
m_RightRingProximal = serializedObject.FindProperty($"m_{nameof(Humanoid.RightRingProximal)}"); | ||
m_RightRingIntermediate = serializedObject.FindProperty($"m_{nameof(Humanoid.RightRingIntermediate)}"); | ||
m_RightRingDistal = serializedObject.FindProperty($"m_{nameof(Humanoid.RightRingDistal)}"); | ||
m_RightLittleProximal = serializedObject.FindProperty($"m_{nameof(Humanoid.RightLittleProximal)}"); | ||
m_RightLittleIntermediate = serializedObject.FindProperty($"m_{nameof(Humanoid.RightLittleIntermediate)}"); | ||
m_RightLittleDistal = serializedObject.FindProperty($"m_{nameof(Humanoid.RightLittleDistal)}"); | ||
#endregion | ||
} | ||
|
||
struct Horizontal : IDisposable | ||
{ | ||
public static Horizontal Using() | ||
{ | ||
EditorGUILayout.BeginHorizontal(); | ||
return default; | ||
} | ||
public void Dispose() | ||
{ | ||
EditorGUILayout.EndHorizontal(); | ||
} | ||
} | ||
|
||
static void HorizontalFields(string label, params SerializedProperty[] props) | ||
{ | ||
try | ||
{ | ||
EditorGUILayout.BeginHorizontal(); | ||
|
||
GUILayout.Label(label, GUILayout.Width(LABEL_WIDTH)); | ||
GUILayout.FlexibleSpace(); | ||
|
||
foreach (var prop in props) | ||
{ | ||
EditorGUILayout.PropertyField(prop, GUIContent.none, true, GUILayout.MinWidth(100)); | ||
} | ||
} | ||
finally | ||
{ | ||
EditorGUILayout.EndHorizontal(); | ||
} | ||
} | ||
|
||
static bool s_spineFold; | ||
static bool s_legFold; | ||
static bool s_armFold; | ||
static bool s_fingerFold; | ||
static string GetDialogDir(UnityEngine.Object obj) | ||
{ | ||
var prefab = PrefabUtility.GetCorrespondingObjectFromSource(obj); | ||
if (prefab is null) | ||
{ | ||
return null; | ||
} | ||
return UnityPath.FromAsset(prefab).FullPath; | ||
} | ||
|
||
public override void OnInspectorGUI() | ||
{ | ||
foreach (var validation in m_target.Validate()) | ||
{ | ||
EditorGUILayout.HelpBox(validation.Message, validation.IsError ? MessageType.Error : MessageType.Warning); | ||
} | ||
|
||
// prefer | ||
serializedObject.Update(); | ||
|
||
EditorGUILayout.PropertyField(m_Hips); | ||
|
||
s_spineFold = EditorGUILayout.Foldout(s_spineFold, "Body"); | ||
if (s_spineFold) | ||
{ | ||
EditorGUILayout.PropertyField(m_Spine); | ||
EditorGUILayout.PropertyField(m_Chest); | ||
EditorGUILayout.PropertyField(m_UpperChest); | ||
EditorGUILayout.PropertyField(m_Neck); | ||
EditorGUILayout.PropertyField(m_Head); | ||
EditorGUILayout.PropertyField(m_Jaw); | ||
HorizontalFields("Eye", m_LeftEye, m_RightEye); | ||
} | ||
|
||
s_legFold = EditorGUILayout.Foldout(s_legFold, "Leg"); | ||
if (s_legFold) | ||
{ | ||
HorizontalFields("UpperLeg", m_LeftUpperLeg, m_RightUpperLeg); | ||
HorizontalFields("LowerLeg", m_LeftLowerLeg, m_RightLowerLeg); | ||
HorizontalFields("Foot", m_LeftFoot, m_RightFoot); | ||
HorizontalFields("Toes", m_LeftToes, m_RightToes); | ||
} | ||
|
||
s_armFold = EditorGUILayout.Foldout(s_armFold, "Arm"); | ||
if (s_armFold) | ||
{ | ||
HorizontalFields("Shoulder", m_LeftShoulder, m_RightShoulder); | ||
HorizontalFields("UpperArm", m_LeftUpperArm, m_RightUpperArm); | ||
HorizontalFields("LowerArm", m_LeftLowerArm, m_RightLowerArm); | ||
HorizontalFields("Hand", m_LeftHand, m_RightHand); | ||
} | ||
|
||
s_fingerFold = EditorGUILayout.Foldout(s_fingerFold, "Finger"); | ||
if (s_fingerFold) | ||
{ | ||
HorizontalFields("LeftThumb", m_LeftThumbProximal, m_LeftThumbIntermediate, m_LeftThumbDistal); | ||
HorizontalFields("LeftIndex", m_LeftIndexProximal, m_LeftIndexIntermediate, m_LeftIndexDistal); | ||
HorizontalFields("LeftMiddle", m_LeftMiddleProximal, m_LeftMiddleIntermediate, m_LeftMiddleDistal); | ||
HorizontalFields("LeftRing", m_LeftRingProximal, m_LeftRingIntermediate, m_LeftRingDistal); | ||
HorizontalFields("LeftLittle", m_LeftLittleProximal, m_LeftLittleIntermediate, m_LeftLittleDistal); | ||
HorizontalFields("RightThumb", m_RightThumbProximal, m_RightThumbIntermediate, m_RightThumbDistal); | ||
HorizontalFields("RightIndex", m_RightIndexProximal, m_RightIndexIntermediate, m_RightIndexDistal); | ||
HorizontalFields("RightMiddle", m_RightMiddleProximal, m_RightMiddleIntermediate, m_RightMiddleDistal); | ||
HorizontalFields("RightRing", m_RightRingProximal, m_RightRingIntermediate, m_RightRingDistal); | ||
HorizontalFields("RightLittle", m_RightLittleProximal, m_RightLittleIntermediate, m_RightLittleDistal); | ||
} | ||
|
||
serializedObject.ApplyModifiedProperties(); | ||
|
||
// create avatar | ||
if (GUILayout.Button("Create UnityEngine.Avatar")) | ||
{ | ||
var path = EditorUtility.SaveFilePanel( | ||
"Save avatar", | ||
GetDialogDir(m_target), | ||
string.Format("{0}.avatar.asset", serializedObject.targetObject.name), | ||
"asset"); | ||
if (!string.IsNullOrEmpty(path)) | ||
{ | ||
var avatar = m_target.CreateAvatar(); | ||
if (avatar != null) | ||
{ | ||
var unityPath = UnityPath.FromFullpath(path); | ||
avatar.name = "avatar"; | ||
Debug.LogFormat("Create avatar {0}", unityPath); | ||
AssetDatabase.CreateAsset(avatar, unityPath.Value); | ||
AssetDatabase.ImportAsset(unityPath.Value); | ||
|
||
// replace | ||
var animator = m_target.GetComponent<Animator>(); | ||
if (animator == null) | ||
{ | ||
animator = m_target.gameObject.AddComponent<Animator>(); | ||
} | ||
animator.avatar = avatar; | ||
|
||
Selection.activeObject = avatar; | ||
} | ||
} | ||
} | ||
} | ||
|
||
void OnSceneGUI() | ||
{ | ||
// var bones = m_target.Bones; | ||
// if (bones != null) | ||
// { | ||
// for (int i = 0; i < bones.Length; ++i) | ||
// { | ||
// DrawBone((HumanBodyBones)i, bones[i]); | ||
// } | ||
// foreach (var x in m_bones) | ||
// { | ||
// x.Draw(); | ||
// } | ||
// } | ||
|
||
var forward = m_target.GetForward(); | ||
|
||
var begin = m_target.transform.position; | ||
var end = begin + forward; | ||
Handles.DrawLine(begin, end); | ||
} | ||
} | ||
} |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Oops, something went wrong.