以前、ボール転がしゲームのステージ自動生成を適当に考えてみました。
具体的には、
- フロアパネルを数パターン作成
- フロアパネルごとに配置回数のループを作成
- 配置座標を乱数から取得して、その座標に配置
という流れでした。
ただ、このアプローチだと、乱数が偏った場合に、穴だらけにステージになったりしてしまうという欠点はあります。
たまに、ゴール地点が孤島になってしまったりしますし(苦笑)
あとは、パネル配置数が固定ということですね。(もちろん変えたければここを乱数にすればいいだけですが)
・・・ということで、別のアプローチ。
前の方法でもいいんですが、びっちり並べたいなら、
- フロアパネルを数パターン作成(同じ)
- 座標ごとにどのパネルを置くかを乱数で決定
- それを全座標範囲ループ
という感じですかね。
今回の場合は、Scale 3 * 0.1 * 3 のパネルをベースに作成。
あとは一面に壁を付けたパターン。
(12-2, 12-3, 12-4はそれぞれ12-1を90度, 180度, 270度回転)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BallGame : MonoBehaviour
{
public GameObject Floor11;
public GameObject Floor12_1;
public GameObject Floor12_2;
public GameObject Floor12_3;
public GameObject Floor12_4;
public bool boolBallFlag;
public GameObject Ball;
GameObject GameBall;
// Start is called before the first frame update
void Start()
{
boolBallFlag = false; //初期化
// 10×10のエリアを作成
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
// 整数型の乱数(0~5)を作成
int iRandomNum = Random.Range(0,5);
GameObject randomFloor = Instantiate(Floor11);
switch (iRandomNum)
{
case 0:
randomFloor = Instantiate(Floor11);
break;
case 1:
randomFloor = Instantiate(Floor12_1);
break;
case 2:
randomFloor = Instantiate(Floor12_2);
break;
case 3:
randomFloor = Instantiate(Floor12_3);
break;
case 4:
randomFloor = Instantiate(Floor12_4);
break;
}
// パネルを生成
randomFloor.transform.position = new Vector3(3*i, 0, 3*j);
}
}
}
(Update関数以下は前回のBall判定と同じなので省略)
これで、ランダムにびっしりと配置されます。
ただ・・・
いきなり詰みました(笑)
まさかの不可能パターンに。
この辺りは、どちらにしても何かしら条件を加えて調整しないとダメですね(笑)
ちなみに、わかりにくいのでフロアパネルごとに色付けしてみると…。
- 水色:壁なし
- 黄色:上に壁
- 緑色:右に壁
- 紫色:下に壁
- 橙色:左に壁
ランダムで選択されているのが分かりますね。