はじめに
前回からの続きです。
今回は、お宝を全部取得した時に、新たなはしごを出現させて、ゴールも出現させるようにしてみます。
あと、敵キャラも配置するようにしました。
方針
宝を全て取得したら出現するはしご(隠れはしご、と呼びましょう)とゴールは最初にStageデータに記述しておきます。
Stageを最初構築する際に、「設置はしておくけど表示しない」ようにしておいて、「宝を全て取得したら表示する」と良さそうです。
Goalオブジェクトには、Playerとの当たり判定を付けておいて、当たったらクリアということにします。
Goalの作成
オブジェクトの作成
なんでも良いので、GoalになるObjectを作ってPrefab化しておきます。
StageControl.csに、その他のObjectと同様に関連付けしておいて、Stage構築時に描画できるようにしておきます。
今回は手抜きですが、以下のようなものをGoal Objectにしました。
衝突判定用のColliderを付けておき、'trigger'にチェックを入れておきます(はしごや宝と同じ)。
GoalControl
このGoalにPlayerが到達したらStageクリアです。とりあえず、以下のように StageControllerのPlayerHitGoal()
を呼ぶようにしておきます。
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に入れておきます。
void BuildStage(string stageData) {
...
case HIDDEN_LADDER:
case GOAL:
instance.SetActive(false);
hiddenObjects.Add(instance);
break;
お宝を全てGETしたら、showGoal()
を呼び出して、そこでは hiddenObejcts
に対してSetActive(true)
を呼びます。
これで隠れはしごとGoalが表示されるようになります。
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
というのも作ってしまいました。
本当は何がやりたいかはっきりさせて、もう少し考えるべきですね。
public void PlayerHitGoal() {
cameraObject.camera.fieldOfView = 40;
Global.paused = true;
loadNextAt = Time.time + 3;
}
ついでに敵も配置する
せっかくなので敵も配置するようにしました。何度も繰り返しになるので詳細は割愛しますが、修正は以下の部分になります。
https://github.com/mokemokechicken/UnityChanRoadRunner/commit/d27d6f0d0f2e031d1717f03ac2a1f86c4baf1a89
さいごに
一応敵もいるし、クリアもあるので、ゲームみたいなものになってきた気がします。