Unityで2Dアクションゲームを作ろう② ~障害物の配置とスコアの表示~


Unityで横スクロールアクションゲームを作ろう②

Unityで2Dアクションゲームを作成する際に使用した方法やロジックなどを紹介していきます。
※注意 Unity4の頃に作ったものなので、いろいろと古いです。

Unityで2Dアクションゲームの作成②


前回はキャラクターの配置や移動と操作についてまとめました。
Unityで2Dアクションゲームを作ろう① ~キャラクターの配置と移動と操作~

今回はステージに配置する障害物と、特定領域の通過でスコアを加算する仕組みについてまとめていきます。

障害物とスコアについて


今回作成したゲームの障害物は一種類だけです。
画面右側から現れて、プレイヤーが障害物の間を通り抜けることで点数が加算されます。
画面左下にはハイスコアが表示されます。左上の通常のスコアと違い、ゲームをリロードしてもリセットされません。

障害物の作成


障害物のオブジェクトを作成します。

Wallオブジェクトの作成

  1. [Hierarchy]→[Create]→[3D Object]→[Quad] を選択してQuadオブジェクトを2つ作成します。
    名前を”WallUp”と”WallDown”に変更しましょう。
  2. パラメータを下図のように変更します。タグがついていることに注意してください。※3.参照
    WS000044 WS000045
  3. Tagの設定
    TagのプルダウンからWallを選択します。
    Wallタグがない場合は、[Tag]→[Add Tag…]→[+] をクリックして、名前を”Wall”としたタグを作成しましょう。
  4. Collider(コライダー)の設定
    WallUpとWallDownに[Add Component]→[Physics2D]→[Box Collider2D] を追加
  5. シーン再生して、WallオブジェクトとPlayerが衝突するか確認しましょう。
  6. ”Floor”というタグも作成して、前回作成したFloorオブジェクトにもタグ付けをしておきましょう。
    WS000062

カウントゾーンの作成


カウントを加算するエリアの作成をします。
透明なオブジェクトを配置して、Playerが通過する領域を作成するイメージです。

CountZoneオブジェクトの作成

  1. [Hierarchy]→[Create]→[Create Empty] を作成
    名前を”CountZone”に変更しましょう。
  2. Collider(コライダー)の設定
    [Add Component]→[Physics2D]→[Box Collider2D] を追加します。
  3. パラメータを下図のように変更します。
    ※タグやIs Triggerのチェックに気を付けましょう。
    WS000046
    Is Trigger : 衝突せずに突入判定だけ行う場合にチェックする
  4. シーンを再生して、PlayerがCountZoneオブジェクトに衝突しないことを確認しましょう。
  5. WallUp、WallDown、CountZoneは、3つで1セットのオブジェクトとして配置することになるので、
    入れ子構造にしておきましょう。
    [Hierarchy]→[Create]→[Create Empty] を作成して、名前を”Wall”に変更します。
  6. ヒエラルキービューでWallUp、WallDown、CountZoneの3つを、今作成したWallオブジェクトにドラッグ&ドロップします。
    WS000056
    ※Wallが親、 WallUp, WallDown, CountZoneが子の入れ子構造となります。
    ※入れ子構造にすると、子要素が親要素の座標やサイズの影響をうけるため、子要素のパラメータを個別に変更する可能性がある場合はこのように空のオブジェクトの子要素にしておいた方が後々編集しやすいです。
    もしWallDownをWallUpの子要素にしてしまうと、WallUpのサイズを変えた時にWallDownのサイズも変わってしまいます。

スコアの作成


続いてスコアの作成をします。
まずは画面にスコアを表示させるところから始めましょう。

Scoreオブジェクトの作成

  1. Scoreの表示
    [Hierarchy]→[Create]→[Create Empty] を作成し、名前を”ScoreGUI”に変更します。
  2. GUI Textの設定
    ScoreGUIオブジェクトを選択して、[Add Component]→[Rendering]→[GUI Text] を追加
  3. パラメータを下図のように設定
    WS000047
  4. Gameビューで”0”が表示されていることを確認しましょう。
    WS000064

続いて、スコアに適用するスクリプトを作成します。
このスクリプトを適用するとプレイヤーがCountZoneに突入するスコアの表示が+1されます。

  1. Player.csにもCountZone通過の際にPlayer.csからScore.csにカウントのメッセージを飛ばす処理を追加します。
    Player.cs

    // ColliderのIs Triggerにチェック有のオブジェクトとの衝突を検出する関数
    void OnTriggerEnter2D(Collider2D col){
    
    	// CountZoneのタグが付いたオブジェクトと衝突したとき
    	if(col.gameObject.tag == "CountZone"){
    
    		// ScoreスクリプトのAddScore関数に値を送信する
    	 	GameObject.Find("ScoreGUI").SendMessage("AddScore", 1);
    	}
    }
    

    24行目のOnTriggerEnter2Dは、Is Triggerにチェック有りのオブジェクトとの衝突を検出する際に使用します。
    その下の27行目で"CountZone"タグがついたオブジェクトの衝突ならばという条件分岐をしています。
    Player.csの30行目の処理はScore.csのAddScoreメソッドに引数1を渡しています。
    Score.csは15行目の引数int sで送られてきた1を受け取っています。スコアの加算を行っています。

  2. 作成したScore.csに以下のスクリプトを記述します。
    ※この時、4行目のクラス名と作成したファイル名が一致していないとエラーになるので気を付けましょう。
    Score.cs

    using UnityEngine;
    using System.Collections;
    
    public class Score : MonoBehaviour {
    
    	public GUIText scoreGUI;
    	private int score;
    
    	// シーン開始時に一度だけ呼ばれる関数
    		void Start(){
    		score = 0;
    	}
    
    	// スコアの加算
    		void AddScore(int s){
    		// 現在のスコアをsを足したものに更新
    		score = score + s;
    	}
    
    	// シーン中にフレーム毎に呼ばれる関数
    		void Update () {
    		// スコアの表示
    		scoreGUI.text = "" + score;
    	}
    }
    
  3. プロジェクトビューで右クリックから、[Create]→[C# Script] を選択して、名前をScoreにします。
    ※先頭を大文字にすることに注意しましょう。
  4. 作成したスクリプトをScoreGUIオブジェクトに適用しましょう。
    ※適用するとインスペクタービューにScore (Script)が表示されます。Score GUIの項目にScoreGUIオブジェクトをドラッグ&ドロップで追加しましょう。
    WS000069
  5. シーンを再生してPlayerがCountZoneを通過した際にスコアが加算されることを確認しましょう。

まとめ


障害物の配置とスコアの表示については以上です。
シリーズ後半でハイスコア機能についても実装する予定です。

次回は マテリアルと追従するカメラの設定編 です。

今月の新着記事

【Unity認定試験対策】業界情報のチャプターで出題される用語の解説
【解けないとマズいレベルの練習問題】C# 練習問題 8
【Unity認定試験対策】Unity 練習問題 11 - Animator -
【Unity認定試験対策】Unity 練習問題 12 - Navmesh -

記事一覧にもどる

  • このエントリーをはてなブックマークに追加

PAGE TOP