2017-08-15 180 views
0

我是學生,我學習Unity3D引擎。我從事小2D遊戲開始。spawer的遊戲邏輯

我需要一些遊戲邏輯的幫助。具體如何合理地在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); 
} 

我試圖做更多菌種的方法,每列和隨機生成的等待時間。但是我的邏輯很糟糕,因爲太多的對象被生成或者太低,並且相互碰撞一列。

這是我的想法的圖片。

Screen divided to 4 columns, each columns is spawn position

上,您可以看到屏幕分成4列的照片,每列產卵位置。我需要幫助遊戲邏輯如何隨機切換對象的產生。

例如在第一列產生3行對象。然後在第二列產生一個對象。然後在第2列產生5個對象,同時在第4列產生2個對象。

我不知道如何更好地解釋它。我很抱歉我的英語。

+0

我想你要完成將有助於增加什麼圖片:
也可以爲4列,如啓動4個協同程序。 – ryeMoss

+0

你'//增加秋天'的代碼實際上並沒有做很多。因爲它將新spawened對象*的下降速度設置爲0.1一次,所以它再也不會再被觸摸了,因爲下一次這條線被執行時它會在* new *對象上。 – Draco18s

回答

1

我想你想在每列獨立的其他產卵。
您可以爲4列添加4個spawner腳本。
在這4個腳本上設置唯一的列位置(x)。

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); 
} 
+0

是的,我以前試過,但是我需要解決如何在這個協程之間切換,就像下面post中的算法一樣。例如: 從右向左生成。所以我必須先啓動第一個協程,然後逐步激活並禁用下一個列。 –

1

您可能需要一種以遊戲看起來很有趣的方式產生gameobject的算法,也許這種模式會幫助您(您可以添加更多步驟)。從右

  1. 生成到左
  2. 生成從左至右
  3. 重複上述兩個線爲隨機時間段
  4. 現在隨機四個位置在隨機點生成
  5. 現在轉至步驟1重複
+0

謝謝我看這樣的算法。我很抱歉,我知道這似乎很容易,但我認爲所有的時間:)我只能形象難度的解決方案。所以我問了。謝謝 –