【Unity】SDユニティちゃんを動かす!(Unity4) 
2015/02/21 Sat [edit]
SDサイズもなかなか可愛いね。ただ、通常サイズみたいに初めから動かせるプレハブがあったら良いのだけど、Locomotion(移動)系の Animator は入ってなかったので(掲載時点SD:ユニティちゃんVer1.0)、今回は簡単なものを自作して動かしてみる。あくまでも在り合わせなものなので、細かい調整は各自でやるという感じで。
(※) Unity 4.6.1f2 / Windows8.1(x64) で確認
■インポート等前準備とセットアップ
1.まずはユニティちゃんのオフィシャルサイト(http://unity-chan.com/)からモデルをダウンロード。上部メニューの「DATA DOWNLOAD」からライセンス承諾後、パッケージをダウンロードできる。
2.新しいプロジェクトを作ったら、ダウンロードしたパッケージ(SD_unitychan.unitypackage)を「Assets>Import Package>Custom Package...」から、またはプロジェクトエクスプローラにドラッグ&ドロップでインポート。

3.とりあえず動き回れる床を作りたいので、「GameObject」メニューから「Plane」を作る。床のテクスチャなどは以前の方法と同じ。適当で良い。
(※) Unity5.5 は「Plane」だと床にキャラが埋まることがあるので、「Cube」の方が良いかも知れない。



4.このままだと真っ暗なので、プロジェクトエクスプローラから「UnityChan>Prefabs」にある「Directinal light for UnityChan」を Hierarchy にドラッグ&ドロップする。設定はデフォルトでいい感じになる。
(※) Unity5 では初期配置されている Directional Light でも良い(シェーダーのパッチを当てる)。

5.次に、SDユニティちゃんの 3Dモデルを配置する。プロジェクトエクスプローラから「UnityChan>SD_unitychan>Models」フォルダの中にある「SD_unitychan_humanoid」をヒエラルキーにドラッグ&ドロップしよう。「~_generic」となっているものでも別に良いが、どちらかというと古いUnity のバージョンとの互換用(?)という感じなので、新しく作る場合は基本的に「~_humanoid」「~_hmd」となっているものを使った方が良い。ちなみに「Prefabs」フォルダに入っているプレファブはポーズやモーションなどが色々見られるようにできているので、試してみるのも良いかもしれない(移動はしない)。
(※) 最新のバージョンには「~_dynamic」(揺れ物セットアップ済)が入っているので、それを使った方が良い(髪などがなびく)。また大体のセットアップが初めから設定されている。


6.移動させるためには配置した「SD_unitychan_humanoid」にスクリプトを追加する。「Component」メニューから「Scripts>UnityChan>Unity Chan Control Script With Rgid Body」を追加すれば、いくつかのコンポーネントも自動的に追加される。また「Capsule Collider」の「Y」「Radius」 と「Rigidbody」の「Constraints>Freeze Rotation」だけは調整しておこう。そのままシーンを再生してみればわかるが、調整しないと床と突き抜けたり、浮いた感じになったり、動かすとコケたりする(笑)。

7.あとこのままだとちょっとカメラが遠いのと、カメラは固定でユニティちゃんが画面からはみ出たりすると見えなくなってしまうので、カメラをキャラに追従させたい。超簡単な方法は「Main Camera」を「SD_unitychan_humanoid」の子要素にしてしまう方法だ。ヒエラルキーで「Main Camera」を「SD_unitychan_humanoid」にドラッグ&ドロップして、カメラの位置を調整するだけで良い。こうするとユニティちゃんと一緒にカメラも動く。ここではアングルを正面からにしてみた。シーンは適当な名前で保存しておく。



(※) カメラ追従はプロジェクトエクスプローラで「UnityChan>Scripts」フォルダに「CameraController」があるので、「Main Camera」に組み込んでも良い(「Component」メニューの「Script」で「CameraController」を追加)。Inspector で「Focus Obj」に Hierarchy の「SD_unitychan_humanoid」をドラッグ&ドロップすれば追従できる。また「Focus」のパラメタでカメラの中心を調整できる。これを使えばホイールでズームイン・アウトもできる。
(※) SmoothFollow に回転アングルと距離の遠近機能を付けたものを使っても良い。
■アニメーターを作る(or ダウンロード)
これで動くには動いたが、残念ながらアニメーションしないので、簡単な Animator を作ることにしよう。Animator とは 複数の Animation を遷移させるものと考えれば良い。
1.プロジェクトエクスプローラで「UnityChan>SD_unitychan>Animators」フォルダを開き、「SD_unitychan_motion_humanoid.controller」を[Ctrl - D](Duplicate)で複製しよう。名前は適当に「SD_unitychan_locomotion」としておいた。これを配置した「SD_unitychan_humanoid」の Animator の「Controller」に設定する。「Apply Root Motion」 は外しておいた方が良いかも知れない。自分で作るのが面倒な人はサンプルを用意したので、ダウンロードして使って欲しい。



2.作ったファイルをダブルクリックすると「Animator」タブが開くが、この「BaseLayer」を作り直すことにする。「face」レイヤーはそのままで良い(あとで表情をスクリプトで変化させるのに使う)。マウスで全てを選択し、[Delete]キーで削除してしまおう。確認ダイアログで[Delete]を押せば消える。またパラメタも必要ないので、名前の右にある「-」ボタンを押して消してしまおう。
(※) サンプルのアニメーターをダウンロードして使う場合は「目パチを付ける」まで読み飛ばしても良い。
(※) 画面からはみ出て見にくいときは、[Alt + ドラッグ](Windows)で画面を移動できる。

3.消し終わったら、右クリックから「Create State>Empty」で新しいステートを作る。インスペクターで名前を「Idle」にし、「Motion」から「Standing@loop」(~_humanoid の方)を選択する。ちなみに一番初めに作ったオレンジ色はデフォルトステート(アニメーション)となる(右クリックの「Set As Default」で変更できる)。また緑色の「Any State」はすべてのステートからの遷移や情報に使うが、今回は使わないので端に追いやっても良い。


4.同じように「Locomotion」「Jump」「WalkBack」のステートを作る。「Motion」はそれぞれ「~_humanoid」の方を選んでおく。

●走るモーション

●ジャンプモーション

●歩くモーション

ちなみにステートの名前は「UnityChan>Scripts」にある「UnityChanControlScriptWithRgidBody.cs」を MonoDevelop などテキストエディタで開いて以下の部分に合わせたものだ(今回 Rest は使ってない。また WalkBack は Locomotion の負の向きとして使っている)。このスクリプトを利用して動かすので、開きながら作るとわかりやすい。
●UnityChanControlScriptWithRgidBody.cs を MonoDevelop で開く
// アニメーター各ステートへの参照
static int idleState = Animator.StringToHash ("Base Layer.Idle");
static int locoState = Animator.StringToHash ("Base Layer.Locomotion");
static int jumpState = Animator.StringToHash ("Base Layer.Jump");
static int restState = Animator.StringToHash ("Base Layer.Rest");
5.次にスクリプトから使うパラメータを作ろう。画面左下にある「Parameters」の右にある「+」を押せば追加できる。「Speed」「Direction」「JumpHeight」「GravityControl」は「Float」型、「Jump」「Rest」は「Bool」型で作る。これもスクリプトに合わせたものだ。「UnityChanControlScriptWithRgidBody.cs」をテキストエディタで「anim.」で検索すれば、スクリプトで制御しているものがわかる。無いとエラーが出たりするので、使わないものでもとりあえず登録しておいた方が良い。
(※)「SendMessage setCameraPositionJumpView has no receiver!」というエラーは「cameraObject.SendMessage ("setCameraPositionJumpView");」という行を検索し、コメントアウトすれば出なくなる。

●検索するといくつか Animator を制御してる部分が見つかる
private Animator anim;
anim.SetFloat ("Speed", v);
anim.SetFloat ("Direction", h);
anim.SetBool ("Jump", true);
anim.SetBool ("Rest", true);
float gravityControl = anim.GetFloat ("GravityControl");
float jumpHeight = anim.GetFloat ("JumpHeight");
・・・(他いろいろ)・・・
6.パラメタを作成し終わったら、次に遷移を作ろう。「Idle」ステートを右クリックして「Make Transition」をすると、ニョキっと矢印が伸びるので、それをそのまま「Locomotion」まで引っ張ってクリックして接続する。そしてその矢印をクリックするとインスペクターに遷移条件が出てくる。「Exit Time」は「時間が過ぎたら」なので、「Speed」に変更し、「Greater」(大きくなったら)になっていることを確認したら、値を「0.1」にする。この値は通常サイズのユニティちゃんの設定を参考にしているだけなので、あとで自分で調整するのも良いだろう。


7.今度は逆に「Locomotion」の方から「Make Transition」して、「Idle」に接続しよう。遷移条件は「Speed」にして、「Less」(小さくなったら)に変更し、値を「0.1」にする。つまりスクリプトと連携で「Speed が 0.1 を超えると走りだし、0.1 を下回ると停止する」ようにキー操作で値を設定すれば、遷移できるわけだ。スクリプトははじめからそのように書かれている。ここまでで一旦保存し、シーンを再生して、[↑]キーを押せば、ユニティちゃんが動いたと思う。
(※)「'SD_unitychan_humanoid' AnimationEvent 'OnCallChangeFace' has no receiver! Are you missing a component?」というエラーが出るが、とりあえず無視で。

●「Locomotion」→「Idle」へ

8.あとは要領は同じだ。「Idle」と「WalkBack」も「Make Transition」しよう。遷移条件も「Speed」で、負の値で設定する。これでシーンを再生すると、[↓]キーで、ユニティちゃんが後退できる。ただしモーションが前進用なので、ムーンウォークみたいになっているのは大目に見て欲しい(笑)。余力があったら3Dアニメーションソフト等でアニメーションクリップを作って、すげ替えるのも良いだろう。
(※) ステートをクリックしたときのインスペクタで、再生速度(Speed)を -1 (負の値) にする方法もある。

●「Idle」→「WalkBack」へ

●「WalkBack」→「Idle」へ

9.最後に「Locomotion」と「Jump」を「Make Transition」する。遷移条件は「Jump」が「true」のときジャンプし、しばらくすれば元に戻る感じにするので、「Jump→Locomotion」は「Exit Time」のままにする。これでシーンを再生すると、走行中のみ[Space]キーで、ユニティちゃんがジャンプするようになる(スクリプトで制御されている)。

●「Locomotion」→「Jump」へ

発展として、停止状態(Idle)からジャンプの遷移を作っても良いが、「UnityChanControlScriptWithRgidBody.cs」ソースを見ると以下の条件文があるので、このあたりを書き直さないと上手くいかない。今回は割愛するので、自分で色々改造してみると良いだろう。
●UnityChanControlScriptWithRgidBody.cs の条件文
//アニメーションのステートがLocomotionの最中のみジャンプできる
if (currentBaseState.nameHash == locoState) {
・・・(略)・・・
}
10.動かしてみると、ジャンプした後、走るモーションに移る時間が少し長いので、滑っている感じがするね。「Jump→Locomotion」の矢印をクリックしてインスペクターでタイミングを調整しよう。遷移のタイムラインの▼印をドラッグすれば変化具合が調整できる。値は考えないで色々試してみると良い。まだまだ粗が目立つが、とりあえずここまでで最低限の操作ができるようになった。

●「Jump」→「Locomotion」のインスペクター

■目パチを付ける
動かして気になるのは、停止しているとき目パチが無いので、ちょっと寂しい感じがする事だろう。幸いなことに専用スクリプトが付いているので、ヒエラルキーで「SD_unitychan_humanoid」を選択して「Component>Scripts>UnityChan>Auto Blinkfor SD」でキャラに追加する。インスペクターで「Ref_face」を「_face」に設定すれば完了だ。再生して確かめてみよう。うん、やっぱりこれだけでもイキイキしてくる(笑)。
(※) 最新バージョンのプレファブでは初めからアタッチされている。

■表情の変化を付け加える
これも専用スクリプトが付いているので、ヒエラルキーで「SD_unitychan_humanoid」を選択して「Component>Scripts>UnityChan>Face Update」をキャラに追加しよう。ただしこのままだとアニメーション自体は登録されてないので、自分で登録する必要がある。インスペクターで「Face Update(Script)>Animation」の▼印を開いて1つ1つ登録しても良いが、少し面倒なので、既存のプレハブからパラメタだけコピーすることにしよう。
(※) 最新バージョンのプレファブでは初めからアタッチされている。
1.プロジェクトエクスプローラで「UnityChan>SD_unitychan>Prefabs」フォルダを開き、「SD_unitychan_humanoid.prefab」をクリックし、インスペクターで「Face Update(Script)」を探そう。そのちょうど名前のあたりで右クリックしてメニューを出し、「Copy Component」をする。

●インスペクター上でパラメタをコピペする(表情を一気に登録)

2,コピーしたら、またヒエラルキーで「SD_unitychan_humanoid」に戻り、インスペクターで先ほどの追加したばかりの「Face Update(Script)」の名前のあたりで、右クリックメニューから「Paste Component Value」を実行する。これで一気にアニメーションクリップが登録できたハズだ。これで一応完了。再生して確かめてみよう。走ったり、ジャンプしたり、後退したりするとき表情が変わるようになる(画面にメニューも表示される)。
(※)「'SD_unitychan_humanoid' AnimationEvent 'OnCallChangeFace' has no receiver! Are you missing a component?」というエラーも出なくなる。

3.ただちょっと気になるのは停止(Idle)したとき、その直前の表情が残ってしまう点だ。これは Animator のステートに設定したアニメーション(「Standing@loop」「Running@loop」「Jumping@loop」「Walking@loop」)にイベントとして「Face Update(Script)」のメソッド「OnCallChangeFace」で表情を変えているのだが、「Standing@loop」には表情イベントが入ってないためだ。アニメーションの実体はプロジェクトエクスプローラから「UnityChan>SD_unitychan>Animations」フォルダにある「SD_unitychan_motion_humanoid.fbx」のプレファブにまとめられているので、これをクリックし、インスペクターから編集すれば良い。

4.インスペクターが開いたら、一番上のタブを「Animations」にし、「Clips」の中から「Standing@loop」(Idleで使っているアニメ)を選択。ずっと下の方までスクロールすると「Events」という項目があるので、▼印で開く。タイムラインの左のボタンを押すと新しいイベントが追加される。

5.追加されたイベントをクリックするとダイアログが表示されるので(Unity5 ではインスペクタ内に表示される)、「Function」に「OnCallChangeFace」(「Face Update(Script)」内のメソッド)を、「String」に「default@sd_hmd」(通常の表情)と書く。最後にインスペクターの一番右下にある「Apply」を押せば完了だ。再生して表情が変わることを確認しよう。

他のアニメーションも同じように編集しても良いだろう。表情は「Face Update(Script)」に登録したもの(▼Animations の Element 0~18)で Animator の 「face」レイヤーを使っているので追加する場合はここも編集する。実際に表情変化させているスクリプトは MonoDevelop で「Face Update(Script)」を開けば「OnCallChangeFace (string str)」メソッドが見つかるので、これを利用するスクリプトを書いても良い(ChangeFace (string str) を直接呼び出しても良いと思う)。あとの細かい調整は好きにやってみると良いだろう。
他にも色々とスクリプトが付いているので、キャラに追加して試してみるのも良い。「Rest」のステート(停止しているとき[Space]キーを押したときのモーション)は今回割愛しているので、練習に好きなモーションを設定するのも良いだろう。Skybox や WebTemplate などの追加は通常サイズのユニティちゃんと同じなので、必要あれば参考に。
>>完成サンプル Unity5 (別ウィンドウ) [WebGL (Chrome, Firefox)]
(※) Unity5 版は「SDプロ生ちゃんを動かす!」の方法で、Animator「SD_unitychan_locomotion」を使用している。
(関連記事)
【Unity】【C#】ユニティちゃんをサクっと簡単に動かす!
【Unity】SDプロ生ちゃんを動かす!
【Unity】SDクエリちゃんを動かす!
【Unity】クエリちゃんを動かす!
【Unity】プロ生ちゃんを動かす!
【Unity】【C#】SmoothFollow に回転アングルと距離の遠近機能を付けてみる

- 関連記事
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/165-b0cb14d5
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |