ステージをいい感じにスクロールさせたい
前回の移動方法を元に
・プレイヤーはボールを左右にのみ動かせる
・Z軸方向へは等速で移動する
こんな感じの避けゲーを考えている最中。このZ軸への等速移動をボールではなくステージを移動させることで疑似的に再現することにした
実装してみる
public float scrollSpeed; void Update() { // 毎フレーム移動させる transform.Translate(0, 0, -1 * scrollSpeed * Time.deltaTime); }
これでボールが前に進んでいるように見える(ボールはその場で止まってるだけ)
あとは適当に長いステージを作るだけでもゲームとしては問題なさそう。
とはいえ味気ないのでステージチップを複数作ってゲームをプレイするたびに違うステージとなるようにする
ランダムスクロール
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ScrollObject : MonoBehaviour { public GameObject[] Stages; // ステージチップの配列 public float scrollSpeed; public float scrollStartPos; // ステージの生成Z座標 public float scrollEndPos; // ステージの破棄Z座標 void Update() { // 毎フレーム移動させる transform.Translate(0, 0, -1 * scrollSpeed * Time.deltaTime); // 目標地点に到達 if(transform.position.z <= scrollEndPos) ScrollEnd(); } void ScrollEnd() { // 通り過ぎた分を考慮してポジションを設定 float diff = transform.position.z - scrollEndPos; Vector3 restartPos = transform.position; restartPos.z = scrollStartPos + diff; // ランダムなステージチップを生成 int nextStageNumber = Random.Range(0, Stages.Length); GameObject nextStage = Instantiate(Stages[nextStageNumber], restartPos, Quaternion.identity); nextStage.name = "Stage" + (nextStageNumber + 1); Destroy(gameObject); } }
ゲームオブジェクト型の配列Stagesには自分で作成したステージのプレハブを入れる。今回は赤色と青色のステージを作ったのでインスペクターから二つをアタッチ
ステージを毎フレーム移動させて、scrollEndPosに来たらscrollStartPosに新しいステージチップを生成している。
毎回ぴったりUpdateが呼び出されたときにscrollEndPosにいるわけではないので通り過ぎた分を再設定して調整する必要があったり…
更に背景もスクロールさせたりするとボールが進んでる感がさらに出てくる
そんなこんなで少しゲームっぽくはなってきたけどなんかもっといい感じのやりようはあった気もしますね…