目錄
遊戲原型
爆破任務 MissionDemolition 是一款核心機制相似於憤怒的小鳥的遊戲,玩家將用彈弓發射炮彈,摧毀城堡,最終目標是讓發射的炮彈抵達城堡中心的目標區域。咱們所但願實現的有:html
- 當玩家鼠標光標處於彈弓區域內時,彈弓高亮,表示此時能夠進行射擊操做。
- 當玩家在該區域內按下左鍵,會實例化彈丸。玩家持續按住左鍵而且在必定範圍內移動光標,實現不一樣角度拉伸彈弓。
- 當玩家鬆開左鍵時,彈弓將彈丸彈射出去,並顯示彈丸運動的軌跡。
- 不一樣關卡有不一樣的城堡樣式,但咱們的目的是一致的:摧毀城堡,讓發射中的炮彈抵達城堡核心區域,不然炮彈將熄滅,沒法摧毀目標。
項目演示
![](http://static.javashuo.com/static/loading.gif)
Github項目地址:MissionDemolition 爆破任務
試玩下載:MissionDemolition 爆破任務 提取碼3wq7git
繪圖資源
- 地面:用極長條狀Cube做爲地面,賦予地面材質
- 攝像機:設置MainCamera的P[0,0,-10],投影方式Projection爲Orthographic,Size爲10,可另行修改天空盒
- 彈弓繪製:用3個圓柱體成必定角度組合而成彈弓,添加彈弓材質,設置爲觸發器。最終3個部件存於Slingshot物體下,完成彈弓
- 彈丸繪製:用Cube加剛體組件加暗色材質便可
- 雲朵繪製:用移除碰撞器的球體,Shader組件執行Legacy Shaders->self-Illiumin->Diffuse,爲其添加漫射光,調整拾色器爲偏向灰白色。建立多個同類物體,進行拉伸縮放調整,最終建立4個雲朵預製體
- 城堡繪製:用Cube加剛體組件,鎖Z軸旋轉,給城牆添加材質或物理材質,最終建立多個城堡做爲預製體;還得添加城堡核心Goal,用其餘顏色得Cube填充,設定爲觸發器,設爲預製體
- ProjectileLine物體:僅添加Line Renderer組件、Material及後續ProjectileLine.cs腳本添加尾拖
- CloudAnchor物體:不添加其餘組件,用於後續CloudCrafter.cs腳本添加雲朵
- UI:Canvas內的Text有3個,包括:得分GT_Level,當前關卡GT_Score,勝利頁面GT_Win
代碼實現
Slingshot.cs |
掛載於Slingshot,實現彈弓激活時的高光、彈丸從實例化到發射、驗證彈丸觸及目標區域的合法性 |
FollowCam.cs |
掛載於MainCamera,實現相機平滑跟蹤發射出去的彈丸,在彈丸靜止或者必定時限後回視角到彈弓 |
Goal.cs |
掛載於Castle內的Goal,驗證炮彈觸及此目標區域的合法性,若驗證成功則改變其顏色表示經過此關卡 |
ProjectileLine.cs |
掛載於ProjectileLine物體,用於配置尾拖參數,實現尾拖特效 |
CloudCrafter.cs |
掛載於CloudCrafter物體,實現不一樣類型雲朵的實例化,並賦予其運動效果 |
MissionDemolition.cs |
掛載於MainCamera,實現關卡切換,遊戲斷定,UI更新,添加頂端button實現視角切換 |
注意事項
- Orthographic正交投影相機:其Size是指攝像機視野中心到底部或者頂部的距離,即Size是攝像機視野高度的一半
- IsKinematic運動學剛體:剛體的運動不會受到碰撞和重力的影響,但仍會影響其餘非運動學的剛體。本例中處於拉伸瞄準狀態的彈丸便是運動學剛體,當彈丸發射出去後當即改變狀態爲非運動學剛體,受到重力影響下墜
- UI自適應:設置Canvas內Canvas Scaler組件上UI Scale Mode爲Scale With Screen Size,實現不一樣分辨率下UI大小自適應
技術探討
- 城堡不穩定性:
- 問題描述:城堡堆到到必定層次後,會產生滑移,最終還未被彈丸碰撞即自行倒下
- 問題分析:首先可能爲結構受力問題,頭重腳輕;其次可能爲物理材質內摩擦力的問題
- 解決方案:目前稍微可行的方案有:調整城堡堆垛結構,遵循三角形結構,底部材料可加劇,頂部材料可減輕;其次設置物理材質,增大動靜摩擦力,阻礙滑移(當複雜城堡仍未較好解決)
- 相機平滑跟蹤:
- 問題描述:若只是單純的將相機的position跟隨彈丸的position,顯得畫面機械化,粗糙化
- 問題分析:position簡單跟隨沒法實現平滑視角
- 解決方案:採用插值法,即
destination = Vector3.Lerp(transform.position, destination, easing);
;Vector3.Lerp()
返回兩點之間的一個線性插值位置,取兩點位置的加權平均值,當 easing=0 時,返回 transform.position;當 easing=0.05時,表示讓相機從 當前位置向 目的地位置 移動,每幀靠近5%的距離。概念描述:設初始時當前位置p,目的地位置q,兩點間距 d1=q-p;第二幀時,d2=(1-0.05)d1;第三幀時,d3=(1-0.05)d2,...,由此下去,相機每幀都會更靠近目標地點必定距離,由此,咱們能夠看到平滑跟隨的視角
- 相機視角縮放:
- 問題描述:當彈丸發射到較高高度後,此時咱們只能看到彈丸在天空中緩慢移動,沒法直觀判斷快慢
- 問題分析:本來設置得攝像機正交視角Size=4,當彈丸太高時,地面脫離出視角
- 解決方案:首先限制相機目的地destination的x,y座標,限制其不移動到彈弓左側或是地面如下,即x,y的值不會爲負:
destination.x = Mathf.Max(minXY.x, destination.x); destination.y = Mathf.Max(minXY.x, destination.y);
。其次,設置相機Size的大小:GetComponent<Camera>().orthographicSize = destination.y + 10;
,由於初始時Size的大小即爲10,destination.y 因爲上面代碼的限制初始時爲0,故不管初始時或者落地時,Size最小爲10,且能隨着彈丸飛高而擴大Size
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
參考來源