@@ -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