在看完教程之后自己實現(xiàn),以為很簡單的地方結(jié)果思考了挺久,所以將自己的重做過程記錄下來以便二次學(xué)習(xí)。
采用幀動畫形式實現(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ù)量或者敵機血量咽瓷。