從零開始獨立游戲開發(fā)學習筆記(二十三)--Unity學習筆記(十)--M_Studio教程2D入門

小小小小小狐貍
1. 物品收集
先加上櫻桃,這個之前講過就不說了。然后是櫻桃的收集效果。
1.1 IsTrigger
首先得加上碰撞體,然后勾上 IsTrigger,因為我們想讓這個碰撞體作為一個觸發(fā)手段而不是物理效果。
1.2 tag
在 layer 左邊還有一個 tag,也是用于給 objct 分類。不過兩者側重點不同,像是馬上準備要做的碰撞效果 就是 tag 比較側重的部分。之前講的選中物體就是 layer 主場。
這里我們添加一個 collection 的 tag,給櫻桃加上。
然后在 unity 里加一個新的內置方法,叫做 OnTriggerEnter2D,這個方法會在 trigger 碰撞發(fā)生時觸發(fā)。參數為碰撞的物體。這里判斷如果碰撞的物體的 tag 為 Collection 的時候銷毀它。

1.3 物品收集
只是銷毀當然不夠,還需要增加收集的數量。這個很簡單,給 player 加一個 cherry 變量,吃到櫻桃的時候 + 1 即可。
1.4 關卡設計
然后就是自由發(fā)揮,把關卡畫豐富一些。

2. bug 修復
2.1 撞墻不掉落
通過之前的流程做出來的游戲,小狐貍撞到墻后只要按著方向鍵不會掉落。原因是小狐貍移動的時候有一個向左/右的力,而這個力加上摩擦系數,就會產生垂直方向的摩擦力,因此小狐貍不會掉下去。
解決這個的方法當然是對摩擦力進行調整,為了調整摩擦力,需要用到 2D -> Physics Material 2D,也就是物理材質 2D。在 asset panel 新建這么一個材質。拖到小狐貍的臉部的 box collider 上,當然這是取巧之技,真實情況應該是在墻面上新建一個層賦予光滑,只是比較麻煩現在不做。
2.2 多級跳
現在小狐貍可以在空中跳且無限跳,這很不好。當然之后會介紹更好的方法,不過現在可以先通過判斷是否在地面上來判斷是否跳躍做一個簡單的處理。
2.3 多次積分
有時候小狐貍收集到一個櫻桃卻加兩分,這是因為我們給小狐貍設置了兩個碰撞體,因此當某一幀這兩個碰撞體恰好都碰撞了后就會觸發(fā)兩次 OnTriggerEnter2D。
當然你可能回想,可是我們第一次碰撞后就 Destroy 了???沒錯,但是 Unity 的 Destory 并不會在這一幀給你銷毀掉,而是要等到下一幀。因此可以選擇碰撞后將其 tag 設置為 Untagged,這樣就可以避免第二次加分了。

3. UI
所有的 UI 都要在 canvas 上,因此首先創(chuàng)建的應該是一個 canvas。
雙擊 canvas 聚焦,會發(fā)現其在一個完全看不到游戲界面的地方,這是因為 UI 全部是在單獨的界面。 新建幾個 text 和 image,顯示出一些 UI

然后在 player 里去改變這個值(也是為了取巧,真實情況寫在 player 里并不好),在 player 里新建一個 Text 類型的變量(這個變量需要導入 UnityEngine.UI 庫),然后運行的時候更改這個變量即可。
不過依然有一個問題,那就是當切換分辨率的時候,會發(fā)現 UI 的位置會換來換去。
3.1 錨點
進入 canvas 視角,選中一個 UI object,會發(fā)現屏幕中央有一個錨點:

這個錨點的意思就是這個 object 是按照和這個錨點的距離關系保持不變的。這時,選擇 inspector 里上方的這個,這樣就可以將其始終固定在左上角:

但是依然有問題,那就是調整到高分辨率(如 4K) 的時候,UI 會變得非常小,如果有點前端知識可以知道這是因為我們的 UI 用的是 px 為單位造成的,因此我們前往 canvas 的 inspector 里將 UI scale mode 更改為隨著 screen size 而改變(類似于前端的 vh,vw 單位)

4.敵人
首先給一個簡單的,碰到敵人就消滅的效果。做法和收集類似,不過敵人是有碰撞體的而不是 trigger,因此用得另一個方法,這個方法有一個明顯的區(qū)別就是參數不是 collider 而是 collision,因此選取 tag 前搖先取得 gameobject,不過都在 collision 里可以直接訪問因此也不麻煩。

當然這樣很不好,我們想讓角色在踩到敵人才會消滅。因此可以使用之前的 isFalling 來判斷。當然這樣也并不精確,依舊存在很多 bug,這是為了教程取舍。
4.1 彈回和硬直
再給角色添加一個碰撞后彈回的效果,當碰撞發(fā)生時,判斷如果不是踩死敵人的話,就彈回對應方向一段距離。不過添加完彈回的代碼后發(fā)現并不會運作,這是因為方向鍵一直按著的時候,角色會一直被賦予速度,覆蓋掉彈回效果的速度。因此我們引入了硬直效果,當碰撞后賦值硬直,移動動畫里判斷當硬直的時候無法移動。

當然,效果依然還有問題,第一次碰撞后就無法行動了,這是自然,因為我們沒有把硬直調回來。 方法是在 update 里加這么一段:

當速度的絕對值小于 0.1 的時候恢復硬直,也就是當彈回接近停止的時候恢復。
4.2 受擊動畫
除了 falling 狀態(tài)的所有狀態(tài)都可以變成 hurt 狀態(tài),結束后效果類似如下:

5. 簡單敵人 AI
相當簡單的 AI。
首先給青蛙添加腳本,之前都是在 component 里添加的,這樣其實有一個不好,就是自動創(chuàng)建的腳本文件在最外層,還要手動拖到 Scripts 文件夾里,因此比較方便的是直接在文件夾里新建腳本,然后拖到青蛙組件或者hierarchy上即可。
然后我們需要給青蛙加一個左右自行移動的效果。老師給了其中一個方法, 當然真實情況有其他更好的方法,老師主要是為了介紹 unity 的一些特性而專門采用某些方法的。
像是這里的話,老師先是給 frog 增加了兩個子物體(空物體),分別作為左右邊界。那么當我們看向屏幕的時候,發(fā)現因為是空物體,屏幕上找不到位置,因此這里就引入了 icon 的概念:
5.1 icon
點擊在 inspector 左上角的方塊,可以給物體添加 icon。找不到 icon 的時候可以去 scene view 上方的 gizmos 列表里可以調整 3d icon 的大小,這個之前講過。
5.2 debug 可以去 scene 里看
老師想著通過判斷青蛙的位置和子物體的位置的對應來判斷是否轉向。但實際上發(fā)現并沒有這樣做。原因很簡單,因為子物體跟著青蛙一起動了。
雖然這個 bug 很容易就能想到,但是這里老師讓我們去 scene 里看,有玩的時候也可以轉去 scene 里看。因為 scene 里細節(jié)很多,而且可以看到 icon。而 game view 里是看不到的??梢院苤庇^地看到 icon 隨著青蛙在動。
5.3 斷絕繼承關系
這里的解決方案就是在 start 時,斷絕 left,right 與 frog 的繼承關系。使用 DetachChildren 即可。
5.4 不斷絕關系的方式
斷絕后 hierarchy 上全是 left 和 right,雖然不影響游玩,退出游戲模式后也會返回。但是這樣不好看,其實可以在一開始獲得兩個項目的位置后,直接將這兩個項目銷毀。
6. 青蛙動畫
先給青蛙加上跳躍動畫,按照之前的來,先做出一個只要碰到地面就會跳的效果。
6.1 event
在這之后開始介紹事件,因為要做出一個,掉落到地面后完成一個 idle 動畫,再跳躍的效果。這個用之前的方式是不行的,因為要保證一整個 idle 動畫完成,要在 idle 動畫播放完后執(zhí)行,于是 event 出現了。
這里我們把 move 從fixupdate 里移出來。讓 idle 動畫播放到最后時執(zhí)行。這樣就可以保證青蛙在 idle 動畫時時不會移動和跳躍了。 跳躍動畫以及動畫的切換和之前一樣。
7. 成果
