Cou氏の徒然日記(2022)

ほのぼの日記ブログです。

Unityで遊ぼう その10 (ステージを自動生成 その2)

以前、ボール転がしゲームのステージ自動生成を適当に考えてみました。

coublood.hatenablog.com

具体的には、

  1. フロアパネルを数パターン作成
  2. フロアパネルごとに配置回数のループを作成
  3. 配置座標を乱数から取得して、その座標に配置

という流れでした。

ただ、このアプローチだと、乱数が偏った場合に、穴だらけにステージになったりしてしまうという欠点はあります。

たまに、ゴール地点が孤島になってしまったりしますし(苦笑)

あとは、パネル配置数が固定ということですね。(もちろん変えたければここを乱数にすればいいだけですが)

 

・・・ということで、別のアプローチ。

前の方法でもいいんですが、びっちり並べたいなら、

  1. フロアパネルを数パターン作成(同じ)
  2. 座標ごとにどのパネルを置くかを乱数で決定
  3. それを全座標範囲ループ

という感じですかね。

 

f:id:coublood:20200523195626p:plain

 

今回の場合は、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判定と同じなので省略)

これで、ランダムにびっしりと配置されます。

f:id:coublood:20200523200247p:plain

ただ・・・

 

f:id:coublood:20200523200408p:plain

 

いきなり詰みました(笑)

まさかの不可能パターンに。

この辺りは、どちらにしても何かしら条件を加えて調整しないとダメですね(笑)

 

ちなみに、わかりにくいのでフロアパネルごとに色付けしてみると…。

f:id:coublood:20200524135526p:plain

  • 水色:壁なし
  • 黄色:上に壁
  • 緑色:右に壁
  • 紫色:下に壁
  • 橙色:左に壁

f:id:coublood:20200524135536p:plain

ランダムで選択されているのが分かりますね。