LoginSignup
8
8

More than 5 years have passed since last update.

【Unity】MMDモデルを使ってボールを蹴って物体を壊すゲームを作ろう!その4【基礎】

Last updated at Posted at 2014-03-28

目次

【Unity】MMDモデルを使ってボールを蹴って物体を壊すゲームを作ろう!
その1
その2
その3
その4
その5
その6(完結)

オブジェクトの配置

その3の続きになります。
ついにゲーム画面らしくSceneにモノを追加していく作業になります。
画面上段のSceneタブを押下してAnimator画面からScene画面に戻りましょう。

スクリーンショット 2014-03-28 14.07.45.png

床の追加

床はplaneやterrainツールなどでもいいのですが、
今回はcubeで作ります。
GameObject→Create Other→Cubeを押下し、cubeを作成します。

スクリーンショット 2014-03-28 14.08.01.png

作成したらInspectorを以下のように調整しておきましょう。
名前:Floor
Position : x 0 y -1 z 0
Scale : x 30 y 1 z 30

キャラクターの追加

gontaもすでに追加されているかもしれませんが、
追加されていなければ、D&Dして追加して下さい。
Inspectorの設定は
Position : x 0 y 0 z 0
にしておきましょう。
ここで一旦実行します。

スクリーンショット 2014-03-28 14.16.11.png

暗いですね。
ではライトを追加しましょう。

ライトの追加

GameObject→Create Other→Direction Lightを選択して、
ライトを追加します。
Position : x 0 y 10 z -10
Rotation : x 50 y -30 z 0
辺りでOKです。
実行してみるとライトの恩恵を受けて明るくなりました。

スクリーンショット 2014-03-28 14.19.07.png

キャラクターを動かそう

ようやくコードが書けます!長かったですね…。
スクリプトを組んでキャラクターを操作出来るようにしていきます。

Create→C# Scriptを選択して、csファイルを生成します。
名前はCharacterSetupとしました。

スクリーンショット 2014-03-28 14.20.03.png

ダブルクリックし、ファイルを開き以下のように記述してください。

CharacterSetup.cs
using UnityEngine;
using System.Collections;

public class CharacterSetup : MonoBehaviour {

    private float speed = 6.0f;
    private Vector3 moveDirection;
    private CharacterController character;
    // Use this for initialization
    void Start () {
        //Componentに登録されているCharacterControllerを取得します。
        character = GetComponent<CharacterController>();
    }

    // Update is called once per frame
    void Update () {
        // 上下キーが押されたら
        if(Input.GetAxis("Vertical") != 0){
            float varticalMove = Input.GetAxis("Vertical");

            moveDirection = new Vector3(0 , 0 , varticalMove);
            moveDirection = transform.TransformDirection(moveDirection);
            moveDirection *= speed;
        }

        // 左右キーが押されたら
        if(Input.GetAxis("Horizontal") != 0){
            transform.Rotate(0 , 100 * Time.deltaTime * Input.GetAxis("Horizontal") , 0);
        }

        character.Move(moveDirection * Time.deltaTime);
    }
}

もし、入力ミスがあった場合は、
コードエラーは以下のようにこじんまりと教えてくれますが、
Consoleタブを開けば詳細に見ることが出来ます。

スクリーンショット 2014-03-28 14.38.06.png

入力が出来ましたら、gontaにD&Dしてスクリプトを登録、そして実行!

キーボードの左右キーは効くのですが、上下に動きませんね…。
それもそのはず、スクリプトに書いたCharacterControllerが無いからです。
では、CharacterControllerをgontaに追加してあげましょう。
gontaを選択して、Inspectorの一番下にあるAdd Componentを押下。
Physics→Character Controllerを選択。

スクリーンショット 2014-03-28 22.45.42.png

これでCharacterControllerが追加出来ました。
ちょっと調整します。
Center : x 0 y 1 z 0
radius : 0.6
にします。

スクリーンショット 2014-03-28 22.47.35.png

Character Controller
上手く説明出来ないので詳しくは公式を見て欲しいですが、キャラクター制御用の判定を行う専用コンポーネント…という感じでしょうか。

スクリーンショット 2014-03-28 22.47.26.png

この外枠にあるカプセルコライダー型のものがCharacterControllerになります。

追加が終わったら早速実行します。
おお!上下キーも効くようになりましたね!

スクリーンショット 2014-03-28 22.50.08.png

しかし、このままではT字型のポーズで固まったまま移動しています。
というわけでその3まで作成していたAnimatorもつなぎこみます。

まずAnimatorSetupをgontaにD&Dします.
するとこのようにAnimatorコンポーネントに登録されます。

スクリーンショット 2014-03-28 22.52.12.png

そしてCharacterSetup.csを以下のように変更します。

CharacterSetup.cs
using UnityEngine;
using System.Collections;

public class CharacterSetup : MonoBehaviour {

    private float speed = 6.0f;
    private Vector3 moveDirection;
    private CharacterController character;
    private Animator animator;

    // Use this for initialization
    void Start () {
        //Componentに登録されているCharacterControllerを取得します。
        character = GetComponent<CharacterController>();
        animator = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update () {
        // 上下キーが押されたら
        if(Input.GetAxis("Vertical") != 0){
            float varticalMove = Input.GetAxis("Vertical");
            animator.SetFloat("speed" , varticalMove);

            moveDirection = new Vector3(0 , 0 , varticalMove);
            moveDirection = transform.TransformDirection(moveDirection);
            moveDirection *= speed;
        }

        // 左右キーが押されたら
        if(Input.GetAxis("Horizontal") != 0){
            transform.Rotate(0 , 100 * Time.deltaTime * Input.GetAxis("Horizontal") , 0);
        }

        character.Move(moveDirection * Time.deltaTime);
    }
}

たった三行追加するだけですね。

CharacterSetup.cs
private Animator animator;
animator = GetComponent<Animator>();
animator.SetFloat("speed" , varticalMove);

変更出来たら実行してみましょう!

shot.png

走ったー!gontaが走りました!お疲れ様です!

何故走るのか?

CharacterSetup.cs
animator.SetFloat("speed" , varticalMove);

キモはやはりここになります。
Animatorを作成した時にspeedというパラメータを作成したのを
覚えているでしょうか?
そこに値を渡している、という処理になるのですが、
値を渡すだけでtransitionが働き、自動でIdle→Forwardと状態遷移を行ってくれます。
もちろんIsAttackというフラグを新たに作って攻撃遷移を作ったり、
ジャンプモーションなんか作る場合も、Animatorにパラメータを追加、cs側で値を受け渡すだけでOKです。
別のcsファイルからでも値を渡すだけ、別のゲームにAnimatorを持って行って値を貰えばその状態遷移が出来る、と再利用性の高さが最大のメリットだと思います。

その5につづく

次はゲームステージの作成と当たり判定などをやります。
今回長かった。分割すれば良かったかな。
多分その6ぐらいまで続きます…。

8
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8