Unityちゃんをキー操作で走らせる

  • 119
    Like
  • 0
    Comment
More than 1 year has passed since last update.

はじめに

前回はUnityちゃんを単に表示しただけでした。
今回は、キー操作でUnityちゃんをモーション付きで動かしてみることにします。

Stepとしては以下のようになります。

  • 床を置く
  • Animatorを設定する
  • 動きを制御するScriptを付ける

床を置く

今回は重力の設定とかはしないので、別に床が無くても良いんですが、雰囲気を出すために一応作っておきます。

メニューから GameObject -> Create Other -> Plane を選びます。

GameObject_と_Menubar.png

するとUnityちゃんの胴体を真っ二つにする位置に表示されるので、位置を変更しておきます。
position=(0,0,0) が良いでしょう。

demo1_unity_-_RoadRunner_-_Web_Player.png

こんな感じになります。

Animatorを設定する

次に、キャラクターとMotionを関連付けます。UnityちゃんのPackageには色々Motionが付属しているので簡単に使えるのです。

Animatorというのを使うと、キャラクターの状態(止まっている、走っている、ジャンプしている、ダメージを受けている、等)に応じて、Motionを切り替えることができるようです。
AnimatorはStateMachine(メカニム?)になっていて、状態にMotionを関連付け、各変数の条件によって状態遷移やMotionのBlendなどを定義できるようです。

凝った使い方をしないのであれば、Animatorは簡単なので今回もAnimatorを使って設定しておきます。

Animator作成

まず、Projectの 「Create」から Animator Contollerを選択します。

demo1_unity_-_RoadRunner_-_Web_Player.png

すると以下のように Any Stateとだけ書かれた四角が表示されます。
この作ったAnimatorを UnityChan Demo1 と名づけておきます。

demo1_unity_-_RoadRunner_-_Web_Player.png

IdleとRunningの状態を作成

Any Stateはあまり気にしないで、何も無いところを右クリックして Create StateEmptyを選択します。
すると、New Stateという四角が現れるので、名前を Idleとしておきます。
これで Idleという状態が作られました。同様にRunningという状態も作成しておきます。

demo1_unity_-_RoadRunner_-_Web_Player.png

demo1_unity_-_RoadRunner_-_Web_Player.png

状態に対してMotionを設定

Idle状態に割り当てるアニメーションを選択します。今回は WAIT01を使うことにします。
Idleの状態を選択して、MotionのところをクリックしてWAIT01を選べばOKです。

Select_Motion_と_demo1_unity_-_RoadRunner_-_Web_Player_と_Assembly-CSharp_-_UnityChan_Demo1_cs_-_MonoDevelop-Unity.png

同様に Running状態に対して、Motion RUN00_Fを割り当てておきます。

demo1_unity_-_RoadRunner_-_Web_Player_と_Assembly-CSharp_-_UnityChan_Demo1_cs_-_MonoDevelop-Unity.png

状態間の遷移を設定

Idleを右クリックして、Make Transitionを選んで、Runningに対して矢印を引きます。

demo1_unity_-_RoadRunner_-_Web_Player.png

demo1_unity_-_RoadRunner_-_Web_Player.png

左下のParameterの+をクリックして、Boolを選びます。
demo1_unity_-_RoadRunner_-_Web_Player.png

New Boolという変数が追加されるので、名前をis_runningとでもしておきます。

demo1_unity_-_RoadRunner_-_Web_Player.png

矢印をクリックすると、右側のInspectorが変わります。

demo1_unity_-_RoadRunner_-_Web_Player.png

Conditionsis_running -> true としておきます。

demo1_unity_-_RoadRunner_-_Web_Player_と_Assembly-CSharp_-_UnityChan_Demo1_cs_-_MonoDevelop-Unity.png

また、逆向きの矢印 Running -> Idleを作って、同様のConditionを変更し、
is_running -> false としておきます。

demo1_unity_-_RoadRunner_-_Web_Player.png

UnityちゃんにAnimatorを設定

Hierarchyのunitychanを選択して、Animator → Controller のボタンをクリックして、先ほどのUnityChan Demo1を選びます。

demo1_unity_-_RoadRunner_-_Web_Player.png

これでUnityちゃんにMotionが関連付けられました。

テスト実行

実行してみると、のんびり伸びをするUnityちゃんが表示されると思います。

demo1_unity_-_RoadRunner_-_Web_Player.png

動きを制御するScriptを付ける

キー操作でキャラクターを動かすために、ちょっとスクリプトを書きます。
おそらく既存のスクリプトでもできるような気がしますが、練習として自作してみることにします。

C# スクリプトの新規作成

Project → Create → C# Script を選びます。名前をUnityChanDemo1としておきます。

demo1_unity_-_RoadRunner_-_Web_Player.png

Unityちゃんにスクリプトを設定

その作ったファイルを、Hierarchyのunitichanにドラッグアンドドロップします。

スクリーンショット_2014_04_15_22_59.png

UnityちゃんのInspectorを見ると作ったスクリプトがComponentとして増えているのがわかります。

demo1_unity_-_RoadRunner_-_Web_Player.png

スクリプトの編集

AssetのスクリプトかInspectorのスクリプトをダブルクリックします。

するとMonoDevelopが起動します。メソッドの補完とか完全に効くのでとても便利です。
とりあえず、以下のように書きます。

UnityChanDemo1.cs
using UnityEngine;
using System.Collections;

public class UnityChanDemo1 : MonoBehaviour {

    private Animator animator;
    // Use this for initialization
    void Start () {
        animator = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update () {
        if (Input.GetKey("up")) {
            transform.position += transform.forward * 0.01f;
            animator.SetBool("is_running", true);
        } else {
            animator.SetBool("is_running", false);
        }
        if (Input.GetKey("right")) {
            transform.Rotate(0, 10, 0);
        }
        if (Input.GetKey ("left")) {
            transform.Rotate(0, -10, 0);
        }
    }
}

ポイントは、

        animator = GetComponent<Animator>();

とすることで、 Unityちゃんに関連付けられている Animatorオブジェクトの参照が取得できるということ。

        animator.SetBool("is_running", true);

とすることで、Animatorの変数に対して、Set/Getできること。そしてそうすると、Animatorが状態遷移をしてMotionが切り替わります。

以下の様なメソッドで動かすのに必要な処理ができること

Input.GetKey("up"); // キー入力判定
transform.position += transform.forward * 0.01f; // 移動
transform.Rotate(0, -10, 0); // 回転

という感じでしょうか。

おわりに

動きが遅いとか、カメラが追随しないとか、色々ありますが、とりあえず動くようにはなりました。

今回作ったものは以下のURLにPublishしてあります。
https://dl.dropboxusercontent.com/u/21300511/UnityRoadRunner/demo1b/demo1b.html