Google+ もご覧ください
ユーザーアイコン

Unityではじめるゲーム開発

Unityで玉転がしゲームを作ってみよう - その3(完結)

Nakamura001

Unityで玉転がしゲームを作ってみよう - その3(完結)

前回の記事から引き続きの内容と成っています。前回の記事が未読の方は先にそちらをご覧下さい。

ゴールを作成する

ゴール地点はパーティクルで表現する事にします。パーティクルの画像データなどは Unity に同梱されている Pakage のものを使う事にします。

ゴール
ゴール

Project ビューで右クリックしImport PakageParticlesと選択し、全データをインポートして下さい。

Project ビューから /Assets/Standard Assets/Particles/Sparkles に有るSparkle Risingを Hierachy ビューに追加し、 Inspector のパラメータを以下の様に変更します。

  • 名前:Goal
  • Position:
    • X : 12
    • Y : 1.2
    • Z : 2.5

続いて当たり判定用にSphere Colliderを追加しておきます。衝突時の処理は自前で行いますので Inspector でIs Triggerにチェックを付けておきます。ここまでの設定を行うと Inspector はこの様に成っているはずです。

ゴールの設定
ゴールの設定

ゴール時に「GAME CLEAR」と表示する

ゴールに衝突した時にはGAME CLEARの文字を表示する事にします。

GUI Textを Hierachy ビューに追加し、 Inspector のパラメータを以下の様に変更します。

  • 名前:GameClearText
  • Text:GAME CLEAR
  • Anchor:middle center
  • Alignment:center
  • Font Size:50
  • Color
    • R:60
    • G:255
    • B:43

この文字はゲーム開始時には表示したく無いのでInspectorでチェックを外し、非アクティブにしておきます。

非アクティブ
非アクティブ

ゴールしたタイミングで表示したいので PlayerAction.cs のコードに以下の様に public で GUIText を追加し、 Inspector で先ほど作成したGameClearTextを設定します。

public class PlayerAction : MonoBehaviour {
    public GUIText gameClearText;

ゲームをクリアした後にはユーザからの入力を受けない様にしたいので Update() の先頭でフラグチェックをし、ゴールした後には何も処理をしない様にします。

以下の様にフラグに使用する gameClear を追加します。

public class PlayerAction : MonoBehaviour {
    public GUIText gameClearText;
    bool gameClear = false;

また、 Update() の先頭にフラグチェックの処理を追加します。

    void Update () {
        if (gameClear) return;

ゴールに衝突した時の処理は OnTriggerEnter() で行います。以下の記述を追加して下さい。

    IEnumerator WaitAndReloadScene() {
        yield return new WaitForSeconds(2.0f);
        Application.LoadLevel(Application.loadedLevel);
    }

    void OnTriggerEnter(Collider other) {
        rigidbody.Sleep();
        gameClear = true;
        gameClearText.gameObject.SetActive(true);
        StartCoroutine(WaitAndReloadScene());
    }

OnTriggerEnter() で行っている処理としては最初に rigidbody.Sleep() で Player にかかっている物理の力をゼロにして Player (球)の動作を止めます。 gameClear = true とする事でそれ以降、 Player の入力処理が行われなく成ります。その後に非アクティブにしていた gameClearText をアクティブにする事でGAME CLEARの文字を表示させています。最後に StartCoroutine(WaitAndReloadScene()) で2秒間待った後に現在表示中の Scene を再度読み込む事によりゲームをリスタートさせています。

ここまでの作業が終わったらゲームを実行してみましょう。ゴールに到着したらGAME CLEARが表示され、少し時間を空けてゲームがリスタートされるはずです。

タッチを使った移動を実装する

このゲームは最終的には iPhone や Android などモバイルデバイス向けにビルドを予定しています。現在はキーボード入力で操作しているのでこの部分をタッチでも操作出来るように処理を追加します。

実装としてはジョイスティックの画像を表示し、それを指先でドラッグする事で操作するという実装にします。

ジョイスティックの画像を配置した状態
ジョイスティックの画像を配置した状態

画像データは Unity に付属している Pakage から利用する事にします。Projectパネルで右クリックし、Import PakageStandard Assets (Mobile)と選択、インポートファイルの選択画面でNoneボタンを押して一度全部の選択を解除した後に最後の辺りに有る JoystickThumb.psd のみをチェックした状態でインポートを実行します。

 JoystickThumb.psd をインポート
JoystickThumb.psd をインポート

インポートが終わったら JoystickThumb.psd を選択した状態で GUI Texture を生成して下さい。これで名前がJoystickThumbとなった GUI Texture が生成されるはずです

JoystickThumbのパラメータは以下の様に変更します。

  • Position
    • X : 0.1
    • Y : 0.17
    • Z : 0

※ Positionの位置は最終的に実行する環境の画面のサイズに合わせて調整して下さい。ここでは 1136x640 (iPhone 5以降相当)のサイズとして設定しています。

※ 今回は省略しましたが本来はRetinaディスプレイ環境向けにはx2倍サイズの画像に差し替える必要が有ります。今回は差し替えていない為、 Unity の IDE 上で表示したものに比べて半分のサイズで表示されます。

画像についてはこれで準備が出来ました。コードについては Standard Assets (Mobile) に含まれている Joystick.js のコードを使う事にします。

今回はC#でコードを書いているので JavaScript と混在して使用すると色々と対応が大変なので Joystick.js のコードを C# に変換したファイルJoystick.csを準備しました。こちらをダウンロードしてプロジェクトに追加して下さい。

プロジェクトに追加した Joystick.cs は先ほど作成したJoystickThumbにドラッグして下さい。

続いて PlayerAction.cs のファイルを開き、 Joysitck のフィールドを追加します。

public class PlayerAction : MonoBehaviour {
    public Joystick joystick;
    public GUIText gameClearText;

Playerの Inspector を表示し、 Joystick の項目にJoystickThumbドラッグします。

 Player の Inspector でジョイスティックをセット
Player の Inspector でジョイスティックをセット

Update() の if (grounded) {} の部分の記述を以下の様に変更します。

    void Update () {
        if (gameClear) return;
        if (grounded) {
            var x = Input.GetAxis ("Horizontal") * Time.deltaTime * movePower;
            var z = Input.GetAxis ("Vertical") * Time.deltaTime * movePower;
            if (x == 0) {
                x = joystick.position.x * Time.deltaTime * movePower;
            }
            if (z == 0) {
                z = joystick.position.y * Time.deltaTime * movePower;
            }
            rigidbody.AddForce(x, 0, z);
        }

        if (Time.time - lastGroundedTime > 2.0f) {

Input.GetAxis() による入力が無い場合に Joystick の入力を反映させる様に記述してあるので PC のキーボードでの操作、モバイルデバイスで Joystick の画像のドラッグによる操作のいずれの方法でもテスト可能です。

これでモバイルデバイス向けの対応が完了しました。ビルドして実機で動作させてみましょう。

 iPhone で実行した時の画面
iPhone で実行した時の画面

Unity Remoteを使う

今回の様にモバイルデバイスのタッチ入力を使うアプリを作る場合には Unity Remote (iOS版の最新版のアプリ名は「Unity Remote 3」)を活用すると効率的に開発する事が出来ます。このアプリを使うとタッチパネルでの操作や加速度センサーのデータを Unity の IDE に送る事が出来ます。

そのためゲーム自体は PC 上の IDE 内で実行し、 Player の操作はモバイルデバイスから行う事が可能に成ります。

Unity Remote は iOS と Android 版が有り、それぞれ以下のページからダウンロード出来ます。

iOS版

Android版

アプリをインストールした後に Unity の IDE を起動している PC と同一の無線LANにモバイルデバイスを接続した状態でこのアプリを起動します。すると Unity Remote にネットワーク一覧が表示されるので該当のアクセスポイント名を選択すれば準備は完了です。 IDE 上でゲームを実行すると自動的にその画面が Unity Remote にも表示されます。

iOS版Unity Remoteのネットワーク選択画面
iOS版Unity Remoteのネットワーク選択画面

しかし、 Unity Remote 上に表示されたゲームの画面は実際のゲーム画面に比べ低解像度であり、画面更新頻度も少ないです。基本的に Unity Remote では加速度センサーやタッチの入力のみに活用し、ゲーム画面は IDE 内の Game ビューに表示されているものを見るようにしましょう。

Unity Remoteのゲーム実行中の画面
Unity Remoteのゲーム実行中の画面

今回のゲームの場合には Unity Remote に表示されたスライドパッドの画像をドラッグさせるとその操作が IDE 上で実行されているゲームに反映されます。

Unity でモバイルデバイス向けのアプリをビルドするのはかなり時間がかかってしまいます。そのためUnity Remote が利用可能な場面では積極的に活用して効率的に開発を進めましょう。

「Unityで玉転がしゲームを作ってみよう」は今回で終了です。完成したプロジェクトをこちらに置いておきます。もし、ここまでの作業が上手く行かなかった場合には記事とこのプロジェクトとを見比べながら確認してみて下さい。

Unity
タグ:

記事をリクエストする

関連記事

コメント