Unityで自分の好きなキャラ動かせるとめっちゃ気持ちいんですよ。
本日のダイジェスト
— さわら@SE (@hiroga_cc) 2017年8月14日
4.走って飛ぶ(Raw Mocap DataというAssetを使った) pic.twitter.com/kTwlix89VZ
キャラクターのインポートからキーボードでグリグリ動かすまで、備忘録を作りました。
参考にしたページ
第8回目:3Dキャラクターをノンプログラミングで動かす(後編)|Tech Book Zone Manatee
Unityちゃんを動かしてみる | Think IT(シンクイット)
Unity - 入力されたキーの情報を取得する - Qiita
手順
1. 準備
1-1. プロジェクトの作成
1-2. オブジェクトの配置
2. ウォーグレイモンの作成
2-1. アバター定義の追加
2-2. ウォーグレイモン召喚
2-3. Character Controllerの追加
3. ダッシュ編
3-1. 走るアニメーションの追加
4. ジャンプ編
4-1. カメラに追わせる
4-2. ジャンプの追加
* もしUnity未経験なら初めに公式のチュートリアルやってからの方が絶対いいです
1. 準備
まず、必要なアセットをインポートします。
・キャラクター
今回はこちらのウォーグレイモンのモデルを拝借しました。
・動き
https://www.assetstore.unity3d.com/jp/#!/content/7673
https://www.assetstore.unity3d.com/jp/#!/content/5330
完了したらプロジェクトを作成し、上記のアセットをインポート。
これからウォーグレイモンが立つ場所を作っておきます。
Create > 3D Object > Plane
* PlaneのScaleをx,y,zそれぞれ5づつくらいにしておくと、走らせた時に落ちなくて良いです。
2. ウォーグレイモンの作成
モデルをHierarchyに追加する前に、アバター定義(グリグリ動かすための骨組みと肌との間のマッピングのことらしい)を作成します。
ProjectビューのWarGraymon.fbxを選択し、InspectorのRigタブで
Animetion Type > Humanoid を選択し、Applyを選択。
* 画像はデュークモンですが手順は一緒です。
ちなみにここで失敗すると
Invalid Avatar Rig COnfiguration. Missing or invaild trasform:
Required human bone 'Hip' not found
って表示がよく出てきます。
文字通りお尻に当たる部分のパーツが見つからないか、もしくは単にアバターがパーツごとの区別を保って作成されていないかどどちらか。(単にHipを解析するのが最初だからHipでエラーになるだけで、細分化されてない時はだいたいこのエラーになる)
エラーがなければウォーグレイモンのPrefabをHierarchyにドラッグ&ドロップし、ウォーグレイモンを召喚します。
ここで再生するとこんな感じ。
さらに、重力とか回転とかをUnityの物理エンジンに再現させるためのComponentをウォーグレイモンに追加します。
Add ComponentでRigidbodyを追加し、Use Gravityをチェック。
この時点で再生するとこんな感じになります。落下する。
本日のダイジェスト
— さわら@SE (@hiroga_cc) 2017年8月14日
1.落ちる pic.twitter.com/yRPbIHPo4E
これは地面とウォーグレイモンに当たり判定をするためのComponentが追加されていないため。それぞれ追加します。
PlaneにBox Colliderを追加
ウォーグレイモンにはCharacter Contorollerを追加。*1
多分ウォーグレイモンの体のサイズと合ってないので、Sceneビューを見ながら数値をいじって調整します。特に、地面に埋まらないように足元の調整に気を使う。*2
私の場合はこんな結果になりました。
* ウォーグレイモンにCapsule Colliderを追加してもいいのですが、Character Controllerだと変にウォーグレイモンが転がってしまうことがないのでこっちのが便利。
* 私の環境のウォーグレイモンは足元を調整しても地面に埋まったんですけど、ポージングに問題があったっぽい。Motionで適当なアニメーションを設定したら埋まらなくなりました。
ここまでで役者は揃いました。あとはアニメーション。
3. ダッシュ編
初めにインポートしたMecanim Locomotion Starter Kitをウォーグレイモンに追加していく作業です。
ウォーグレイモンのAnimator > Controllerの右側の◉をクリックし、Locomotionを選択。合わせて、Apply Root Motionをチェック(これやらないと方向キーに反応してくれないっぽい)
さらにAdd Component > ScriptでLocomotion Controllerを選択します。
ここまでで再生すると方向キーに合わせてウォーグレイモンが動くはず!
4. ジャンプ編
せっかくなのでカメラにウォーグレイモンを追わせます。
一番手軽なのはMain CameraをHierarchyでウォーグレイモンの子要素にしてしまうことなのですが、もっとスムーズにカメラが付いてくるやり方があるのでそっちにしましょう。
Main CameraにAdd ComponentでSmooth Followを追加します。次に、TargetにWarGraymonを追加します。これでいい感じにカメラが追尾してくれます!
ジャンプを追加します。ジャンプのモーションをもつ状態を作成し、それへの遷移を追加する感じです。
Asset > Locomotion Setup > Locomotion > Locomotionをダブルクリックし、Animatorビューへ移動。下の画面になると思います。
まずStateを新規作成します。空白部分で右クリック > Create State > Emptyし、名前を任意に変更(Jumpとか)
MotionにRunJumpを追加します。(何種類かあるので適当に選んで、あとで気に入ったのにすると良いと思います。)
次に遷移を追加します。新規作成したStateの上で右クリックしMake Transitionを選択。矢印をWalkRunへと結びます。できたら逆に、WalkRunの上で右クリックして新規作成したStateへのTransitionを追加します。
最後に、Transitionに遷移のための条件を追加します。
Animatorビュー左上のParametersで+を押下し、Triggerを選択。名前は"Jump"としておきましょう。
できたら先ほど追加したTransitionのうち、WalkRunからJumpに伸びるほうをクリック。Inspectorビューで変更を加えます。Conditionsで+を押下し、先ほど作成したParametersのJumpを選択してください。
ここまでできたらAnimatorビューでの作業は終わりです。
ParametorsのJumpをオンオフするスクリプトを追加します。HierarchyビューでWarGraymonを選択し、Add Component > New Scriptで"WGController"を作成します。
* 別に名前はなんでもいいのですが、C#のクラス名とは合わせる必要があります。
できたらvoid Update( ){ }の中を以下の通り書き換えてしまってください。
void Update () { Animator anim = GetComponent(); AnimatorStateInfo state = anim.GetCurrentAnimatorStateInfo (0);
if (Input.GetKeyDown (KeyCode.Space)) { anim.SetTrigger ("Jump"); }
}
以上で作業は全て終了です。あとは再生ボタンを押せばウォーグレイモンが動くはず!
やってみて
好きなキャラクターがグリグリ動くのって予想以上に楽しい。Unityってとっつきにくそうなイメージがあったけど全然そんなことはなかった(Adobe触った経験があったからかもしれない。 UIが似てる)
個人で楽しむ分には色んなモデルがインターネット上にあるし、こういうので楽しみながら練習してハッカソンとかで役に立てたいなと思う所存です。