【はじめてのUnity入門】
第25回 横方向にキャラクターを操作する

少しずつ、ゲームっぽくなってきましたよ

こんにちは!

最近世間のニュースでは日韓関係が冷え込むなか、生まれて初めて韓国語の勉強を始めたのですが、 「激音」と「濃音」がわからなすぎて毎日まくらを濡らしているあらたまです。

さて、今日はUnity入門の第25回目。キャラクターを操作できるようにしていきましょう!

おさらい

前回 は忍者のキャラクターを配置し、地面とキャラクターにRigidbodyコンポーネントを追加しておわりましたね。

今回は、キャラクターを横方向に操作できるようにしたいと思います!

第14回との違いは?

キャラクターの操作は 第14回 でもやりましたね。

コンポーネントを作成して、それをゲームオブジェクトに追加する、 という流れはそのときと同じです。

今回は、そのときと少し違って
・キャラクターの移動に物理演算を使う
・キャラクターが回転しないようにする
ということをやってみたいと思います!

スクリプト(プログラム)を置くサブフォルダの作成

まずはファイルの場所があとでわかりやすいように、スクリプトを置くようのサブフォルダを作成しておきましょう。

プロジェクトウィンドウで「Assets」を選択します。

「Assets」メニューの「Create」から「Folder」をクリックします。

作成されたフォルダーの名前を「Scripts」に変えておきましょう!

スクリプトファイルを作成する

次に、スクリプト(プログラム)ファイルを作成します。

プロジェクトウィンドウでさきほど作った「Scripts」フォルダを選択します。

「Assets」メニューの「Create」から「C# Script」をクリックします。

作成されたファイルの名前を「CharaControl」に変えておきましょう!

スクリプトファイルを編集する

それでは、スクリプトファイルにキャラクターの操作処理をプログラミングしていきます。

プロジェクトウィンドウでファイルをダブルクリックするか、インスペクターウィンドウで「Open」をクリックします。

スクリプトの編集画面(プログラミング画面)が表示されました!

下のようにプログラミングしてください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CharaControl : MonoBehaviour {

    // キャラクターの移動スピード(インスペクターウィンドウで値を設定)
    public float speed;

    // Rigidbody2Dを保持するメンバ変数
    private Rigidbody2D rb2d;

    // コンポーネントの初期化処理
    void Start()
    {
        // ゲームオブジェクトが持っているRigidbody2Dコンポーネントを
        // 取得してメンバ変数に保持
        rb2d = GetComponent<Rigidbody2D>();
    }

    // 画面表示更新処理
    void FixedUpdate()
    {
        // 横矢印キーの押されている状況を取得
        float moveHorizontal = Input.GetAxis("Horizontal");

        // AddForceメソッドに渡すために、Vector2型に変換
        Vector2 movement = new Vector2(moveHorizontal, 0);

        // AddForceメソッドでキャラクターのRigidbody2Dコンポーネントに力を加える
        rb2d.AddForce(movement * speed);
    }
}

スクリプトの内容

スクリプトの内容を見てみましょう。

Startメソッド

Startメソッドは、コンポーネントが初めて動作する前にUnityから呼び出されるメソッドです。 コンポーネントの動作に必要な初期化をここで行います。

GetComponentメソッド

Startメソッド内で呼び出されているGetComponentメソッドは、 自分が紐づけられたゲームオブジェクトから別のコンポーネントを取得できるメソッドです。
「<>」の中で、取得したいコンポーネントを指定しています。 ここではRigidbody2Dコンポーネントを取得していますね。

FixedUpdateメソッド

FixedUpdateメソッドは、一定時間間隔ごとにUnityから呼び出されるメソッドです。 この中に処理を書けば一定時間ごとに繰り返し実行させることができます。

Input.GetAxis("Horizontal")メソッド

横方向キーの押されている状態を取得します。 押されている時間に応じて0.0F~1.0F、0.0F~-1.0Fの値を返します。 徐々に値が増えるので、このメソッドを使うことで徐々に加速して移動させることができます。

AddForceメソッド

Rigidbody2Dに物理的力を加えています。 その力によってゲームオブジェクトが移動するわけですね。

ゲームオブジェクトにコンポーネントを追加する

それでは、作成したコンポーネントをゲームオブジェクトに追加しましょう!

シーンビューでキャラクターを選択して、インスペクターウィンドウの"Add Component"ボタンをクリックします。

"Scripts"をクリックします。

"Chara Control"をクリックします。

移動スピードを表す「Speed」に10を設定しておきましょう。

テストプレイで動作確認をする

では、テストプレイしてみましょう!

▶ボタンを押して、プレイモードに入ります。

キーボードの矢印キーを押すと、キャラクターを操作できました! 。。がこけちゃいました。

キャラクターが回転しないようにする

このゲームではキャラクターが回転する必要がありませんので、 回転自体を無効にしてしまいましょう。

シーンビューでキャラクターを選択して、インスペクターウィンドウの"Rigidbody 2D"で 「Freeze Rotation(意味:回転を固定する)」の「Z」のチェックを入れます。

では、もう一度テストプレイしてみましょう!

▶ボタンを押して、プレイモードに入ります。

無事、矢印キーで左右にキャラクターを操作できました!

ところが。。?

右に左に操作していると、ときどき動かなくなるときがあります。なぜでしょう。

実はこれ、タイルのつなぎ目に引っかかってる状況だったりします。

これを回避するためには、Colliderコンポーネント(衝突検知)について もう少し詳しく見ていく必要があります。

次回はそのあたりをご説明して、ひっかかりを解決していきたいと思います!

次回へ続く。

第26回 Colliderコンポーネントの種類を変える