質問するログイン新規登録

回答編集履歴

1

アニメーションの作りについて追記

2021/06/13 13:28

投稿

Bongo
Bongo

スコア10816

answer CHANGED
@@ -94,4 +94,70 @@
94
94
 
95
95
  動かしてみたところどうやら正常に動作しているようで、キャラクターが地面にめり込んでしまうような様子はありませんでした。
96
96
 
97
- ![図3](a5096c3ca27c934ae7d6ea1a320bc385.gif)
97
+ ![図3](a5096c3ca27c934ae7d6ea1a320bc385.gif)
98
+
99
+ ##キャラクターのアニメーションについて
100
+
101
+ キャラクターオブジェクトのベースにしたのは、Prefabsフォルダ内のSD_unitychan_humanoidプレハブです。これにはすでに体の各部位に`SpringBone`や`SpringCollider`が仕込まれており、オブジェクトの動きに応じて部位が揺れるようになっています。
102
+ これの`Animator`については前述のようにApply Root Motionをオフにし、Controllerを後述の「UnitychanGalaxyMotion」に差し替えました。
103
+ また、アタッチされているスクリプト類のうち`SpringManager`以外は削除して、代わりに`FaceDisabler`をアタッチしました。
104
+ これは下記のように「`OnCallChangeFace`メッセージを受信しても何もしない」というだけのものです。
105
+
106
+ ```lang-csharp
107
+ using UnityEngine;
108
+
109
+ public class FaceDisabler : MonoBehaviour
110
+ {
111
+ public void OnCallChangeFace(string _)
112
+ {
113
+ }
114
+ }
115
+ ```
116
+
117
+ ![図4](b13a9da77c5385b676dbcb44286f55fc.png)
118
+
119
+ ユニティちゃんのアニメーションクリップの中には表情変化のために`OnCallChangeFace`イベントを発生させるものがあります。今回のアニメーションには表情変化は組み込んでおらず、処置なしだと`OnCallChangeFace`イベントの受信者が存在しないのですが、それだとイベント発生時にエラーメッセージが出てうっとうしいためこのような処置を加えました。
120
+
121
+ 次にアニメーションクリップを用意します。Animationsフォルダ内のSD_unitychan_motion_humanoidにさまざまな動きが収録されており、地上の姿勢についてはStanding@loop、Walking@loop、Running@loopの3つでまかなえるのですが、空中の姿勢についてはちょっとカスタマイズしたかったため少々手を加えました。
122
+
123
+ まず空を飛んでいる姿勢については「[【Unity】FBXに格納されたAnimationClipを取り出し編集可能にする - テラシュールブログ](https://tsubakit1.hateblo.jp/entry/2015/06/01/235939)」で紹介されている方法と同様の手順で「TopOfJump」を複製し、「UnitychanTop」と名前を変更し、下図のように設定を変更しました。
124
+
125
+ ![図5](aaef37eda8a851417a9dd9f12bad4b2f.png)
126
+
127
+ 着地姿勢については、すみませんが具体的なフレーム番号範囲は忘れてしまったのですが「[アニメーションクリップの抽出 - Unity マニュアル](https://docs.unity3d.com/ja/current/Manual/Splittinganimations.html)」の手順に従って「TopToGround」のモーションのうち爪先が地面に触れてから姿勢を正すまでのモーションを切り出し、同じく複製して「UnitychanTopToGround」という名前にした上で下図のように設定しました。
128
+
129
+ ![図6](67a6f3f86dbf95c13da3fd84732423bf.gif)
130
+
131
+ そしてアニメーターコントローラーを作成します。名前は前述のように「UnitychanGalaxyMotion」とし、ベースレイヤーのみで表情用レイヤーは持っていません。下図のようにパラメーターとしてFloat型のSpeed、Bool型のOnGroundを持っています。
132
+
133
+ ![図7](2287966f9ac2eb6252875bfad712600c.png)
134
+
135
+ Groundedステートは地上にいる時の状態であり、ブレンドツリーになっています。
136
+
137
+ ![図8](e61d72ae1ac1f39efce5560a806fb7e3.png)
138
+
139
+ 下図のようにSpeedに応じてStanding@loop、Walking@loop、Running@loopを混合するようになっています。
140
+
141
+ ![図9](9e8d643c04c6faf473d6f6e8cde802b5.png)
142
+
143
+ Groundedステートにいる時にOnGroundが`false`になるとTopステートに遷移します。
144
+
145
+ ![図10](fe81c1ce71629dd047be869e92b9ff61.png)
146
+
147
+ Topステートは空中の姿勢で...
148
+
149
+ ![図11](9bf64f4c7f63f27c36438f2dae9c0e17.png)
150
+
151
+ Topステートにいる時にOnGroundが`true`になるとTopToGroundステートに遷移します。
152
+
153
+ ![図12](7b87f562ec582743336f881ee5e05faf.png)
154
+
155
+ TopToGroundステートが着地時に脚を屈曲させる動きで...
156
+
157
+ ![図13](251bc5291855bd27eb1a55216a69c4de.png)
158
+
159
+ 再生後にGroundedステートに遷移します。
160
+
161
+ ![図14](84a8e5d97d263bbb12fe744945947b65.png)
162
+
163
+ 以上のようにセットアップされたアニメーターコントローラーを、シーン上のキャラクターの`Animator`のControllerにセットしました。