CodeZine(コードジン)

特集ページ一覧

速習 Unity 2Dゲーム開発
~第10回 ターゲットキャラクターの表示(後編)

速習 Unity 2Dゲーム開発 第10回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2015/02/09 14:00
目次

ハムスターの捕獲

 操作キャラクターがハムスターに触れた場合の処理を追加していきます。

 ハムスターに触れた場合に「得点を加算する」「捕まえた数を表示する」「ハムスターを画面から消す」などが考えられますが、今回はハムスターを非表示にすることにします。

GameObjectの削除

 ハムスターの非表示処理はGameObjectを削除することで実装します。CharactorManager.csのOnCollisionEnter2Dメソッドを以下のように修正します。

hamsterの削除処理
public void OnCollisionEnter2D(Collision2D col)
{
    // hamsterに触れた場合は削除
    if (col.gameObject.name == "hamster")
    {
        Destroy(col.gameObject);
    }

    this._collisionList.Add(col.gameObject);

    this._isJumping = false;
}

 GameObjectの削除はDestroyメソッドで行います。GameObjectの削除をCharactorManagerで行うかGameManagerクラスで行うかは検討が必要なところですが、今は処理を行いやすいCharactorManagerに記述して、後ほど検討することにします。

 デバッグしてキャラクターがハムスターに触れた際にハムスターが画面から消えることを確認してみましょう。

バグ修正

 デバッグをしばらく続けて行くと、ハムスターを捕まえた後、キャラクターがジャンプ中にスペースキーを押すとさらにジャンプしてしまうという現象が確認できました。

 これはCharactorManagerクラスのOnCollisionEnter2Dメソッドがこれまで床との接触しか考慮していなかったのが原因です。

 問題の個所は以下です。

OnCollisionEnter2Dの問題の箇所
this._collisionList.Add(col.gameObject);

this._isJumping = false;

 ハムスターが追加された場合にもthis._collisionListにGameObjectを追加してしまっているので後の判定で、キャラクターがジャンプ中であるとみなされていないようです。

キャラクターが床から離れた際にジャンプ中と判定している処理
public void OnCollisionExit2D(Collision2D col)
{
    this._collisionList.Remove(col.gameObject);

    // 接触しているGameObjectが0の場合はジャンプしていると判定してアニメーションを開始する
    if (this._collisionList.Count == 0)
    {
        this._isJumping = true;
    }
}

 Destroyメソッドでhamsterを削除した場合にOnCollisionExit2D(接触していたGameObjectが離れた際に呼び出される)メソッドが呼び出されないことに注意しましょう。

 バグを回避するため、以下のようにコードを修正しました。

床の場合にリストを更新する
public void OnCollisionEnter2D(Collision2D col)
{
    // hamsterに触れた場合は削除
    if (col.gameObject.name == "hamster")
    {
        this._collisionList.Remove(col.gameObject);
        Destroy(col.gameObject);
    }
    else if (col.gameObject.name == "ground" || col.gameObject.name == "floor")
    {
        this._collisionList.Add(col.gameObject);

        this._isJumping = false;
    }
}

 GameObject名がgroundとfloorという床として判定します。同じくOnCollisionExit2Dにも同じ判定を追加します。

GameObjectが離れた場合も、床の場合にリストを更新する
public void OnCollisionExit2D(Collision2D col)
{
    if (col.gameObject.name == "ground" || col.gameObject.name == "floor")
    {
        this._collisionList.Remove(col.gameObject);

        // 接触しているGameObjectが0の場合はジャンプしていると判定してアニメーションを開始する
        if (this._collisionList.Count == 0)
        {
            this._isJumping = true;
        }
    }
}

まとめ

 今回でターゲットとなるキャラクターのハムスターの処理は完了です。レイヤーと、GameObjectの削除、プログラムの修正に対して発生したバグの修正について紹介しました。

 次回はゲームの経過時間を表示するタイマー処理について紹介していきます。



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

バックナンバー

連載:速習 Unity 2Dゲーム開発

もっと読む

著者プロフィール

  • 西村 誠(ニシムラ マコト)

     Microsoft MVP Windows Platform Development。  Flash、PHPの開発経験もあり国産ECサイト構築フレームワーク「EC-CUBE」の公式エバンジェリストでもある。  ブログ:眠るシーラカンスと水底のプログラマー  著書:基礎から学ぶ Windows...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5