這篇文章將講解怎麼使用Unity製作簡單的貪吃蛇遊戲。貪吃蛇是一種街機遊戲,最早的原型誕生於1976年。正如大多數街機遊戲一樣,它開發簡單,且娛樂性強(至少克森的童年時玩它玩過來的)。
知識
我們的文章不需要什麼特別的技巧,只需知道Unity的基本操作,例如:GameObject和Transform的概念等等。即使你不了解也沒關係,只要你跟著我的思路來即可。
Unity版本
在本章教程中,我們將使用Unity5.0.04版本來製作。對於舊的版本也可以正常運行,不過建議大家還是使用Unity5.0以上的版本。
讓我們開始吧。首先先創建一個項目:
將該工程命名為「snake」,路徑由你們來設置,這裡我設置的是C盤根目錄下,選擇2D開發,然後點擊創建項目按鈕:
我選擇場景中的Main Camera(主相機),然後再Inspector面板中修改相機的Background為黑色背景,最後調整Size和Position,如下圖所示(注意參數要一樣,方便後續跟進):
我們將使用下面兩張圖片來製作我們的邊框:
border_horizontal.png
border_vertical.png
你可以右擊將圖片保存到你項目的Assets文件夾下。
我們再一次在Assets下選擇這兩張圖片,如下所示:
之後,我們可以在Inspector面板中改變他們的導入設置,改變參數如下圖所示:
Pixels Per Unit 是在圖片中的一個像素與世界坐標中的一個單位之間的比例尺。貪吃蛇每移動一步將對應遊戲世界坐標上的一個單位。這就是為什麼我們要把Pixels Per Unit設置為1的原因。
現在,我們可以製作我們的邊框了。首先把Assets下的兩張圖片拖拽到Hierarchy面板下,拖拽兩次(你也可以通過複製的方式實現),如下圖所示:
使用border_horizontal來製作頂部和底部的邊框,使用border_vertical來製作左邊和右邊的邊框。
讓我們為它們重命名一下,方便查找。如下圖所示(Top是頂部,Bottom是底部,Left是左邊,right是右邊):
現在,它們在遊戲中只是一張一張的圖片,毫無卵用,現在就讓我們為這些圖片添加Colliders(碰撞器)組件,讓這些圖片變為一堵堵牆吧。
首先先在Hierarchy面板中選擇那四張圖片,如下圖所示;
好,把它們都選中之後,在Inspector面板中找到Add Component按鈕,點擊它,然後找到Physics2D,最後點擊Box Collider2D即可,如下圖所示:
剛剛我們所做的操作,不用寫任何一行代碼,便能讓一張毫無卵用的圖片編程了一堵牆,太感謝Unity這個強大的遊戲引擎了。
我們不想讓我們的貪吃蛇餓死,因此,讓我們在遊戲中隨機生成一些食物,提供給蛇食用吧。和上面的操作一樣,我們將使用一張圖片來製作食品。在我們的教程中,他只是一個像素的色塊:
還是老樣子,右擊該圖片,將它保存到你項目的Assets文件夾下。
還是老樣子,將它的導入設置修改一下,如下圖所示:
好吧,讓我們把food拖到場景中,Unity會自動的幫我們在Hierarchy面板中創建一個相對應的遊戲物體,如下所示(你的位置也許跟下圖不一樣,這根據你拖拽的位置而定):
每當貪吃蛇碰到food(也就是食物)的時候,應當獲得一些相應的信息。因此我們也要給
food(食物)添加Collider(碰撞器)組件。
一個遊戲物體沒有Collider(碰撞器)組件,那麼它只是一個可視化物體(就是沒有交互功能的物體),它不是物理世界的一部分。一旦我們為遊戲物體添加了Collider(碰撞器)組件,它如一堵牆,任何物體都不能穿透它,且能通過碰撞檢測事件來進行交互,如:OnCollisionEnter2D、OnCollisionStay2D等等。假如我們勾選了Is Trigger,它便如水一般,可以穿透它,且能通過觸發檢測事件來進行交互,如:OnTriggerEnter2D、OnTriggerStay等等。
當貪吃蛇穿過food(食物)時,貪吃蛇應該得到一些通知(就是所謂的響應事件)。然而食物不能像牆一樣不能穿過它,因此我們現在要做的就是為food(食物)添加Collider(碰撞器),並且勾上Is Trigger:
好了,現在我們不想讓food(食物)在遊戲一開始就出現。因此我們把它做成一個預製體,以便我們使用Instantiate函數來生成它,每當我們需要它的時候。現在,讓我們把food(食物)重命名為「FoodPrefab」,然後把它拖到Assets文件夾下:
現在我們可以刪除Hierarchy面板中的FoodPrefad了,因為我們暫時不需要它了。
讓我們在遊戲開始之後,間隔幾秒就在隨機的地方生成一個food(食物)。那麼,就讓我們創建一個腳本來控制食物的生成吧。我們將把腳本放置在Main Camera下(因為Main Camera始終在遊戲場景中)。首先,在Hierarchy中選擇Main Camera,然後再Inspector面板中招到Add Component按鈕,點擊New Script,在Name的輸入框中輸入SpawnFood,腳本類型選擇C Sharp,如下所示:
然後打開該腳本(雙擊即可):
using UnityEngine;
using System.Collections;
public class SpawnFood : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}
我們不需要Update()函數,把它刪除了:
using UnityEngine;
using System.Collections;
public class SpawnFood : MonoBehaviour {
// Use this for initialization
void Start () {
}
}
這個腳本需要獲取食物預製體,因此,我們將添加一個類型為GameObject類型的公開變量:
using UnityEngine;
using System.Collections;
public class SpawnFood : MonoBehaviour {
// Food Prefab
public GameObject foodPrefab;
// Use this for initialization
void Start () {
}
}
食物應該是在邊界內生成的。因此,我們也需要在我們的腳本中通過一些變量獲得邊框位置的相應信息,如下所示:
using UnityEngine;
using System.Collections;
public class SpawnFood : MonoBehaviour {
// Food Prefab
public GameObject foodPrefab;
// Borders
public Transform borderTop;
public Transform borderBottom;
public Transform borderLeft;
public Transform borderRight;
// Use this for initialization
void Start () {
}
}
我們已經將他們聲明為Transform類型了,因此我們如borderTop.transform.posion這樣調用position了,直接borderTop.position即可。
讓我們創建Spawn()函數在邊界內生成food(食物)。首先我們通過x變量來獲取左邊界和右邊界之間的隨機位置信息,然後通過y變量來獲取上邊界和下邊界之間的隨機位置信息。然後我們便在該位置生成food(食物):
// Spawn one piece of food
void Spawn() {
// x position between left & right border
int x = (int)Random.Range(borderLeft.position.x,
borderRight.position.x);
// y position between top & bottom border
int y = (int)Random.Range(borderBottom.position.y,
borderTop.position.y);
// Instantiate the food at (x, y)
Instantiate(foodPrefab,
new Vector2(x, y),
Quaternion.identity); // default rotation
}
x 和 y通過使用(int)強制轉換來確保該food(食物)生成的位置是整數,如(1,2),而不是帶有小數點的形式,如(1.234, 2.74565)。
現在,讓我們的腳本在每幾秒後調用Spawn()函數,我們可以通過使用InvokeRepeating()函數來做:
// Use this for initialization
void Start () {
// Spawn food every 4 seconds, starting in 3
InvokeRepeating("Spawn", 3, 4);
}
InvokeRepeating()函數用於在每幾秒內重複調用某個函數。第一個參數是函數的名字,第二個參數是第一次調用的時間,第三個參數是間隔調用的時間。在上面的代碼中,在遊戲開始後3秒調用Spawn函數,然後每4秒再重複調用Spawn函數。
下面是SpawnFood函數的完整代碼:
using UnityEngine;
using System.Collections;
public class SpawnFood : MonoBehaviour {
// Food Prefab
public GameObject foodPrefab;
// Borders
public Transform borderTop;
public Transform borderBottom;
public Transform borderLeft;
public Transform borderRight;
// Use this for initialization
void Start () {
// Spawn food every 4 seconds, starting in 3
InvokeRepeating("Spawn", 3, 4);
}
// Spawn one piece of food
void Spawn() {
// x position between left & right border
int x = (int)Random.Range(borderLeft.position.x,
borderRight.position.x);
// y position between top & bottom border
int y = (int)Random.Range(borderBottom.position.y,
borderTop.position.y);
// Instantiate the food at (x, y)
Instantiate(foodPrefab,
new Vector2(x, y),
Quaternion.identity); // default rotation
}
}
現在讓我們保存腳本,然後回到Inspector面板中,你將會發現SpawnFood腳本下多了幾個卡槽,現在我們要做的就是找到對應的預製體,將其拖進卡槽中,如下圖所示:
好吧,現在讓我們點擊Play按鈕,然後等待幾秒鐘,我們將能看到遊戲場景中有了一些小點點(食物):
好了,今天就只能到這裡了。看了下表23點55分,明天再把它更完吧。
對上文章的圖片,大夥們可以在下面連結下載:
連結:http://pan.baidu.com/s/1o8lbDJO 密碼:d6ak
Unity牆外的世界 --- 這裡有國外的經典案例、教程、文章,在這裡你將會學到更為先進的Unity開發知識。
下一篇:使用Unity製作經典2D遊戲之貪吃蛇(下)
更多經典,敬請期待