拾蘋果是一個常見並很容易經過Unity實現的遊戲原型,主要利用物理引擎以及碰撞,加上一點點代碼就能夠實現。But,不少有趣的遊戲都是在此基礎上的變種,雖然你可能很難聯想到,但只要你玩的一款遊戲利用了重力、碰撞,你均可以經過這個原型去實現它。編程
在此,我不會將詳細的過程和代碼貼出來,想要進一步學習的同窗,能夠在《遊戲設計、原型與開發》中找到詳細的步驟,本文僅對書中的作法做進一步補充。另外,本文也不是爲了教你如何去寫代碼,而是如何去設計一款遊戲。dom
-----------------------------------------------------------------------正義的分割線--------------------------------------------------------學習
首先,咱們來思考一下拾蘋果的機制(假設咱們已經決定了這個主題),用籃子去接住從空中掉落的蘋果,一句話就能說明咱們遊戲的核心。在遊戲中必然須要的對象有蘋果和籃子,用紅色的球體和木色的方塊去代替就能夠了。籃子是玩家的控制對象,讓玩家去符合心意的控制Z軸顯然不可能,咱們只須要將籃子在二維平面上移動,人也不可能在任意高度去接蘋果,所以籃子只能在一條直線上運動,那咱們就如今完成對籃子的控制,給籃子添加一個控制腳本Basket。設計
public class Basket : MonoBehaviour {orm
//在檢視面板控制籃子高度,你能夠把它看成相似於百分比,0爲底部,1爲頂部
public float Height = 0.1f;對象
//將屏幕高度轉變爲3D空間高度,這樣籃子的高度不須要根據不一樣的屏幕大小作修改繼承
private float worldHeight{
get{
Vector3 portPos = new Vector3 (0, Height);
Vector3 worldPos = Camera.main.ViewportToWorldPoint (portPos);
return worldPos.y;遊戲
}
}ip
void Update(){
transform.position = new Vector3 (transform.position.x, worldHeight);
}
}內存
固然,你還須要把籃子建立出來,不單單是籃子,包括蘋果,你都須要一個已經存在於場景中的腳本去建立這些物體。你能夠在場景中放一個空物體做爲遊戲的控制器,而後在上面添加控制器腳本。
public class GameManager : MonoBehaviour {
//除了在檢視面板賦值,還能夠將Basket預物體放在Resource文件夾下,經過Resource.Load()加載,也能夠打成AssetBundle再加載,這不在本文關注點內
public GameObject Basket;
void Start(){
CreateBasket ();
}
void CreateBasket(){
Instantiate (Basket);
}
}
這時運行遊戲,能夠發現籃子高度位置和Basket腳本的Height關聯在一塊兒,並且在任何屏幕寬高比下都是在正確的比例高度上。
Tips:1.切換屏幕大小,須要從新啓動遊戲;
2.你也許想要總在某一分辨率單位的高度上,能夠用ScreenToWorldPoint方法替代ViewportToWorldPoint;
3.多把方法具體化,封裝好,這有利於之後的拓展;
4.不要在控制器類裏決定籃子的位置等詳細信息,之後這裏可能會有不少對象,仍是放在對象的腳本里更容易管理。
5.多數狀況下把這些整個遊戲中只會存在一個的控制器類作成單例模式也許會更好,但爲何會存在兩個相同的繼承於MonoBehaviour的控制器類呢?
如今試着讓籃子跟隨鼠標移動。
void Update(){
//在Basket腳本中的Update中添加一句就足夠了。將鼠標或觸屏位置轉變爲3D空間位置,而後將X軸座標賦予給籃子。
Vector3 mousePos = Camera.main.ScreenToWorldPoint (Input.mousePosition);
transform.position = new Vector3 (mousePos.x, worldHeight);
}
接下來讓蘋果掉落,你能夠去每一幀控制蘋果的位置,還能夠給蘋果加上Rigidbody組件,勾選Use Gravity,Unity的物理引擎會讓它自由落體,這更符合實際。若是你尚未忘記中學的物理知識,你會知道物體的加速度與重力相關,你能夠更改系統的重力加速度,來讓蘋果下落的更快或更慢來調節遊戲難度,而不須要更多的代碼支持。另外做爲二維遊戲,你也不但願蘋果的位置在Z軸上發生變化,因此把它的z軸凍結起來,將Freeze Position的Z勾選起來。像建立籃子同樣建立蘋果,代碼幾乎是同樣的,可是將他們統一封裝起來或許也沒有必要。
在GameManager中建立按照必定的頻率生成蘋果
InvokeRepeating("CreateApple",AppleDropStartTime,AppleDropCyc);
你會發現場景中不停建立新的蘋果,總有一天,你的應用會因內存崩潰的。所以咱們須要在蘋果離開屏幕後,將蘋果銷燬掉。
在Apple腳本中:
void Update(){
if (Camera.main.WorldToViewportPoint (transform.position).y < 0) {
Destroy (gameObject);
}
}
如今蘋果會在離開屏幕後被消除掉,可是這種作法效率不高,咱們可使用遊戲編程中最經常使用的手段——池。有關池的內容,會在技術分類裏再去講,這裏就不拓展了。
接着讓蘋果從隨機的位置落下,只要每次建立蘋果的時候讓它的的X軸位置隨機就能夠了。
在Apple腳本的Start()中,更改transform.position = new Vector3 (Camera.main.ViewportToWorldPoint(new Vector3(Random.Range(0,1f),0)).x, worldHeight);
最後,遊戲須要有勝利和失敗的條件,或爲遊戲制定關卡,而後就是不停的試玩遊戲,爲遊戲添加更多的元素,調整遊戲的參數使之更爲平衡。