Android
 Computer >> コンピューター >  >> トラブルシューティング >> Android

Unityで基本的なAndroidゲームを作る方法【初心者向け完全ガイド】

以前のAppual'sチュートリアル「How to Create a Basic Unity Platform Game」(およびそのパート2)では、Unityと内蔵のWebGLプラグインを使って、シンプルなHTML5ベースのブラウザゲームを作成する方法を解説しました。今回は同じ流れで、Unityを使って基本的なAndroidゲームを作成する方法をご紹介します。

必要なもの

  • Unity
  • NotePad++などのテキストエディタ(必須ではないが推奨)
  • Android SDK

まだインストールしていない場合は、まずUnity SDKAndroid SDKをダウンロードしてインストールしておきましょう。Android SDKは、作成したゲームのAPKをAndroid環境でテストするために必要です。

プロジェクトのセットアップ

Unityを起動し、新しいプロジェクトを作成します。2Dプロジェクトとして作成してください。

最初に慣れておきたいパネルがいくつかあります。

  • Hierarchyパネル: シーン内のすべての要素が表示されます(シーン=現在作業中の「レベル」)
  • Gameタブ: エディタ内でゲームをプレイ・テストするために使用します
  • Inspectorパネル: ライティングや物理演算など、さまざまな設定を編集する場所です

キャラクターと足場の作成

まずはスプライトを作成します。これが操作対象となるメインキャラクターになります。目のある四角形など、自分で描いてもよいですし、インターネットから素材を入手しても構いません。ただし、透明背景の.PNGファイルであることを確認してください。

スプライトをメインのSceneウィンドウ(一番大きなウィンドウ)にドラッグ&ドロップすると、左側のHierarchyパネルにも自動的に表示されます。

次に、いくつかプラットフォーム(足場)を作成しましょう。シンプルな四角形で十分です。後からサイズを自由に変更できるため、壁や別の足場として簡単に使い回せます。

新しい四角形のスプライトを作成し、キャラクターと同じようにSceneウィンドウにドラッグ&ドロップしてください。

物理演算(RigidBody2D)の追加

続いて、Unityに対してメインキャラクターに物理演算を与えるよう指示します。メインのスプライトをクリックして選択し(Sceneウィンドウで青くハイライトされます)、Inspectorパネルを開きます。

Add Component > Physics 2D > RigidBody2D」をクリックしましょう。これだけでスプライトに物理演算が追加されます。他のSDKでは自力でコードを書く必要のある処理が、Unityではワンクリックで完了します。

キャラクターが制御不能に回転してしまうのを防ぐため、InspectorパネルのConstraintsセクションにある「Freeze Rotation Z」にチェックを入れてください。

この状態で「Play」ボタンを押すと、キャラクターが空から落ちてきて、永遠に落下し続けるはずです。これは後ほど対処しますが、物理演算がいかに簡単に適用できたかに注目してください。なお、物理演算の挙動は形状に依存します。たとえば同じ設定を球体に適用すると、今度は転がり回ることになります。

コライダー(Collider)で着地できるようにする

キャラクターが永遠に落下しないようにするには、コライダーを追加する必要があります。これは物体の「固体の輪郭」であり、メインスプライトに追加していきます。キャラクターを選択した状態で「Add Component > Physics 2D > BoxCollider2D」をクリックしてください。

次に、先ほど作成した足場にもまったく同じ操作を行います。これでキャラクターが足場に「衝突」して、その上に留まるようになります。

カメラをキャラクターに追従させる

シーン内にはすでにカメラオブジェクトがあるはずなので、それをメインスプライトキャラクターの上にドラッグします。

これは特に3Dランナーゲーム(Slopeのように、カメラを常にメインオブジェクトの背後に維持する必要があるゲーム)を作る際に重要です。

Hierarchyパネルを開き、GameObjectの一覧でカメラをメインスプライトキャラクター(Player GameObject)の下にドラッグします。これにより、キャラクターがカメラの「」になります。以降、Player GameObjectが画面上を移動すると、カメラが自動的に追従するようになります。

移動スクリプトの作成

今回のチュートリアルでは、Run 3のような基本的なエンドレスランナーゲームを作成します。キャラクターが画面を走り抜け、障害物を避けます(障害物に触れると「ゲームオーバー」)。これにはいくつかのスクリプトが必要ですが、ほとんどのコードは本ガイドで提供します。

「Assets」フォルダを右クリックして新しいフォルダを作成し、Scriptsと名前を付けます。次にそのフォルダを右クリックし、「Create > C# Script」を選択してPlayerControlsと命名します。このスクリプトがメインキャラクターの挙動を定義します。

スクリプトをダブルクリックすると、通常はVisual Studioで開きます。お好みでNotePad++などの編集ツールを使っても問題ありません。

新規スクリプトにはすでに「ひな形コード」が含まれています。これは基本的にそのまま活用でき、開発の手間を大幅に省いてくれるものです。ここに新しい変数を追加していきましょう。

void Start() の行より上に、次の行を記述します:

public Rigidbody2D rb;

次に、Start() メソッド内にRigidbodyを取得するコードを追加します。これは「GameObject(メインキャラクター)にアタッチされた物理演算コンポーネントを探してこい」という指示であり、Start() はオブジェクトやスクリプトの生成時に一度だけ実行されます。

rb = GetComponent<Rigidbody2D>();

さらに、Update() 内に次の行を追加します:

rb.velocity = new Vector2(3, rb.velocity.y);

Update() は毎フレーム呼び出されるため、ここに書いたコードは(オブジェクトが破壊されない限り)継続的に実行されます。このコードは「Y軸の速度(rb.velocity.y)は現状のまま維持し、水平方向(X軸)の速度を3にせよ」という意味です。また、将来的には「FixedUpdate()」も利用できます。似た仕組みですが、こちらは更新間隔を制御できる点が異なります。

スクリプトを保存してUnityに戻り、メインキャラクターを選択します。Inspectorパネルで「Add Component > Scripts」から保存したスクリプトをアタッチしてください。Playボタンを押すと、キャラクターが足場の端に向かって走り続けるはずです。

ジャンプ操作(プレイヤー入力)の実装

障害物つきのエンドレスランナーゲームなので、「ジャンプ」ボタンなどの操作手段を追加する必要があります。

先ほどのスクリプトを開き直し、Update() メソッド内に次のコードを追記します:

if (Input.GetMouseButtonDown(0)) {

    rb.velocity = new Vector2(rb.velocity.x, 5);

}

これは「プレイヤーがマウスボタンをクリックしたとき(Androidでは画面タップとして認識されます)、キャラクターが空中に跳ぶようにせよ」という指示です。Y軸方向に値5の速度を加えているためです(数値を大きくすれば、より高くジャンプします)。

コーディングに不慣れな方のために補足すると、If文は「〜であれば実行する」という条件分岐です。プレイヤーがクリック(タップ)していなければ、この処理は実行されません。

「Play」ボタンを押して、正しく動作することを確認してから次へ進みましょう。

空中連続ジャンプを防止する(地面判定)

ここまでの実装での問題点は、ジャンプボタンを押すと接地しているかどうかに関わらずジャンプしてしまうことです。これはFlappy Bird式の挙動であり、ランナーゲームには不向きです。そこで地面判定を追加して修正します。

スクリプトのUpdate() メソッドのに、次の変数宣言を追加します:

public Transform groundCheck;
public Transform startPosition;
public float groundCheckRadius;
public LayerMask whatIsGround;
private bool onGround;

続いて、Update() メソッド内のif文より上に、次の行を追加します:

onGround = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, whatIsGround);

さらに、if文を次のように変更して「&& onGround」を含めます:

if (Input.GetMouseButtonDown(0) && onGround) {

スクリプト全体は、おおよそ次のようになります:

public class PlayerControls : MonoBehaviour
{
    public Rigidbody2D rb;
    public Transform groundCheck;
    public Transform startPosition;
    public float groundCheckRadius;
    public LayerMask whatIsGround;
    private bool onGround;

    void Start() {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update() {
        rb.velocity = new Vector2(3, rb.velocity.y);
        onGround = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, whatIsGround);
        if (Input.GetMouseButtonDown(0) && onGround) {
            rb.velocity = new Vector2(rb.velocity.x, 5);
        }
    }
}

解説すると、ここでは新しい「Transform」(ゲーム世界内の座標情報)を作成しました。判定用の半径を設定し、その範囲が「地面」レイヤーと重なっているかどうかをUnityに常時チェックさせています。groundCheckというTransformが地面レイヤーと重なっていればonGroundがtrueになり、ジャンプが可能になります。逆に、ジャンプ中で空中にいる間は二段ジャンプができない仕組みです。

スクリプトを保存してUnityに戻ると、プレイヤーを選択した際にInspectorに新しい項目(public変数)が追加されているのが分かります。これらは好みに合わせて調整できます。

地面判定オブジェクトの設置

Hierarchyを右クリックして空のGameObjectを作成し、Sceneウィンドウ内でキャラクターの下に配置します。床を検出したい位置に置いてください。オブジェクト名を「Check Ground」に変更し、先ほどカメラで行ったのと同じように、プレイヤーのGameObjectの下にドラッグして親子関係を作ります。これでCheck Groundはカメラと同様にキャラクターに追従しながら、常に地面との距離を監視します。

メインキャラクターを選択してInspectorを開き、Check Groundオブジェクトを「groundCheck」の欄にドラッグします。「Radius」の値は0.1に設定してください。

地面レイヤーの定義

次に、地面レイヤーを定義します。地面となる地形を選択し、Inspectorで「Layer: Default」のドロップダウンから「Add Layer」を選択します。

プラットフォームのレイヤーとして「ground」を指定し、シーン内の他の足場にも同じ設定を適用してください。さらに、メインキャラクター側の「whatIsGround」欄でも同じgroundレイヤーを選択します。

これで、画面上の小さな判定ポイントがgroundレイヤーのオブジェクトと重なっている場合にのみジャンプが発動するようになりました。

衝突時のゲームオーバー処理とゲームメニュー

最後に仕上げとして、A: 障害物との衝突でゲームオーバーになる処理、B: 「もう一度プレイ」ボタン付きのゲームオーバーメニュー画面を作成します。

基本的な手順は以下の通りです:

  1. Playerオブジェクトを用意し、任意のRigidbodyColliderを割り当てます。
  2. Enemyオブジェクトを追加し、同様にRigidbodyColliderを割り当てます(任意で「Enemy」タグを付けておくと管理が楽です)。
  3. 新しいC#スクリプトを作成してPlayerにアタッチします(既存のPlayer用スクリプトがあれば、新規作成は不要です)。
  4. スクリプトに以下のコードを追加します:
void OnCollisionEnter2D(Collision2D coll){

    Debug.Log("Collision"); // 衝突が検知されているか確認用。動作確認できたら削除可

    if(coll.gameObject.tag == "Enemy"){ // 衝突相手が「Enemy」タグを持つか判定。
        // タグではなく名前で判定することも可能だが、タグの方が手軽で確実
        // ここにゲームオーバー処理を記述する:
        SceneManager.LoadScene("GameOver");
        Debug.Log("Working"); // 動作確認用。確認後は削除可
    }
}

※旧バージョンのUnityで使われていた Application.LoadLevel() は廃止されているため、現在は SceneManager.LoadScene() を使用するのが標準です(要:using UnityEngine.SceneManagement;)。

このサンプルスクリプトをいろいろと試してみてください。試行錯誤を重ねながら、目的の動作に仕上げることができます。

Playボタン付きのGameOver「レベル」の具体的な作成方法については、Appual'sガイド「How to Create a Basic Unity Platform Game Pt. 2」の最終セクションを参照してください。

  1. Android でゲームをハックする方法

    あなたが Android フォンを使用しているゲーマー兼コーダーである場合、従来の広告の中断を回避するオプションや、ゲームに関するその他のオプションを確実に検索するでしょう。この記事を使用すると、Android フォンでゲームをハッキングする方法と、ハッキング ツールを使用してゲーム体験を強化する方法を知ることができます。特定のレベルで行き詰まっていて、簡単に次のレベルに進みたい場合は、ここにリストされているアプリを使用してゲームをハックできます。そのようなアプリの 1 つに Lucky Patcher があります。Lucky Patcher を使用してゲームをハッキングする方法についても詳し

  2. 「Learn Math App: Game of Numbers」で基本的な算術演算を楽しく学ぶ方法

    数学が苦手ですか?実は私も数字やその扱い方には苦手意識がありました。しかし、数学から逃げるのは解決策ではありませんし、それをお子さんに教えてしまうわけにもいきません。そこでご紹介したいのが、Systweakが開発した「Learn Math App」。お子さんが数学に興味を持つきっかけを作り、便利なコツも一緒に学べる楽しいアプリです。お子さんが問題を解いてメダルを獲得する様子を見守りながら、保護者の方自身もゲームを試してみれば、数学への苦手意識を軽減できるかもしれません。 Learn Math Appの特徴と仕様 Learn Math Appは、小学1年生から中学2年生(グレード1〜8)までの