SDユニティちゃん オンラインが出来るまで -Unity編-

■はじめに

この記事は「【アルファ版】SDユニティちゃん オンライン」の制作過程を示したブログです。
http://unitygameuploader.jpn.org/game/3189.html

■お断り

この記事は現時点で判明している内容を元に書いています。もしかすると勘違いしていたり、もっと良い方法があるかもしれません。その場合は、twitterか下のコメント欄でお知らせください。

■当初の計画

2014/12/28にSDユニティちゃんが公開されました。

http://unity-chan.com/contents/event/c87/

早速ダウンロードして動きを確認。

「か、可愛い!!!」

ということで早速動かしてみようと思いました。

以前からUnrealEngine4の「カウチナイト」というOculusRift用デモプロジェクトのような視点で部屋の中やスマブラ風味のステージでOculusRiftでオンライン対戦ゲームを作りたいと思っていました。ただ、カウチナイトのような可愛いモデルもモーションデータも手元に無かったので中々モチベーションが出てきませんでした(UnrealEngine4でやればいいという話は置いといて)。

ということでかなりテンションが上がったので、まずはキャラクターの動作を実装し、次にPhotonの調査をしようと決めました。細かいところは後から考えよう!

■SDユニティちゃんパッケージの取得と展開

パッケージをダウンロードするとUnityPackage形式になっています。
あとユニティちゃんの基本パッケージもダウンロードしておいてください(スクリプトやAnimation Controllerの内容を一部改造して調整するため)。

Unityを起動して新規プロジェクトを作成します。次に以下の順番でパッケージを取り込みます。

  1. ユニティちゃん基本パッケージ
  2. SDユニティちゃんパッケージ

逆順にするとテクスチャが剥げたり、スクリプトがバージョンダウンして色々とおかしな動きをします。ハロウィンパッケージもそうでしたが、順番を逆にすると色々とおかしくなるので、基本的にユニティちゃん関連のゲームを作る場合は、取り敢えずユニティちゃん基本パッケージは取り込んでおいた方がいいと思います。

■SDユニティちゃんパッケージの確認

シーンファイルが2つあり、基本的にどちらもモーションの確認用となっています。

GenericとHumanoidの2種類あり、見た目はどちらも同じモーションのようです。
何故2種類の形式が配布されているかについてはUNIBOOK2に掲載されています。

http://unibook2.unity-bu.com/

詳細はUNIBOOK2を読んでいただくとして、ここではSDユニティちゃんを自由に操作できるようにしたいと思います。

■キャラ操作スクリプトとその他のコンポーネントとについて

オリジナルユニティちゃんの移動用スクリプトをアタッチした例がAssets/UnityChan/Prefabs/for Locomotion/unitychan_dynamic_locomotion.prefabがあります。これを参考にSDユニティちゃん(Assets/UnityChan/SD_unitychan/SD_unitychan_humanoid.prefab)を動かすことにしました。

取り敢えずunitychan_dynamic_locomotion.prefabとSD_unitychan_humanoid.prefabを比較します。

(比較しやすいようにコンポーネントは並び替えています)。

スクリーンショット 2014-12-31 14.23.56

以下の4つはそのままとします。

  • Face Update.cs
  • Auto Blink for SD(オリジナルユニティちゃんはAuto Blink.cs)
  • Spring Manager.cs
  • Random Window.cs

次のスクリプトはモーション確認用なので不要です。削除するか無効化してください。

  • Idle Changer.cs

以下の3つのコンポーネント(スクリプトも含む)を追加します。

  • Capsule Collider(当たり判定)
  • Rigidbody(物理エンジンを搭載した剛体)
  • UnityChanControlScriptWithRigidBody.cs(キー入力と移動、アニメーション制御パラメータの設定など)

コンポーネントを追加するときは「放課後の校舎を歩く Japanese School Corridor Set ~ OculusRiftホラーを作る その1 #アセットアドカレ 12本目」を参考にInspectorを2つ出してComponet copy&Component pasteを利用するとよいでしょう。

スクリーンショット 2014-12-31 14.43.28

最後にCapsule ColliderをSDユニティちゃんサイズに調整してください。

Center:(0, 0.5, 0)
Radius:0.25
Height:1

スクリーンショット 2014-12-31 15.17.13

では出来たSDユニティちゃんを走らせてみましょう。

Assets/UnityChan/Scenes/Locomotionを開き、Hierarchyのunitychan_dynamic_locomotionを削除して、ProjectのAssets/UnityChan/SD_unitychan\Prefabs/SD_unitycha_humanoid.prefabをHierarchyにDrag&Dropします。

残念ながら実行するとConsoleに大量のエラーが出ます。

スクリーンショット 2014-12-31 14.56.51

原因は2つあります。

1つはユニティちゃん付属のThirdPersonCamera.csの実行に必要なGameObjectが不足していること。もう一つはAnimator Controller(Mecanim)が適切に設定されてないためです。アニメーション用パラメータはUnityChanControlScriptWithRgidBody.csから設定しています。

以下、順番に対応してきます。

■ThirdPersonCamera.csとxxxPos GameObject

オリジナルUnityちゃんのDynamic Locomotion版のPrefabをもう一度見てみます。
子要素を展開すると、モデルデータ(Character1_Reference、mesh_root)のほかにCamPos、FrontPos、JumpPosなどがあります。

スクリーンショット 2014-12-31 17.44.47

ThirdPersonCamera.csのソースコードを確認するStart()で検索しています。

ThirdPersonCamera.cs:

ということで同じように設定します。CamPos、FrontPos、JumpPosのプレハブが同じフォルダにあるのでこれらをHierarchyのSD_unitychan_humanoidの子要素になるように追加してください。

スクリーンショット 2014-12-31 17.45.55

これでWASDキーで移動するとカメラが追随するようになります。またマウスの左ボタンをクリックするとカメラがSDユニティちゃんの正面に移動します。

■Animator Controllerの設定

Locomotion用のアニメーション設定はAseets/UnityChan/Animators/UnityChanLocomotions.controllerです。取り敢えずこれをSDユニティちゃんにセットしてみましょう。

一応、エラーも警告も出なくなり一見問題なさそうですがアニメーションが色々とおかしいです。

スクリーンショット 2014-12-31 15.39.15

 

スクリーンショット 2014-12-31 15.39.11

せっかくSDユニティちゃん専用のモーションデータがありますのでそちらを使って再設定したいと思います。

オリジナルユニティちゃんの設定は残しておくために、SDユニティちゃんフォルダに以下のフォルダを追加してください。

・Assets/UnityChan/SD_unitychan/Animators

Aseets/UnityChan/Animators/UnityChanLocomotions.controllerを複製(Ctrl+D or Command+D)して名前をSDUnityChanLocomotionsに変更し、Assets/UnityChan/SD_unitychan/Animatorsフォルダにコピーします。

コピーしたSDUnityChanLocomotionsをダブルクリックして開きます。

このAnimation Controller(Mecanim)は「Base Layer」、「Face」の2つのレイヤーから構成されています(左上を参照)。

スクリーンショット 2014-12-31 15.55.25

○Base Layer

Locomotion以外はすべてStateで、LocomotionだけBland Treeになっています。

これからStateやBland Treeにモーションの設定を行いますが、作業をしやすくするためにモーション名を変更します。

Assets/UnityChan/SD_unitycha/Animations/SD_unitychan_motion_humanoidを選択し、InspectorからAnimationsを選択します。
次にClipsの「Standing@loop」を選択します。そして、その下の欄の「Standing@loop」を「SDH_Standing@loop」に変更してENTERキーを押して確定してください。以下すべてのモーションについて同様に名前を変更します。

スクリーンショット 2014-12-31 16.12.19

名前を変更する理由はSDユニティーちゃん向けモーションはGenericとHumanoidの2種類あるのですがどちらもモーション名が同じなのであとで参照するとき大変だからです(何かいい方法があるのかな?)。

準備ができたのでLocomotion以外のState(Idle、WalkBack, Rest、Jump)のMotionを以下のように変更します。

Idle:SDH_Standing@loop
WalkBack:SDH_Walking@loop
Jump:SDH_Jumping@loop
Rest:SDH_Salute

ほかのモーションが良いと思ったら変えても良いと思います。
WalkBackは後ろ向きになるようなモーションがほしかったのですが無かったのでそのまま歩くモーションを使いました。その結果、スケートリンクで滑っているような感じになっていますw

Restは本来Idle状態その2という感じなのでもうちょっと休んでいる感じのモーションが良いのかもしれませんが、1つしかなかったので挨拶用のモーションをセットしてみました。

次にLocomotionです。LocomotionをダブルクリックするとBrend Treeを開いてください。
LocomotionはSpeedパラメータでWalksかRunsのいずれかのモーションを再生します(これらもBrendTree)。Speedは0~1までの範囲で0.8以上でRunsになります。

スクリーンショット 2014-12-31 16.23.29

次にWalksとRunsですが、どちらもDirectionパラメータで再生するアニメーションをブレンドしています。有効範囲は-1~1で左に傾いたアニメーション、正面、右に傾いたアニメーションをそれぞれブレンドしています。

SDユニティーちゃんのモーションには左右に傾いたモーションまで入っていません。他のモーションをマスクしてブレンドするという手もありますがとりあえず無いので無理に対応せずに歩いているとき、走っている時だけのモーションにします。

最終的な図と設定内容です。

スクリーンショット 2014-12-31 16.31.31

Walks: SDH_Walking@loop
Runs: SDH_Running@loop

Directionパラメータが全く意味がないのでそれぞれBrendTreeをやめてStateにしても良いかもしれません。

この時点で動かしてみるとそれなりに動きますが、顔のアニメーション周りの設定が不完全なのでConsoleにエラーが大量に出ています。

スクリーンショット 2014-12-31 16.42.50

 

スクリーンショット 2014-12-31 16.42.09

○Face

スクリーンショット 2014-12-31 19.47.34

左への内容の確認。

Weight率は0~1で指定しますがあとでスクリプトで変更するのでここでは0で問題ありません。

MaskはSDユニティーちゃん用のAssets/UniyChan/SD_unitychan/FaceAnimations/_faceOnly.maskファイルに置き換えてください。

次に元々登録してあるStateをすべて削除し、Assets/UnityChan/SD_unitychan\FaceAnimations/Humanoidフォルダの下にあるモーションファイルをすべて選択し、それをAnimatorビューにDrag&Dropします。

あとは適当に見やす用に並び替えて「defalt@sd_hmd」をDefault Stateにします。

スクリーンショット 2014-12-31 17.08.47

最後にSD_unitychan_humanoidにアタッチされているFace Update.csのDelay Weightですが3に設定されていますが、これを0.3に変更してください(多分、オリジナルのミス?)。

これでエラーも警告も出なくなり自由に走り回ることができます。

ただ、JumpモーションからLocomotionモーションに戻るまでの時間がモーションの再生時間と合っていないため不自然に滑ったような感じになります。
そこでJump->Locomotionへ戻るTransitionのConditionsのExit Timeを0.87から0.50にしました。

スクリーンショット 2014-12-31 16.53.09

ここまでノーコーディング。

これまでの内容を反映したパッケージをgithubで公開しています。ユニティちゃんライセンスの範囲でご自由にお使いください。

https://github.com/zabaglione/SDUnityChanOnline1

Photon編に続く。

ユニティちゃんライセンスこのアセットは、『ユニティちゃんライセンス』で提供されています。このアセットをご利用される場合は、『キャラクター利用のガイドライン』も併せてご確認ください。

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です