1. 程式人生 > >siki學院_Unity初級案例_憤怒的小鳥_學習筆記2/3

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);         } 將這個程式碼寫在小豬中,在這裡的作用是,小豬和木板碰撞到小鳥後,小鳥發出碰撞的叫聲。