LoginSignup
6
6

More than 5 years have passed since last update.

Unityのロードランナー風ゲームでお宝を全部取得したらハシゴとゴールが表示されるようにする

Posted at

はじめに

前回からの続きです。

今回は、お宝を全部取得した時に、新たなはしごを出現させて、ゴールも出現させるようにしてみます。
あと、敵キャラも配置するようにしました。

方針

宝を全て取得したら出現するはしご(隠れはしご、と呼びましょう)とゴールは最初にStageデータに記述しておきます。
Stageを最初構築する際に、「設置はしておくけど表示しない」ようにしておいて、「宝を全て取得したら表示する」と良さそうです。

Goalオブジェクトには、Playerとの当たり判定を付けておいて、当たったらクリアということにします。

Goalの作成

オブジェクトの作成

なんでも良いので、GoalになるObjectを作ってPrefab化しておきます。
StageControl.csに、その他のObjectと同様に関連付けしておいて、Stage構築時に描画できるようにしておきます。

今回は手抜きですが、以下のようなものをGoal Objectにしました。

Stage_unity_-_RoadRunner_-_Web_Player.png

衝突判定用のColliderを付けておき、'trigger'にチェックを入れておきます(はしごや宝と同じ)。

GoalControl

このGoalにPlayerが到達したらStageクリアです。とりあえず、以下のように StageControllerのPlayerHitGoal()を呼ぶようにしておきます。

GoalControl.cs
public class GoalControl : MonoBehaviour
{
    void OnTriggerEnter(Collider other) {
        if (other.gameObject.tag == Tag.PLAYER) {
            Global.stageControler.PlayerHitGoal();
        }
    }
}

宝を全て取得したら出現するようにする

初期のStage配置時に、"隠れはしご"と"Goal"は表示されないようにします。
GameObject#SetActive(bool)を使えば良さそうです。そして、最後の出現させるべきGameObjectを hiddenObjectsというListに入れておきます。

StageController.cs

    void BuildStage(string stageData) {
        ...
                    case HIDDEN_LADDER:
                    case GOAL:
                        instance.SetActive(false);
                        hiddenObjects.Add(instance);
                        break;

お宝を全てGETしたら、showGoal()を呼び出して、そこでは hiddenObejcts に対してSetActive(true)を呼びます。
これで隠れはしごとGoalが表示されるようになります。

StageController.cs
    public void PlayerGotTreasure() {
        numTreasure--;
        Global.score += 100;

        if (numTreasure == 0) {
            showGoal();
        }
    }

    private void showGoal() {
        foreach (var obj in hiddenObjects) {
            obj.SetActive(true);
        }
    }

またPlayerHitGoal()では、Stage Clear処理を書きます。
とりあえず、UnityChanをズームアップして、3秒くらいWaitするようにします。3秒したらまたStageを再ロードさせます。

なんか流れ的やっつけ仕事で Global.paused というのも作ってしまいました。
本当は何がやりたいかはっきりさせて、もう少し考えるべきですね。

StageController.cs

    public void PlayerHitGoal() {
        cameraObject.camera.fieldOfView = 40;
        Global.paused = true;
        loadNextAt = Time.time + 3;
    }

ついでに敵も配置する

せっかくなので敵も配置するようにしました。何度も繰り返しになるので詳細は割愛しますが、修正は以下の部分になります。
https://github.com/mokemokechicken/UnityChanRoadRunner/commit/d27d6f0d0f2e031d1717f03ac2a1f86c4baf1a89

さいごに

一応敵もいるし、クリアもあるので、ゲームみたいなものになってきた気がします。

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6