キャラコントロールも出来るところでゲームを終わらせるためのゴール処理を追加しましょう。また今後ゲームの進行処理を行うためのスクリプトも作成します
ゴールをするための処理を実装する
ここではゲーム全体の流れを管理するためのスクリプトとゴール自身のスクリプトを作成します。ゲーム全体の流れはゴールしたときに呼ばれる処理を書くのみですが、今後処理が増えていく予定です。
ゲームの流れを管理するGameMain
ゲームの流れというのは今回作成するゴールの処理や一時停止など、ゲーム全体に関わる処理を行います。
using UnityEngine;
public class GameMain : MonoBehaviour
{
public void OnGoal()
{
Debug.Log("ゴールしました");
}
}
ゴールからGameMainにゴールしたことを通知する
ゴールの当たり判定にプレイヤーが接触したら、GameMainにそのことを通知します。このあたりの実装方法はいくつかありますが、プレイヤーが自分自身でゴールしたことを通知するのではなく、ゴール側がゲームを管理する処理に通知して、そこから必要な制御を行うようにします。
ゴールは何かと当たった時、相手側のタグが「Player」が設定されている場合にゴールしたことを主張します。
using UnityEngine;
public class GoalController : MonoBehaviour
{
private void OnTriggerEnter2D(Collider2D _collision)
{
if(_collision.CompareTag("Player"))
{
GameMain gameMain = GameObject.FindObjectOfType<GameMain>();
gameMain.OnGoal();
}
}
}
- ゴール側から通知するメリットはありますか?
-
ゲーム内に複数ゴールが存在し、次の行き先がゴールごとに異なる設定などを行いたい場合にゴール側に設定を入れることで処理を細分化しやすくなります。現在はどのゴールも特に違う処理をしておりませんが拡張により可能です。
ゲーム内に2つのスクリプトを設定する
上記2つのスクリプトを作成できたらゲーム内に配置してゴールのログが表示されるようにしてみましょう。
GameMainをセットする
GameMainは空のゲームオブジェクトを作成してAdd Componentしてください。性質上シーン内に1つしか存在してほしくないので間違って2つ以上貼り付けないように注意してください。
本当に2つあるとまずい場合はシングルトンというものをがあります。デリケートな実装が必要な場合はシングルトン化を行いましょう。
GoalControllerをセットする
こちらは必ずゴールの画像のあるオブジェクトに貼り付けてください。ゴールはプレファブ化を行っている場合プレファブ自身にスクリプトをアタッチするだけでシーン内にも反映されます。アタッチする際、最も重要なのはGoalControllerをアタッチする同インスペクター内にBoxCollider2D(当たり判定)のコンポーネントが存在するかどうかです。BoxCollider2DがないとOnTriggerEnter2Dのメソッドが呼ばれません。注意してください。
動画確認してみましょう
2つのスクリプトが正しくセットされていれば、ゲームを動かしてプレイヤーがゴールに触れたタイミングで「ゴールしました」のログが表示されるはずです
コメント