用Unity簡單實現(xiàn)明日方舟
一、前言
這次學(xué)校工作室的考核任務(wù)(是的還是考核)是復(fù)刻一款游戲,給出了三個游戲選擇(饑荒/殺戮尖塔/元氣騎士)不過我都沒有玩過,于是想了想我決定做一個簡陋版的明日方舟。之前在b站看到過大佬僅耗時48小時開發(fā)出明日方舟的戰(zhàn)斗界面,感覺好像也不會很難吧……就去試了!
但是做了之后才發(fā)現(xiàn)其實是很有挑戰(zhàn)性的一次任務(wù)。先上兩張游戲界面的圖(p2p3),完整游戲效果請見聯(lián)盟公眾號發(fā)布在b站的視頻


二、制作思路
場景:
最開始我的想法包括了五個場景:兩個關(guān)卡、選擇干員的界面、看板界面和登錄起始界面(包括一些本地化的內(nèi)容,工作量挺大的)。后來由于時間不夠了就砍成了登錄起始界面和一個關(guān)卡。
干員:2D骨骼/Trail Renderer
選擇什么干員來演示比較合適呢?方舟并沒有公開模型,如果要獲取對應(yīng)的gif會比較麻煩,而自己畫角色好像也很麻煩。
糾結(jié)了半天我決定畫三個自己的原創(chuàng)角色,并使用2D骨骼動畫制作了相關(guān)的站立、戰(zhàn)斗的動畫(對2D骨骼感興趣的同學(xué)可以在b站上找Michael老師的系列教程參考學(xué)習(xí))
在干員戰(zhàn)斗的時候你會注意到一些秘制特效,這是用Unity自帶的組件Trail Renderer做的。這個組件很強大,如果加上一點代碼能得到非??岬男Ч?/p>
關(guān)卡:2.5D/正交相機+透視相機
關(guān)卡界面我是完全按照方舟游戲本體的某一關(guān)來搭建的。
我們知道舟游的地圖是3D的,但是干員又是紙片人,這種不同維度的結(jié)合勢必會帶來一些問題。幾番考慮我決定在2D場景中創(chuàng)建3D的地圖(其實是某種意義上的2.5D),正好Unity默認的Cube長寬為1,完美契合了地圖格子的對應(yīng)位置,能夠得到圖4的效果:

因為想要得到近大遠小的效果,所以渲染地圖的相機必須是透視而不是正交的,但是這樣會導(dǎo)致我方干員貼圖在挪動到地圖邊緣的位置時出現(xiàn)扭曲的現(xiàn)象。為了解決這個問題,我額外引入了另一個正交像機專門用來渲染干員預(yù)制件,這樣干員在拖拽實例化之后怎么看都像端端正正站立在地圖上的。
不過這樣也會導(dǎo)致另外一個問題,那就是在靠近邊緣的地方干員和格子可能無法很好的對應(yīng)上。我認為是能找到一個數(shù)學(xué)模型來對應(yīng)的,但是有點麻煩…
后來在參考研究48h開發(fā)明日方舟的白斗七星大佬的作品時發(fā)現(xiàn)他只用了一個攝像機,但是這個攝像機的機位很巧妙,把近小遠大的影響壓到了最小。
三、具體實現(xiàn)
標題場景比較簡單,就是幾個UI元素調(diào)到還行的布局,在此不多做論述。


在上一期《用Unity簡單實現(xiàn)合成大西瓜》一文中,我在代碼結(jié)構(gòu)的處理上非常糟糕,該封裝的東西都沒封裝,導(dǎo)致整個代碼結(jié)構(gòu)特別復(fù)雜也特別亂。這次在這方面做了一些小小的努力,相對結(jié)構(gòu)也還是能看的吧(笑~)
敵人相關(guān)
EnemyWaveController參(zhao)考(ban)了油管上Brackeys老師的教程,EnemyMove則使用了A*算法。對于網(wǎng)格地圖上的移動,除了A*之外還有好幾種其他的尋路算法,感興趣可以上b站找Joe的視頻參考學(xué)習(xí)。
為了減小開銷(在頻繁銷毀生成的資源很多的時候,這點非常重要),敵人的生成和死亡使用了對象池
Player相關(guān)
第一次寫接口(IPlayer)竟然是用在玩家的攻擊和特殊攻擊上。因為考慮到每個我方干員都有這兩種攻擊形式和一些屬性,就整了這么個,后來用起來也還挺方便的。
PlayerMgr里的玩家列表對“已上場的干員”、“還未上場的干員”、“攻擊范圍內(nèi)的干員”都有著至關(guān)重要的作用。UI的玩家圖像按鈕就是依賴于這個列表
玩家信息則存放的是該干員的部署費用、名字等元素
UI相關(guān)
有很多按鈕的OnClick事件和一些與數(shù)值有關(guān)的事件委托。
其中最復(fù)雜的地方莫過于拖拽實例化+放置玩家+設(shè)置朝向。我的思路大概是這樣的:
點擊玩家按鈕列表,利用eventHandler的drag函數(shù)在鼠標的地方實例化出對應(yīng)干員 à 拖的時候?qū)?yīng)的地塊顏色變成綠色(調(diào)整材質(zhì)球的顏色) à 松開鼠標,如果在適合的位置就吸附到該格子中心 à 調(diào)整朝向,攻擊范圍也隨之改變 à 放置完成
想法挺簡單的,寫起來有點復(fù)雜..相信有更快更簡潔的實現(xiàn)方式
四、回顧思考
值得改進的地方有許多,比如從代碼角度出發(fā),我的代碼還不夠精簡(尤其是拖拽放置的那個模塊),還不夠OOP(
此外,從可玩性的角度出發(fā),如果地圖和敵人能做到隨機生成,那么游戲的可玩性和難度會大大提升的
最后,感謝閱讀到這里的你!如果你對這個項目有什么意見和建議歡迎私聊A君探討
源碼已上傳GitHub:https://github.com/Guiny-Time/Arknights

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?作者:時光
? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? 審核:觀復(fù)·鈞天

加入我們
APC科普編輯部招新啟事
A.P.C.總部招生群:1027526691
格物社?科普平臺:605923025