ハムスターの捕獲
操作キャラクターがハムスターに触れた場合の処理を追加していきます。
ハムスターに触れた場合に「得点を加算する」「捕まえた数を表示する」「ハムスターを画面から消す」などが考えられますが、今回はハムスターを非表示にすることにします。
GameObjectの削除
ハムスターの非表示処理はGameObjectを削除することで実装します。CharactorManager.csのOnCollisionEnter2Dメソッドを以下のように修正します。
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メソッドがこれまで床との接触しか考慮していなかったのが原因です。
問題の個所は以下です。
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にも同じ判定を追加します。
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の削除、プログラムの修正に対して発生したバグの修正について紹介しました。
次回はゲームの経過時間を表示するタイマー処理について紹介していきます。
