Skip to content

Commit ea9b4b4

Browse files
committed
Merge pull request #31 from eral/BugFixOfIndirectBoneSearchMistake
AvatarSettingScript:腕水平化に於いて、間接が正しく選択されない場合がある不具合の修正
2 parents c67aa13 + 7f8a9b5 commit ea9b4b4

File tree

1 file changed

+28
-23
lines changed

1 file changed

+28
-23
lines changed

Editor/MMDLoader/Private/AvatarSettingScript.cs

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -84,27 +84,28 @@ void SetRequirePose()
8484
}
8585

8686
/// <summary>
87-
/// 対象のボーンの中からより深く枝分かれする子ボーンを選び出す
88-
/// 剛体用ボーンじゃないきちんとしたボーンを選び出すために使う
87+
/// 特定の名前を持つボーンを先代から選び出す
8988
/// </summary>
90-
/// <param name="transform">対象のボーン</param>
91-
/// <returns>さらに枝分かれする子ボーン</returns>
92-
Transform SelectBranchedChildWhereManyChildren(Transform transform)
89+
/// <param name="transform">基点のボーン</param>
90+
/// <param name="name">対象のボーン名</param>
91+
/// <returns>対象の先代ボーン</returns>
92+
/// <remarks>
93+
/// 基点ボーンが探索名なら基点ボーンを返す。
94+
/// </remarks>
95+
static Transform FindTransformUpwards(Transform transform, string name)
9396
{
94-
Transform[] children = new Transform[transform.childCount];
95-
if (children.Length <= 0) Debug.LogError(transform.name + "の子がないので落ちるのです!");
96-
for (int i = 0; i < transform.childCount; i++)
97-
children[i] = transform.GetChild(i);
98-
int max = children.Max(x => x.childCount);
99-
return children.Where(x => x.childCount == max).First();
97+
while ((null != transform) && (transform.name != name)) {
98+
transform = transform.parent;
99+
}
100+
return transform;
100101
}
101102

102103
/// <summary>
103104
/// 親子関係を見てボーンを水平にする
104105
/// </summary>
105106
/// <param name="transform">対象のボーン</param>
106107
/// <returns>Z軸のみを回転させるQuaternion</returns>
107-
Quaternion ResetHorizontalPose(Transform transform, Transform child_transform)
108+
static Quaternion ResetHorizontalPose(Transform transform, Transform child_transform)
108109
{
109110
// ボーンの向きを取得
110111
var bone_vector = child_transform.position - transform.position;
@@ -122,14 +123,17 @@ Quaternion ResetHorizontalPose(Transform transform, Transform child_transform)
122123
}
123124

124125
/// <summary>
125-
/// 腕全体を平行にする処理
126+
/// 腕全体を水平にする処理
126127
/// </summary>
127-
/// <param name="shoulder">肩ボーン</param>
128-
void StartResettingHorizontal(Transform shoulder)
128+
/// <param name="wrist">手首ボーン</param>
129+
/// <param name="hinge_name">ひじボーン名</param>
130+
/// <param name="arm_name">腕ボーン名</param>
131+
/// <param name="shoulder_name">肩ボーン名</param>
132+
static void StartResettingHorizontal(Transform wrist, string hinge_name, string arm_name, string shoulder_name)
129133
{
130-
var arm = SelectBranchedChildWhereManyChildren(shoulder);
131-
var hinge = SelectBranchedChildWhereManyChildren(arm);
132-
var wrist = SelectBranchedChildWhereManyChildren(hinge);
134+
var hinge = FindTransformUpwards(wrist, hinge_name);
135+
var arm = FindTransformUpwards(hinge, arm_name);
136+
var shoulder = FindTransformUpwards(arm, shoulder_name);
133137
shoulder.transform.localRotation = ResetHorizontalPose(shoulder, arm);
134138
arm.transform.localRotation = ResetHorizontalPose(arm, hinge);
135139
hinge.transform.localRotation = ResetHorizontalPose(hinge, wrist);
@@ -142,9 +146,11 @@ void StartResettingHorizontal(Transform shoulder)
142146
void SetRequirePose(Transform transform)
143147
{
144148
switch (transform.name) {
145-
case "左肩": goto case "右肩";
146-
case "右肩": //Tポーズにする為に腕を持ち上げる
147-
StartResettingHorizontal(transform);
149+
case "左手首": //Tポーズにする為に腕を持ち上げる
150+
StartResettingHorizontal(transform, "左ひじ", "左腕", "左肩");
151+
break;
152+
case "右手首": //Tポーズにする為に腕を持ち上げる
153+
StartResettingHorizontal(transform, "右ひじ", "右腕", "右肩");
148154
break;
149155
case "腰": goto case "センター";
150156
case "センター":
@@ -172,8 +178,7 @@ void SetRequirePose(Transform transform)
172178
/// <returns>true:ボーンが存在する, false:ボーンが存在しない</returns>
173179
/// <param name='name'>ボーン名</param>
174180
bool HasBone(string name) {
175-
int count = bones_.Where(x=>x.name == name).Count();
176-
return 0 < count;
181+
return bones_.Any(x=>x.name == name);
177182
}
178183

179184
/// <summary>

0 commit comments

Comments
 (0)