Unityちゃんを動かしてみる

2014年11月6日(木)
薬師寺 国安

今回から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:「“Unity-chan!” model」の「Import」画面(クリックで拡大)

図1の「Import」をクリックすると「Importing package」画面が表示されますので、また「Import」をクリックします(図2)。

図2:「Import」をクリックする

ダウンロードが済むと「Project」内の「Assets」フォルダーに「Unitychan」のフォルダーが作成されています(図3)。

図3:追加されたUnitychanフォルダー

「Asset Store」を開いているついでに、今回のサンプルで使用するものを全てインポートしておきましょう。

Mecanim Locomotion Starter Kitをダウンロードする

「Asset Store」の検索欄に「Mecanim Locomotion Starter Kit」と入力してください。すると先頭に、「Mecanim Locomotion Starter Kit」が表示されますので、これをクリックします。「Mecanim Locomotion Starter Kit」の「Import」画面が表示されたら「Import」をクリックします(図4)。

図4:「Import」をクリックする(クリックで拡大)

「Importing package」の画面が表示されますので、「Import」をクリックします(図5)。

図5:「Import」をクリックする

ダウンロード後、「Project」内の「Assets」フォルダーに「Locomotion Setup」のフォルダーが作成されているのが確認できます(図6)。

図6:「Locomotion Setup」のフォルダーが作成された

Raw Mocap data for Mecanimをダウンロードする

「Asset Store」の検索欄に「Raw Mocap data for Mecanim」と入力してください。すると先頭に、「Raw Mocap data for Mecanim」が表示されますので、これをクリックします。「Import」画面が表示されたら「Import」をクリックします(図7)。

図7:「Import」をクリックする(クリックで拡大)

これまでと同じように「Importing package」の画面が出たら、「Import」をクリックします(図8)。

図8:「Import」をクリックする

ダウンロード完了後には、「Project」内の先ほど作られた「Locomotion Setup」フォルダー以下に「Raw Mocap Data」のフォルダーが作成されています(図9)。

図9:「Raw Mocap Data」のフォルダーが作成された

これで、今回のサンプル作りに必要なファイルは全てインポートできました。
「Mecanim(メカニム)」という名前の付いたファイルは、キャラクターにリアルな動きを付けるためのアニメーションシステム用のものです。この機能はUnity4から導入されました。

 

UnityちゃんをScene画面に配置してステージを作る

まず、「Hierarchy」の「Create」から「Plane」を配置して「床」を作りましょう。これまでと同じように、「Directional Light」も追加しておきましょう。次に「Unitychan」フォルダーの「Prefabs」内にある、「unitychan.prefab」を「Hierarchy」内か「Scene」画面内にドラッグ&ドロップしてください。画面は図10のようになります。

図10:Unityちゃんを配置してみた(クリックで拡大)

図10の状態で「Main Camera」をクリックして「Camera Preview」にどのように表示されているか確認します。全体的に小さく表示されていますので、「Main Camera」を操作して「Camera Preview」で図11のように見えるよう調整します。

図11:「Camera Preview」に表示されたUnityちゃん(クリックで拡大)

この時の「Main Camera」の位置は表1になります。

表1:「Main Camera」の位置

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です。

図12:プレイ画面で実行したUnityちゃん(クリックで拡大)

確認できたら、画面上部の「▶」を再度クリックして「Scene」画面に戻しておきましょう。
次にUnityちゃんを動かす処理に入ります。

Unityちゃんを動かす

まず「Hierarchy」から「unitychan」を選択します。「Inspector」が表示されますので、その中の「Animator」項目の「Controller」の右端にある「◎」をクリックし、表示される「Select RuntimeAnimatorController」から、「Locomotion」を選択します(図13)。

図13:Controllerに「Locomotion」を指定する(クリックで拡大)

図13の「Apply Root Motion」には必ずチェックを入れておいてください。後ほど「Main Camera」をUnityちゃんに追従させるコントロールを追加しますが、この箇所にチェックを入れていないと追従してくれませんので、注意してください。

次に、「Inspector」内の「Add Component」をクリックして[Physics]ー[Character Controller]と選択します。すると「Inspector」内に「Character Controller」が追加されます。この「Character Controller」はキャラクターが障害物に当たった際に、障害物をすり抜けないようにするコントローラーです。ここで「Center」の「Y」の値に「1」を指定します。これを設定することで、キャラクターの中心に当たり判定が設定されます(図14)。今回のサンプルでは、障害物を設けての当たり判定はしていませんが、次回のゲーム作成では当たり判定が出てきますので、ここで設定の方法を知っておきましょう。

図14:当たり判定を設定(クリックで拡大)

次に、同じく「Add Component」から[Scripts]ー[Locomotion Player]と選択します。すると「Inspector」内に「Locomotion Player」が追加されます(図15)。これには何も設定することはありません。

図15:「Locomotion Player」の追加(クリックで拡大)

では、これで一度プレイ画面で実行してみましょう。するとステータスバーに赤文字で「Invalid Layer Index」とエラーが表示されます。プレイ画面を閉じて、「Project」の横にある「Console」をクリックします。すると図16のようなエラーが表示されています。

図16:エラーが表示された

図16の赤い警告アイコンをダブルクリックしてください。MonoDevelopが起動して、エラー箇所の背景が薄いグレーで表示されています。このFaceUpdate.csというファイルのリスト1の部分をコメントアウトします。

コメントアウトするコード(FaceUpdate.cs)

//      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)。

図17:「Target」に「unitychan」を指定する(クリックで拡大)

この状態で実行すると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:動いているUnityちゃん

動画1を見るとわかると思いますが、左上に余分な文字がいろいろと表示されています。これを消すには、「unitychan」の「Inspector」から「Face Update(Script)」を選択し、「Animations」を展開して表示される「Size」に「0」を入力します。すると図18が図19のように変化し、文字は表示されなくなります。

図18:「Face Update(Script)」の「Animations」を展開した

図19:「Size」に「0」と入力すると「Element」の項目が消える

この後プレイ画面で実行すると、左上の文字は消えています。

最後に、Unityちゃんにジャンプの機能を追加してみましょう。

 

Unityちゃんをジャンプさせる

まず、「Project」内の「Locomotion」フォルダーにある「Locomotion.controller」を選択し、「Animator」タブをクリックします。すると、「Any State」と6角形の「Locomotion」が表示されますので、この「Locomotion」をダブルクリックします。

各種の「State」(状態)が、矢印付きの線で結ばれて表示されます。「Animator」はUnity4から追加された「Mecanim」のコアとなる機能で、アニメーションシステムを管理する仕組みになります。この画面には、アニメーションの「State」と「Transition」(遷移)が表示されています(図20)。

図20:アニメーションの「State」と「Transition」が表示されている(クリックで拡大)

次に、画面上の何もないところでマウスを右クリックし、表示されるメニューから[Create State]ー[Empty]と選択してください。すると、「New State」という新しい「State」が作成されます。「New State」を選択し、[Inspector]で名前を「Jump」に変更します(図21)。

図21:「Jump」という新しい「State」が作成された(クリックで拡大)

次に、「Jump」の「State」を選択し、マウスの右クリックで表示されるメニューから、「Make Transition」を選択します。すると矢印線が出てきますので、「WalkRun」の「State」と結びつけます。今度は「WalkRun」を選択して、同じ手順で「Jump」と結び付けてください(図22)。

図22:「Jump」と「WalkRun」の「State」をお互いに矢印線(Transition)で結んだ(クリックで拡大)

次に、画面の左隅下にある「Parameters」の「+」をクリックして、表示される一覧から「Bool」を選択します。「New Bool」という「Parameters」が追加されますので、名前を「Jump」としておいてください。

次に、「Jump」から「WalkRun」に延びている矢印線を選択します。「Inspector」内の「Conditions」にある「+」アイコンをクリックします。「Exit Time」が追加されますので、上下「▼」を選択して、表示されるリストから「Jump」を選択し、値に「false」と指定します(図23)。

図23:「Jump」を選択、値に「false」を指定する(クリックで拡大)

次に「WalkRun」から「Jump」に延びている線を選択して、同じ手順で「Conditions」に「Jump」を選択し、値に「true」を指定します。

最後に、「Jump」の「State」を選択し、「Inspector」内の「Motion」の横にある小さな「◎」をクリックして「Select Motion」画面を表示し、一覧の中から「RunJump_ToLeft_2」を選択します(図24)。

図24:「Motion」に「RunJump_ToLeft_2」を指定する(クリックで拡大)

これで、「Animator」の設定は終わりです。
次にScriptを記述します。

ジャンプ用Scriptの記述

「Hierarchy」から「unitychan」を選択し、「Add Component」から[New Script]を選択します。「Name」に「UnitychanJump」と指定し、「Language」に「Java Script」を指定し「Create and Add」をクリックします。すると、「Inspector」内に「UnitychanJump(Script)」が追加されます(図25)。

図25:「UnitychanJump(Script)」が追加された(クリックで拡大)

「Script」内の「UnitychanJump」をダブルクリックします。MonoDevelopが起動しますので、リスト2のコードを記述します。

スペースキーでUnityちゃんがJumpするコード(UnitychanJump.js)

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)
  }
 }
  1. function Updateは初めから記述されている関数です。この中に処理を記述します。
  2. GetComponent関数でAnimatorコンポーネントを取得し、変数myAnimatorで参照します。
  3. キーボードから入力されたキーがSpaceなら、SetBoolでJumpパラメーターにtrueを指定します。
  4. GetCurrentAnimatorStateInfo(0)でAnimatorの現在の状態を取得し、変数stateに格納します。そのAnimatorの名前がLocomotion.Jumpなら、SetBoolでJumpのパラメーターにfalseを指定して、次のJumpに備えます。

入力後、MonoDevelopでビルドしてエラーが出なければ、MonoDevelopを終了します。プレイ画面で実行すると、動画2のようにSpaceキーでジャンプできるようになりました。

動画2:Spaceキーでジャンプ!

この動画に表示されている、右隅上の「Change Motion」のメニューは不要ですね。これ以降の回で消す方法を解説します。

この「Scene」画面をUnityメニューの[File]ー[Save Scene as]と選択して、「Unityちゃんを動かす」というファイル名で保存しておいてください。

今回はこれで終わりです。次回はこのUnityちゃんの動きを使った、簡単なゲームを作ってみたいと思います。お楽しみに。

薬師寺国安事務所

薬師寺国安事務所代表。Visual Basic プログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。1997年に薬師寺聖とコラボレーション・ユニット PROJECT KySS を結成。2003年よりフリーになり、PROJECT KySS の活動に本格的に参加、.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。Windows Phoneアプリ開発を経て、現在はWindows ストア アプリを多数公開中

Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています