Unityちゃんを動かしてみる
今回から3回にわたって、Unityちゃんを使ったサンプルを作ってみましょう。Unityちゃんは「Asset Store」からダウンロードできます。まずはプロジェクトの作成からです。
プロジェクトの作成
Unityメニューの[File]ー[New Project]と選択して「Unity-Project Wizard」画面を表示します。「Project Location」の「Project名」に「FirstUnityChanSample」と指定して、「Create」ボタンをクリックします。
次に「Asset Store」から「Unityちゃん」をダウンロードします。
Asset StoreからUnityちゃんをダウンロードする。
Unityメニューから[Window]ー[Asset Store]と選択します。右上隅の「カテゴリ」を選択する欄で「3D Models」を選択します。すると「”Unity-chan!” model」が表示されますので、これをクリックします。図1は、「“Unity-chan!” model」の「Import」画面です。
図1の「Import」をクリックすると「Importing package」画面が表示されますので、また「Import」をクリックします(図2)。
ダウンロードが済むと「Project」内の「Assets」フォルダーに「Unitychan」のフォルダーが作成されています(図3)。
「Asset Store」を開いているついでに、今回のサンプルで使用するものを全てインポートしておきましょう。
Mecanim Locomotion Starter Kitをダウンロードする
「Asset Store」の検索欄に「Mecanim Locomotion Starter Kit」と入力してください。すると先頭に、「Mecanim Locomotion Starter Kit」が表示されますので、これをクリックします。「Mecanim Locomotion Starter Kit」の「Import」画面が表示されたら「Import」をクリックします(図4)。
「Importing package」の画面が表示されますので、「Import」をクリックします(図5)。
ダウンロード後、「Project」内の「Assets」フォルダーに「Locomotion Setup」のフォルダーが作成されているのが確認できます(図6)。
Raw Mocap data for Mecanimをダウンロードする
「Asset Store」の検索欄に「Raw Mocap data for Mecanim」と入力してください。すると先頭に、「Raw Mocap data for Mecanim」が表示されますので、これをクリックします。「Import」画面が表示されたら「Import」をクリックします(図7)。
これまでと同じように「Importing package」の画面が出たら、「Import」をクリックします(図8)。
ダウンロード完了後には、「Project」内の先ほど作られた「Locomotion Setup」フォルダー以下に「Raw Mocap Data」のフォルダーが作成されています(図9)。
これで、今回のサンプル作りに必要なファイルは全てインポートできました。
「Mecanim(メカニム)」という名前の付いたファイルは、キャラクターにリアルな動きを付けるためのアニメーションシステム用のものです。この機能はUnity4から導入されました。
UnityちゃんをScene画面に配置してステージを作る
まず、「Hierarchy」の「Create」から「Plane」を配置して「床」を作りましょう。これまでと同じように、「Directional Light」も追加しておきましょう。次に「Unitychan」フォルダーの「Prefabs」内にある、「unitychan.prefab」を「Hierarchy」内か「Scene」画面内にドラッグ&ドロップしてください。画面は図10のようになります。
図10の状態で「Main Camera」をクリックして「Camera Preview」にどのように表示されているか確認します。全体的に小さく表示されていますので、「Main Camera」を操作して「Camera Preview」で図11のように見えるよう調整します。
この時の「Main Camera」の位置は表1になります。
Position | X=1 | Y=1 | Z=-1 |
---|---|---|---|
Rotation | X=0 | Y=0 | Z=0 |
Scale | X=1 | Y=1 | X=1 |
「Camera Preview」で見ると、Unityちゃんが「Main Camera」に背を向けています。正面を向いてもらうには、「Hierarchy」から「unitychan」を選択し、「Inspector」内の「Transform」の「Rotation」にある「Y」の値を「180」と指定して下さい。するとUnityちゃんが180度回転して、「Main Camera」の方を向きます。
では、プレイ画面で実行してみましょう。
図12のように表示されていればOKです。
確認できたら、画面上部の「▶」を再度クリックして「Scene」画面に戻しておきましょう。
次にUnityちゃんを動かす処理に入ります。
Unityちゃんを動かす
まず「Hierarchy」から「unitychan」を選択します。「Inspector」が表示されますので、その中の「Animator」項目の「Controller」の右端にある「◎」をクリックし、表示される「Select RuntimeAnimatorController」から、「Locomotion」を選択します(図13)。
図13の「Apply Root Motion」には必ずチェックを入れておいてください。後ほど「Main Camera」をUnityちゃんに追従させるコントロールを追加しますが、この箇所にチェックを入れていないと追従してくれませんので、注意してください。
次に、「Inspector」内の「Add Component」をクリックして[Physics]ー[Character Controller]と選択します。すると「Inspector」内に「Character Controller」が追加されます。この「Character Controller」はキャラクターが障害物に当たった際に、障害物をすり抜けないようにするコントローラーです。ここで「Center」の「Y」の値に「1」を指定します。これを設定することで、キャラクターの中心に当たり判定が設定されます(図14)。今回のサンプルでは、障害物を設けての当たり判定はしていませんが、次回のゲーム作成では当たり判定が出てきますので、ここで設定の方法を知っておきましょう。
次に、同じく「Add Component」から[Scripts]ー[Locomotion Player]と選択します。すると「Inspector」内に「Locomotion Player」が追加されます(図15)。これには何も設定することはありません。
では、これで一度プレイ画面で実行してみましょう。するとステータスバーに赤文字で「Invalid Layer Index」とエラーが表示されます。プレイ画面を閉じて、「Project」の横にある「Console」をクリックします。すると図16のようなエラーが表示されています。
図16の赤い警告アイコンをダブルクリックしてください。MonoDevelopが起動して、エラー箇所の背景が薄いグレーで表示されています。このFaceUpdate.csというファイルのリスト1の部分をコメントアウトします。
// float current = 0; // // // void Update () // { // // if (Input.GetMouseButton (0)) { // current = 1; // } else { // current = Mathf.Lerp (current, 0, delayWeight); // } // anim.SetLayerWeight (1, current); // }
いちいち手で入力する必要はなく、コメントアウトする範囲を選択して、マウスの右クリックで表示されるメニューから「Toggle Line Comment(s)」を選ぶだけです。
コメントアウトしたら、MonoDevelopのメニューから[Build]ー[All Build]を選択して、ビルドを実行します。その後MonoDevelopの画面を閉じ、プレイ画面で実行してみましょう。今度は無事にUnityちゃんが動きますが、画面から外れてしまうことがあります。これは、カメラを追従させていないからです。
カメラの追従
「Hierarchy」から「Main Camera」を選択します。「Inspector」内の「Add Component」から[Camera-Control]−[Smooth Follow]と選択します。「Inspector」内に「Smooth Follow (Script)」が追加されます。「Target」の横の「◎」を選択して、「Select Transform」の画面を表示します。一覧の中から「unitychan」を選択します(図17)。
この状態で実行するとUnityちゃんが動いてくれます。キーボードのカーソルキーで操作もできますし、カメラもちゃんとUnityちゃんを追従しています。ただし「Scene」画面に配置した「Plane」からUnityちゃんがはみ出すと、奈落の底に落ちてしまいますので、「Plane(床)」を広くしておきます。「Plane」の「Scale」の値をX=5、Y=1、Z=5くらいに設定すればいいでしょう。またUnityちゃんの動きがよく見えるように、「Plane」にテクスチャを貼っておきましょう。
「Project」の「unithcyan」フォルダー内の「Stage」内に「Textures」というフォルダーがありますので、その中から、「unituychan tile6.png」を「Hierarchy」内の「Plane」上にドラッグ&ドロップします。
実際にUnityちゃんを動かしているようすは動画1のようになります。
動画1を見るとわかると思いますが、左上に余分な文字がいろいろと表示されています。これを消すには、「unitychan」の「Inspector」から「Face Update(Script)」を選択し、「Animations」を展開して表示される「Size」に「0」を入力します。すると図18が図19のように変化し、文字は表示されなくなります。
この後プレイ画面で実行すると、左上の文字は消えています。
最後に、Unityちゃんにジャンプの機能を追加してみましょう。
Unityちゃんをジャンプさせる
まず、「Project」内の「Locomotion」フォルダーにある「Locomotion.controller」を選択し、「Animator」タブをクリックします。すると、「Any State」と6角形の「Locomotion」が表示されますので、この「Locomotion」をダブルクリックします。
各種の「State」(状態)が、矢印付きの線で結ばれて表示されます。「Animator」はUnity4から追加された「Mecanim」のコアとなる機能で、アニメーションシステムを管理する仕組みになります。この画面には、アニメーションの「State」と「Transition」(遷移)が表示されています(図20)。
次に、画面上の何もないところでマウスを右クリックし、表示されるメニューから[Create State]ー[Empty]と選択してください。すると、「New State」という新しい「State」が作成されます。「New State」を選択し、[Inspector]で名前を「Jump」に変更します(図21)。
次に、「Jump」の「State」を選択し、マウスの右クリックで表示されるメニューから、「Make Transition」を選択します。すると矢印線が出てきますので、「WalkRun」の「State」と結びつけます。今度は「WalkRun」を選択して、同じ手順で「Jump」と結び付けてください(図22)。
次に、画面の左隅下にある「Parameters」の「+」をクリックして、表示される一覧から「Bool」を選択します。「New Bool」という「Parameters」が追加されますので、名前を「Jump」としておいてください。
次に、「Jump」から「WalkRun」に延びている矢印線を選択します。「Inspector」内の「Conditions」にある「+」アイコンをクリックします。「Exit Time」が追加されますので、上下「▼」を選択して、表示されるリストから「Jump」を選択し、値に「false」と指定します(図23)。
次に「WalkRun」から「Jump」に延びている線を選択して、同じ手順で「Conditions」に「Jump」を選択し、値に「true」を指定します。
最後に、「Jump」の「State」を選択し、「Inspector」内の「Motion」の横にある小さな「◎」をクリックして「Select Motion」画面を表示し、一覧の中から「RunJump_ToLeft_2」を選択します(図24)。
これで、「Animator」の設定は終わりです。
次にScriptを記述します。
ジャンプ用Scriptの記述
「Hierarchy」から「unitychan」を選択し、「Add Component」から[New Script]を選択します。「Name」に「UnitychanJump」と指定し、「Language」に「Java Script」を指定し「Create and Add」をクリックします。すると、「Inspector」内に「UnitychanJump(Script)」が追加されます(図25)。
「Script」内の「UnitychanJump」をダブルクリックします。MonoDevelopが起動しますので、リスト2のコードを記述します。
function Update () { (1) var myAnimator=GetComponent(Animator); (2) if (Input.GetKey(KeyCode.Space)) { myAnimator.SetBool("Jump",true); (3) } var state:AnimatorStateInfo=myAnimator.GetCurrentAnimatorStateInfo(0); if(state.IsName("Locomotion.Jump")) { myAnimator.SetBool("Jump",false); (4) } }
- function Updateは初めから記述されている関数です。この中に処理を記述します。
- GetComponent関数でAnimatorコンポーネントを取得し、変数myAnimatorで参照します。
- キーボードから入力されたキーがSpaceなら、SetBoolでJumpパラメーターにtrueを指定します。
- GetCurrentAnimatorStateInfo(0)でAnimatorの現在の状態を取得し、変数stateに格納します。そのAnimatorの名前がLocomotion.Jumpなら、SetBoolでJumpのパラメーターにfalseを指定して、次のJumpに備えます。
入力後、MonoDevelopでビルドしてエラーが出なければ、MonoDevelopを終了します。プレイ画面で実行すると、動画2のようにSpaceキーでジャンプできるようになりました。
この動画に表示されている、右隅上の「Change Motion」のメニューは不要ですね。これ以降の回で消す方法を解説します。
この「Scene」画面をUnityメニューの[File]ー[Save Scene as]と選択して、「Unityちゃんを動かす」というファイル名で保存しておいてください。
今回はこれで終わりです。次回はこのUnityちゃんの動きを使った、簡単なゲームを作ってみたいと思います。お楽しみに。