在看完教程之后自己實現(xiàn),以為很簡單的地方結(jié)果思考了挺久,所以將自己的重做過程記錄下來以便二次學習。
采用幀動畫形式實現(xiàn)微信打飛機游戲。
工程文件Github地址: https://github.com/robotluo/BattlePlane
1.創(chuàng)建背景輪播以及主角動畫
背景輪轉(zhuǎn):
使用兩張圖片交錯移動的方式實現(xiàn)背景輪播,當一張圖片下移出視圖,更新其位置置于頂端。為了防止出現(xiàn)圖片銜接不流暢,需要取得圖片真實像素。素材背景圖片為 480*852,所以當每次出界時,y軸需移動 852 * 2。
這里實踐中出現(xiàn)了一個失誤,當創(chuàng)建一個新腳本后,又把腳本文件名改變,同時沒有改類名。造成腳本不能添加到 Component 上,將類名做相應(yīng)改變即可。
主角動畫:
使用兩張圖片變化來實現(xiàn)主角動畫。利用腳本控制 Sprite 展示不同的圖片,實現(xiàn)動態(tài)效果。
設(shè)置Sorting Layer:
當有多個Sprite在同一層時,渲染出來的結(jié)果是不定的,所以需要設(shè)置 Sorting Layer ,層數(shù)越大,顯示越上層。
還可以設(shè)置 Order in Layer,用于設(shè)置對同一層的顯示優(yōu)先級。同樣的,數(shù)值越大,顯示越上層。
2.子彈、敵機、獎勵物品的運動和隨機生成
子彈與獎勵自動生成與運行:
將物品設(shè)置成 Prefabs,按一定時間間隔實例化物品。為物品添加腳本,讓其自己移動以及銷毀。
使用 GameObject.Instantiate() 方法創(chuàng)建實例:
GameObject.Instantiate (bullet, transform.position, Quaternion.identity);
InvokeRepeating 可以循環(huán)調(diào)用函數(shù):
InvokeRepeating ("fire", 1, speed);/(函數(shù)名,延遲,循環(huán)間隔)
刪除自身:
Destroy (this.gameObject);
敵機的控制與子彈類似,超出視圖也需要銷毀。只是敵機需要的視圖上方隨機生成,并且有 Hp 值。
隨機生成思路:
在視圖上方創(chuàng)建一個空 GameObject 用于產(chǎn)生物品和敵機,按照一定時間間隔調(diào)用所寫生成函數(shù),同時隨機產(chǎn)生一個 X 坐標。
3.主角移動、敵人碰撞時爆炸效果
主角控制:
檢測觸摸位置,防止主角飛出屏幕。注意改變 position 時需要將屏幕坐標轉(zhuǎn)換為世界坐標,不然會出現(xiàn)尺度不對。
檢測鼠標點擊:
Input.GetMouseButtonDown (0);//鼠標左鍵按下
Input.GetMouseButtonUp (0);//鼠標左鍵抬起
獲取鼠標點擊位置:
Input.mousePosition
子彈與敵人碰撞:
添加碰撞器,當子彈與物體碰撞時,判斷 Tag 是否為 Enemy ,如果是,則調(diào)用物體的相關(guān)方法。
other.gameObject.SendMessage ("Hit");
//讓物體自己調(diào)用身上腳本的 Hit 方法,而不是 other 去調(diào)用
在 Hit 中利用 Hp 判斷此時敵機是被擊中還是摧毀,播放相應(yīng)的動畫。
4.武器切換、分數(shù)顯示、游戲暫停
武器切換:
武器切換就是控制 top、left、right 三把槍是否發(fā)出子彈,Cancellnvoke 用于停止循環(huán)調(diào)用方法。在不同情況下對三把槍的開關(guān)進行不同控制。
CancelInvoke ("createBullet");
分數(shù)顯示:
分數(shù)顯示需要一個全局變量,那在 Unity 中,就使用一個單例來充當全局的作用。創(chuàng)建一個 GameManager 類來記錄一些全局的信息,讓其擁有一個 static 實例化,統(tǒng)計分數(shù)時都調(diào)用該實例的成員函數(shù) addSorce 。
添加一個 GUI text 控件,用于顯示分數(shù)。
游戲暫停:
游戲暫停其實很簡單,在Unity中我們是可以控制“時間流速”的,利用 Time.timeScale 可以控制時間流逝速度比例,當我們將其設(shè)置為 0 時,就相當于時間靜止。
Time.timeScale = 0; //時間靜止
Time.timeScale = 1; //正常速度
//在 0~1之間就可以實現(xiàn)慢動作的特效
//大于1可以實現(xiàn)加速效果
炸彈效果:
炸彈效果為按下 Space 鍵時敵機全部死亡,在 enemy 與 gameManager 中同時檢測是否按下 Space 鍵以及是否有炸彈。在 enemy 中銷毀敵機,在gameManager 中減少炸彈數(shù)量,但是要設(shè)置腳本的先后順序,否則數(shù)量先減少了,敵機并不會被摧毀。
設(shè)置腳本順序:
選擇一個腳本 -> Exrcution Order -> 設(shè)置Default Time
5.游戲結(jié)束
游戲結(jié)束時主要有幾個點,顯示當前分數(shù)、顯示歷史最高分,實現(xiàn)重新開始、實現(xiàn)結(jié)束游戲。
顯示歷史分數(shù):
float highScore = PlayerPrefs.GetFloat("highScore",0);
if (score > highScore) {
highScore = score;
}
PlayerPrefs.SetFloat ("highScore",highScore);
//需要存儲在本地
//PlayerPrefs.GetFloat() 和 PlayerPrefs.SetFloat() 方法用于存儲
重新開始:
SceneManager.LoadScene (0);//當前只有一個scene,所以直接載入0
//Application.LoadLevel (0); 在unity 5.3 中無法使用此方法。
結(jié)束游戲:
Application.Quit();
5.補充
在 GameManeger 中記錄一個時間,敵機速度隨著游戲時長而增加。亦可以利用此時間來增加敵機數(shù)量或者敵機血量。