Unity實(shí)現(xiàn)俄羅斯方塊(二)
本文實(shí)例為大家分享了Unity實(shí)現(xiàn)俄羅斯方塊第2部分,供大家參考,具體內(nèi)容如下
代碼部分
1. 實(shí)現(xiàn)物體自由降落(在有關(guān)于物體的腳本中編寫)
1)、使用循環(huán)調(diào)用方法實(shí)現(xiàn)
public float speed = 0.3f;//物體下落
// Start is called before the first frame update
void Start()
{
InvokeRepeating("Move", 0, speed);
}
void Move()
{
transform.position += new Vector3(0, -1, 0);
}
2)、使用時(shí)間差進(jìn)行自由降落(在這里使用的該方法)
float lastFail=0;
else if (Input.GetKeyDown(KeyCode.DownArrow)||Time.time-lastFail>=1)
{
transform.position += new Vector3(0, -1, 0);
lastFail = Time.time;
}
2. 處理碰邊界問(wèn)題
邏輯部分:
1)、得到游戲區(qū)域的寬度和高度,分析寬度和高度能放多少個(gè)格子,用一個(gè)二維數(shù)組來(lái)保存信息。如果占據(jù)了這個(gè)格子將其設(shè)置為非空。
2)、編寫格子的腳本,處理格子的邏輯。
代碼部分:
//設(shè)置變量 public static int width = 10;//游戲窗口的寬度 public static int height = 20;//游戲窗口的高度 public static Transform[,] grid=new Transform[width,height]; //*注:變量應(yīng)設(shè)置成static 否則無(wú)法引用
3. 處理物體是否還能下降問(wèn)題(物體腳本)
邏輯部分:
1)、在一個(gè)格子剛產(chǎn)生的時(shí)候,就要判斷是否能繼續(xù)下落,如果還可以繼續(xù)下落,說(shuō)明游戲仍可進(jìn)行,如果不能繼續(xù)下落,說(shuō)明游戲結(jié)束。

2)、所以判斷能都繼續(xù)下落的重要條件依據(jù)就是下方的格子是否被占據(jù)。也可以先移動(dòng)位置,判斷移動(dòng)后的位置是否有效,如果有效,物體進(jìn)行移動(dòng),否則不移動(dòng)。
3)、編寫是否組成物體的格子是否在邊界內(nèi),防止超出邊界(游戲區(qū)域格子腳本),每一個(gè)格子的x要大于左邊界且小于右邊界,y要大于下邊界。
4)、當(dāng)其在uodate不能下落時(shí),應(yīng)該產(chǎn)生一個(gè)新的物體,并且將當(dāng)前的物體的腳本進(jìn)行關(guān)閉,避免腳本還發(fā)生作用。
代碼部分:
格子腳本:
public static Vector2 roundVec2(Vector2 v)
{
return new Vector2(Mathf.Round(v.x), Mathf.Round(v.y));
}
public static bool insideBorder(Vector2 pos) {
//注寬是小于否則會(huì)出邊界
if ((int)pos.x >= 0 && (int)pos.x <width && (int)pos.y >= 0)
return true;
else
return false;
}
物體腳本:
void Start()
{
if (!isValidGridPos())//剛產(chǎn)生就無(wú)效
{
Debug.Log("GAME OVER");
}
}
float lastFail=0;
// Update is called once per frame
void Update()
{
//控制物體向左移
if (Input.GetKeyDown(KeyCode.LeftArrow))
{
transform.position += new Vector3(-1, 0, 0);
if (isValidGridPos())
{
}
else {
transform.position += new Vector3(1, 0, 0);
}
}
//控制物體右移
else if (Input.GetKeyDown(KeyCode.RightArrow))
{
transform.position += new Vector3(1, 0, 0);
if (isValidGridPos())
{
}
else
{
transform.position += new Vector3(-1, 0, 0);
}
}
//控制物體旋轉(zhuǎn)
else if (Input.GetKeyDown(KeyCode.UpArrow))
{
//可在unity編輯器中通過(guò)旋轉(zhuǎn)可得是對(duì)z軸進(jìn)行旋轉(zhuǎn)
transform.Rotate(0, 0, -90);
if (isValidGridPos())
{
}
else
{
transform.Rotate(0, 0, 90);
}
}
else if (Input.GetKeyDown(KeyCode.DownArrow)||Time.time-lastFail>=1)
{
transform.position += new Vector3(0, -1, 0);
if (isValidGridPos())
{
}
else
{
transform.position += new Vector3(0, 1, 0);
FindObjectOfType<Spawner>().spawnNext();
enabled = false;
}
lastFail = Time.time;
}
}
bool isValidGridPos()//判斷是否有效
{
foreach (Transform child in transform)
{
Vector2 v=Grid.roundVec2(child.position);
//判斷是否在邊界之間
if (!Grid.insideBorder(v))
return false;
if (Grid.grid[(int)v.x, (int)v.y] != null)
return false;
}
return true;
}
更多俄羅斯方塊精彩文章請(qǐng)點(diǎn)擊專題:俄羅斯方塊游戲集合 進(jìn)行學(xué)習(xí)。
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
c#實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)udp異步通信程序示例
這篇文章主要介紹了c#實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)udp異步通信程序示例,需要的朋友可以參考下2014-04-04
C#實(shí)現(xiàn)一個(gè)控制臺(tái)的點(diǎn)餐系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)一個(gè)控制臺(tái)的點(diǎn)餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11
c#?理解csredis庫(kù)實(shí)現(xiàn)分布式鎖的詳細(xì)流程
這篇文章主要介紹了c#?理解csredis實(shí)現(xiàn)分布式鎖,該庫(kù)本身已經(jīng)足夠完善,這里我畫蛇添足一下,為了方便自己的使用,本文通過(guò)實(shí)例代碼給大家詳細(xì)介紹,需要的朋友可以參考下2022-02-02
C#通過(guò)熱鍵控制顯示器開(kāi)關(guān)的方法
這篇文章主要介紹了C#通過(guò)熱鍵控制顯示器開(kāi)關(guān)的方法,涉及C#針對(duì)熱鍵的操作技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-12-12
Unity游戲開(kāi)發(fā)之射擊小游戲的實(shí)現(xiàn)
本篇文章為大家?guī)?lái)一個(gè)橫版2D射擊小游戲,游戲制作超級(jí)簡(jiǎn)單,玩法一學(xué)就會(huì)。文中的示例代碼講解詳細(xì),快跟隨小編一起動(dòng)手試一試2022-03-03
Unity中的PostProcessBuild實(shí)用案例深入解析
這篇文章主要為大家介紹了Unity中的PostProcessBuild實(shí)用案例深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
unity實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲
這篇文章主要為大家詳細(xì)介紹了unity實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03

