好的今天來到了第8天,如題,今天我們來產生方塊
先創建一個empty叫做CubeSpawner,然後給它加一個叫做SpawnCube的Script
接著在裡面貼上下面這些程式碼
using UnityEngine;
using System.Collections.Generic;
public class Spawn_Cube : MonoBehaviour
{
// Start is called once before the first execution of Update after the MonoBehaviour is created
public GameObject []prefab_list;
private List<GameObject> bag = new List<GameObject>();
void Start()
{
SpawnNext();
}
void Update()
{
}
void SpawnNext()
{
if (bag.Count == 0)
{
shuffle(bag);
}
GameObject next_cube = bag[0];
Instantiate(next_cube,this.transform.position, Quaternion.identity);
bag.RemoveAt(0);
}
void shuffle(List<GameObject> bag)
{
List<int> put_order= new List<int>{0,1,2,3,4,5,6};
//
for(int i = 0; i < prefab_list.Length; i++)
{
int r = Random.Range(i, prefab_list.Length);
(put_order[r], put_order[i]) = (put_order[i], put_order[r]);
}
for(int i = 0; i < put_order.Count; i++)
{
int ID = put_order[i];
bag.Add(prefab_list[ID]);
}
}
}
然後回到Unity把之前做好的Prefab丟到prefab_list裡面
不出意外的話應該就可以看到它隨機產生一個物件正在下落了。
我們先來講程式架構,俄羅斯方塊為了避免有時候很衰拿到的方塊形狀都不好,所以在產生方塊的時候是用一種叫做7-bag的方法,它會先把7種形狀以隨機順序丟到一個清單裡面,然後每次生成的時候再抓第一個。
當清單空了的時候再重新以隨機順序的物件裝滿。
理解了之後我們就直接來看程式吧。
public GameObject []prefab_list;
private List<GameObject> bag = new List<GameObject>();
prefab_list是一個存了所有prefab的清單,之後要生成的時候就會從這邊抓物件出來。
bag也是一個清單,它是用來存我們打亂的物件的清單。
SpawnNext函式會判斷如果bag是空的,就呼叫shuffle函式來讓bag重新裝滿物件,否則就一直拿bag中的第一個(list的順序從0開始)出來生成。
裡面有一些我們沒看過的程式,我們一個個來看。
首先是Instantiate(next_cube,this.transform.position, Quaternion.identity);
這個會創建出一個next_cube這個物件的複製,第二個代表它的位置,第三個則是旋轉。
再來是bag.RemoveAt(0);
就是很單純的把bag的第0個給Remove而已。
接著看到shuffle函式,put_order是要放置的順序,我們在第一個for迴圈裏面把它打亂。
接著再第2個for迴圈我們再一個個把物件依照順序丟進bag裡面。
(我決定以後程式解釋直接用註解好了,不然再後面解釋好像效率有點低又麻煩:()