siki学院_Unity初级案例_愤怒的小鸟_学习笔记2/3
說明:本次學習開始于2018年9月23日,至9月26日已看完全部教學視頻,并已基本完成該案例的制作,歷時四天。本文檔為我在學習過程中,通過記事本記錄的學習過程,對于該游戲案例的制作過程并不十分詳盡,不作為教程使用,僅用于自己學習參考,記錄于此,聊表心意。
★★游戲流程管理
首先建立一個空物體,掛載管理類,設置為單例模式:
? ?public static GameManager _instance;
? ? void Awake() {
? ? ? ? _instance = this;
? ? }
在管理類中寫小鳥初始化函數,先建立小鳥和小豬的列表,然后寫初始化函數:
? ? public List<Birds> birds;
? ? public List<Pig> pigs;
? ? //初始化函數,對于小鳥的列表,每排在第一個的小鳥激活,其他的不激活
? ? private void Initialized() {
? ? ? ? for (int i = 0;i < birds.Count;i++) {
? ? ? ? ? ? if (i == 0)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? birds[i].enabled = true;
? ? ? ? ? ? ? ? birds[i].sp.enabled = true;
? ? ? ? ? ? }
? ? ? ? ? ? else {
? ? ? ? ? ? ? ? birds[i].enabled = false;
? ? ? ? ? ? ? ? birds[i].sp.enabled = false;
? ? ? ? ? ? }
? ? ? ? }
? ? }
然后寫流程控制函數,該函數在小鳥銷毀時調用(定義為公共),以便于下一個小鳥的初始化。
? ? public void NextBird(){
? ? ? ? if (pigs.Count > 0)
? ? ? ? {//還有豬
? ? ? ? ? ? if (birds.Count > 0)
? ? ? ? ? ? {//還有鳥,初始化鳥
? ? ? ? ? ? ? ? Initialized();
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? {//沒有鳥,輸了
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? else
? ? ? ? {//沒有豬,贏了
? ? ? ? }
? ? }
在小鳥的代碼中寫小鳥銷毀函數,主要處理從管理類的列表移除當前小鳥,銷毀當前鳥,生成小鳥銷毀特效,調用流程控制(判斷游戲流程)。(注意需要為小鳥也添加銷毀特效不再贅述)
? ? void DestoryBird() {
? ? ? ? GameManager._instance.birds.Remove(this);
? ? ? ? Destroy(gameObject);
? ? ? ? Instantiate(boom,transform.position,Quaternion.identity);
? ? ? ? GameManager._instance.NextBird();
? ? }
另外,在鼠標抬起的小鳥飛出的代碼后面,加上調用小鳥銷毀函數,在5秒后執行。
?? ?Invoke("DestoryBird", 5f);
另外,在start函數中初始化小鳥狀態:
? ? void Start () {
? ? ? ? GameManager._instance.NextBird();
? ? }
注意,在小鳥代碼中需要將SpringJoint2D屬性設置為public,以至在Initialized初始化函數中能夠對其進行激活設置。(可設置在面板隱藏)如下:
? ? [HideInInspector]
? ? public ?SpringJoint2D sp;
★★小鳥生成位置優化,皮筋優化
位置優化,主要在小鳥初始化時,將其第一個小鳥位置設置為在場景中得到的第一個小鳥的位置。
?? ?birds[i].transform.position = originPos;
這里的初始位置,在Awake中得到。
先聲明初始位置?? ?public Vector3 originPos;
? ? ? ? if (birds.Count > 0) {
? ? ? ? ? ? originPos = birds[0].transform.position;
? ? ? ? }
皮筋優化,在鼠標抬起時,禁用畫線組件,鼠標按下時激活畫線組件即可。
鼠標抬起:
? ? ? ? rightLine.enabled = false;
? ? ? ? leftLine.enabled = false;
鼠標按下:
? ? ? ? rightLine.enabled = true;
? ? ? ? leftLine.enabled = true;
★★小鳥拖尾效果(使用武器拖尾插件)
關于Pocket RPG Weapon Trails插件的使用在此不再說明,詳細使用方法參考其他博客文章,因個人覺得這個拖尾效果不適合小鳥,故本次制作中也不再制作拖尾效果。
★★場景優化(搭建)
在目前的制作中,小鳥的數量是直接拖到游戲場景中,小豬的數量也是直接拖到游戲場景中,此兩樣暫時沒有種類變化。
木頭石頭冰棍等其他障礙物,掛載的是小豬的代碼,在場景中加入障礙物圖集后,添加剛體和碰撞體,掛載小豬代碼,不勾選是小豬,有如下參數需要具體說明:
【死亡速度】,【受傷速度】,【受傷圖集】,【爆炸特效預制體】,【分數特效預制體】,其中還有其他的參數需要調整,及剛體組件的【質量】和【角阻力】,
可以將長木頭,三角木頭,石頭,木頭框,等不同類型的障礙物分別制作成不同的預制體,爆炸特效預制體或分數特效預制體有不同的,還需要分別制作。
游戲中的物體目前包括不交互的【背景】(背景天空,背景地面,背景小草等)
【游戲物體】(左右部分彈弓,小鳥,皮筋,小豬,障礙物)
背景的層級關系,可以通過order in layer手動調節,以正確顯示,游戲物體則基本統一為一層,不發生層疊,彈弓處為例外,需單獨調整。
游戲中的小豬和障礙物,手動擺放。
★★輸贏界面制作
新建【ui】>【image】,雙擊它,點擊其左上角的小框,按住alt可以改變填充。
改名字為lose,在其下建立三個圖片分別是pig,home,retry,分別放置小豬圖片,home按鈕圖片,retry按鈕圖片,其他諸如調顏色等的操作不再贅述。
選中lose,按ctrl+6打開動畫編輯器,為該圖片添加一個圖片顏色的動畫,設置第一幀的不透明度為0,保存動畫。贏的界面與之相似,其他的不再贅述。
目前,有lose和win兩個圖片界面,這兩個界面各自有一個動畫狀態機,各自有一個漸變效果的動畫。
★★煙花特效(粒子系統)
在這里是導入煙花特效的包,里面有已經制作好的預制體,關于粒子系統參數的修改設置,在此處涉及不多,不再贅述。
★★渲染層級
【相機camera下的depth】,先繪制深度低的物體,前面的擋住后面的。
【同一個camera下的sorting layer】,層級數大的擋住小的
【同一個sorting layer下的order inlayer】,層級數大的擋住小的
區別于物體layer,大致作用類似于給不同物體的標簽分類。
新建一個相機作為UICamera,渲染UI物體,這里有幾項設置需要說明
【clear flags】設置為【只深度】,這樣,在沒有物體的地方,不顯示東西。
【culling mask】設置為UI,表示只渲染UI層。
【projection】設置為正交。有透視和正交兩個選項。
【depth】默認的主攝像機為-1,新建的攝像機設置為0。
在canvas中,將render mode 設置為相機,把剛建的UI相機賦值過來。
如此,將主攝像機的渲染UI層去掉,將特效root移動到每個要顯示的星星下邊,將層級設置為UI層,將粒子特效的sorting layer設置為player(這里是最上層顯示,也可以設置成其他層),可以結合在場景視圖中調整root的位置。
★★星星的逐一顯示
在贏的UI中的win中,已經添加了一個動畫,在激活win界面時,就會播放該動畫,所以,給win添加一個腳本,寫一個函數,
? ? public void Show() {
? ? ? ? GameManager._instance.ShowStar();
? ? }
調用,管理類中的星星播放函數,在win的動畫結束幀添加事件調用腳本win中的函數,所以這里還要在管理類中寫一個星星顯示函數。如下
? ? public void ShowStar() {
? ? ? ? StartCoroutine("Show");
? ? }
? ? //協程控制星星的生成
? ? IEnumerator Show()
? ? {
? ? ? ? for (int i = 0; i < birds.Count + 1; i++)
? ? ? ? {
? ? ? ? ? ? yield return new WaitForSeconds(0.4f);
? ? ? ? ? ? stars[i].SetActive(true);
? ? ? ? }
? ? }
其中,涉及到了協程的基礎使用方法,簡單不贅述。
其中,新建了星星的gameobject數組,需要在編輯器賦值。
? ? public GameObject[] stars;
★★暫停界面UI
界面制作,不贅述。
在這里要先給暫停UI制作兩個動畫,一個是暫停UI出現,一個是暫停UI消失。
并給所有按鈕圖標添加上按鈕組件,以便后續能夠注冊點擊事件。
★★實現暫停和恢復的功能
首先是暫停UI動畫狀態機的設置,已經制作了兩個動畫,打開狀態機,將默認動畫設為新建一個空動畫,空動畫連接顯示(添加bool變量值為true),顯示連接隱藏(變量設為false),隱藏連接空。
然后開始寫點擊點擊事件,給pauseUI添加代碼,寫上四個函數,分別是點擊暫停,暫停動畫結束,點擊恢復,恢復動畫結束,其內容如下:
? ? public Animator anim;
? ? public GameObject pauseButton;
? ? //點擊暫停,隱藏暫停按鈕,播放顯示UI動畫
? ? public void Pause() {
? ? ? ? pauseButton.SetActive(false);
? ? ? ? anim.SetBool("ispause",true);
? ? }
? ? //點擊繼續,游戲繼續,播放隱藏UI動畫
? ? public void Resume() {
? ? ? ? Time.timeScale = 1;
? ? ? ? anim.SetBool("ispause", false);
? ? }
? ? //顯示UI動畫結束,游戲暫停
? ? public void PauseAnimatEnd() {
? ? ? ? Time.timeScale = 0;
? ? }
? ? //隱藏UI動畫結束,顯示暫停按鈕
? ? public void ResumeAnimatEnd() {
? ? ? ? pauseButton.SetActive(true);
? ? }
給各個按鈕注冊點擊事件,給動畫結束幀注冊事件。
在GameManager類中添加home和replay事件函數,注意在這里我添加了重新設置時間尺寸的語句,因為我在暫停界面的按鈕也是調用的管理類中的函數。
? ? public void Replay() {
? ? ? ? Time.timeScale = 1;
? ? ? ? SceneManager.LoadScene(2);
? ? }
? ? public void Home() {
? ? ? ? Time.timeScale = 1;
? ? ? ? SceneManager.LoadScene(1);
? ? }
★★相機的跟隨運動
在小鳥的update中添加如下代碼
? ? ? ? //相機跟隨
? ? ? ? float posX = transform.position.x;
? ? ? ? posX = Mathf.Clamp(posX, 0, 15f);
? ? ? ? Vector3 targetPos = new Vector(posX,
?? ??? ?Camera.main.transform.position.y,Camera.main.transform.position.z);
? ? ? ? Camera.main.transform.position = Vector3.Lerp
?? ??? ?(Camera.main.transform.position, targetPos, smooth * Time.deltaTime);
這里使用了數學類中限制值的函數方法clamp,參數(要限制的值,最小值,最大值),還使用了插值運算,方法lerp,參數(開始位置,目標位置,平滑速度)
★★音效添加
在這里使用的是AudioClip靜態賦值的方式播放。
? ? //聲明
? ? public AudioClip select;
? ? public AudioClip fly;
? ? //統一播放函數
? ? public void AudioPlay(AudioClip clip){
? ? ? ? AudioSource.PlayClipAtPoint(clip, transform.position);
? ? }
? ? //調用播放
? ? AudioPlay(fly);
另外,使用了碰撞體標簽識別碰撞物體,選擇性播放。
? ? ? ? if (collision.gameObject.tag == "Player") {
? ? ? ? ? ? AudioPlay(audioCollision);
? ? ? ? }
將這個代碼寫在小豬中,在這里的作用是,小豬和木板碰撞到小鳥后,小鳥發出碰撞的叫聲。
總結
以上是生活随笔為你收集整理的siki学院_Unity初级案例_愤怒的小鸟_学习笔记2/3的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用Windows虚拟打印将caj转pd
- 下一篇: 二、信号分解—>局部均值分解(LMD)学