spawer的游戏逻辑

Game logic of spawer

我是学生,我学习Unity3D引擎。我开始做小型 2D 游戏。

我需要一些游戏逻辑方面的帮助。具体如何在4列中合理生成游戏对象。在这个游戏中,我生成了从屏幕顶部掉落的游戏对象。我计算了覆盖屏幕的 4 列。我在这 4 列中随机生成游戏对象。但是游戏性并不好。我需要如何做得更好的建议。

我的想法是在行中生成一个或多个游戏对象并合理地旋转列。我已经在行中生成了对象。但是如何为切换列创建逻辑呢?类似开关的东西(现在是第一列,现在是第三列,现在是第一列和第四列等等)

这是我的生成方法:

 // Use this for initialization
void Start ()
{
    // width of one colums
    widthColum = ScreenCalc.DivideScreenInColums(colums);

    ...
}

public void StartSpawn()
{
    spawn = StartCoroutine(Spawn());       
}

IEnumerator Spawn()
{
    yield return new WaitForSeconds(1.5f);
    time = GameController.instance.time;
    while (true)
    {
          // Random select from prefabs
          GameObject geometryObject = spawnObjects[Random.Range(0, spawnObjects.Length)];
          // X is middle of random picked columns
          float x = ScreenCalc.GenerateColumPos(geometryObject, colums);  
          Vector3 spawnPosition = new Vector3(x, transform.position.y, 0.0f);
          Quaternion spawnRotation = Quaternion.identity;

          // Random object in row, will be spawned in one column
          int rnd = Random.Range(1, 6);

          // Spawn random count game object in one row
          for (int i = 0; i < rnd; i++)
          {                  
              GameObject temp = Instantiate(geometryObject, spawnPosition, spawnRotation);

              // Get Sprite render
              SpriteRenderer sr = temp.GetComponent<SpriteRenderer>();

              // Change color of game object
              sr.color = colors[Random.Range(0, colors.Length)];

              // Get script for falling down
              FallingDown fl = temp.GetComponent<FallingDown>();
              // Increase fall
              fl.fallSpeed += 0.1f;
              // Wait between spawns
              yield return new WaitForSeconds(Random.Range(0.35f, 1.0f));
          }
          yield return new WaitForSeconds(1.0f);
}

我尝试了更多的 Spawn 方法,每列一个,并随机生成等待时间。但是我的逻辑很糟糕,因为生成的对象太多或太低而导致一列相互碰撞。

这是我的想法的图片。

在图片上你可以看到屏幕分为4列,每一列都是生成位置。我需要帮助游戏逻辑如何随机切换对象的生成。

例如在第一列的行中生成 3 个对象。然后在第二列中生成 1 个对象。然后在第二列中生成 5 个对象,同时在第四列中生成 2 个对象。

不知道怎么解释比较好。我很抱歉我的英语。

您可能需要一种算法,以一种让您的游戏看起来很有趣的方式生成游戏对象,也许这种模式会对您有所帮助(您可以添加更多步骤)。

  1. 从右到左生成
  2. 从左到右生成
  3. 随机时间段重复以上两行
  4. 现在在随机点的四个位置随机生成
  5. 现在重复第 1 步

我想你想在每一列中独立于其他列生成。
您可以为 4 列添加 4 个 spawner 脚本。
在这 4 个脚本上设置唯一的列位置 (x)。
或者您可以为 4 列启动 4 个协程,例如:

public void StartSpawn()
{
    StartCoroutine(Spawn(columnPos1));
    StartCoroutine(Spawn(columnPos2));
    StartCoroutine(Spawn(columnPos3));
    StartCoroutine(Spawn(columnPos4));
}

IEnumerator Spawn(float columnPos)
{
    yield return new WaitForSeconds(1.5f);
    time = GameController.instance.time;
    while (true)
    {
          // Random select from prefabs
          GameObject geometryObject = spawnObjects[Random.Range(0, spawnObjects.Length)];
          // X is middle of random picked columns
          float x = columnPos;
          Vector3 spawnPosition = new Vector3(x, transform.position.y, 0.0f);
          Quaternion spawnRotation = Quaternion.identity;

          // Random object in row, will be spawned in one column
          int rnd = Random.Range(1, 6);

          // Spawn random count game object in one row
          for (int i = 0; i < rnd; i++)
          {                  
              GameObject temp = Instantiate(geometryObject, spawnPosition, spawnRotation);

              // Get Sprite render
              SpriteRenderer sr = temp.GetComponent<SpriteRenderer>();

              // Change color of game object
              sr.color = colors[Random.Range(0, colors.Length)];

              // Get script for falling down
              FallingDown fl = temp.GetComponent<FallingDown>();
              // Increase fall
              fl.fallSpeed += 0.1f;
              // Wait between spawns
              yield return new WaitForSeconds(Random.Range(0.35f, 1.0f));
          }
          yield return new WaitForSeconds(1.0f);
}