从零点五开始,做半个不能玩的小游戏(二)
好久不見。
這回拖的有點久,一方面是因為很忙(懶),另一方面是寫到一半的時候推翻了一次,所以沒控制好時間...
?
閑話少敘,書接上文吧。
在上一回中,我們完成了:
1、創建項目。
2、添加世界管理器。
3、通過世界管理器生成及管理城市和野外。
好像大概是這個樣子:
?
本回目標:
1、加入英雄。
2、英雄可與周圍的城市、野外進行互動。
3、建立簡單的數值系統,驅動英雄決策。
上回中,為了快速看到效果,我們將城市和野外全部寫到了世界管理器中,但這似乎不是一個很好的解決方法,這是因為:
隨著項目的發展,每當需要為城市、野外添加更多功能時(如:城市建設、野外刷新等),都無法從它們自身(城市、野外)出發去做處理,都需要通過世界管理器去配置數據,再通過邏輯將他們組合成城市、野外的樣子。
長此以往,世界管理器將儲存更多與其本身職責定位無關的數據(如:野外剩余資源量、英雄探索野外的進度數據等)。換位思考,如果你是世界管理器,你不煩么?你肯定會想:“介跟我有嘛關系?我只要管你們(城市、野外)就行了,你們自己的事兒難道自己不會管么?討厭!死鬼!
我敢打賭,如果堅持這么做,過不了多久,世界管理器就會龐大、復雜到你再也不想打開它的程度,這也就是所謂的:一胖毀所有。
?
無論你是否單身,在Unity的世界里,你都不愁找不到對象,因為一切都是對象。
因此,在我們要加入英雄之前,先用對象的概念來稍稍調整一下項目,將城市、野外的邏輯從世界管理器中獨立出來。
重構城市、野外
介于目前對于城市、野外的功能需求還是很簡單,我們就先弄成這樣吧:
?
簡而言之就是將曾經屬于城市的功能(創建周圍的野外)放到了City中去做,而世界管理器僅生成城市并隨機位置。
加入英雄
首先,讓我們先腦補一下英雄應該是什么樣子:
1、愛野外,不探索,毋寧死。
2、會自主選擇野外前往并進行探索。
3、探索結束后根據情況考慮返回城市恢復戰斗力。
4、恢復后開始一個新的探索。
讓我們用一個簡單的狀態機來描述一下:
?
讓我們先把工作簡單分成兩部分:
1、快速實現狀態機,跑通流程。
2、設置一個簡單的數值體系:英雄數值,野外數值。
快速實現狀態機
先定下一些簡單的規則:
1、生成的野外都有一定的資源量用于英雄探索。
2、野外的資源量被探索到0后,將消失。
3、英雄探索中會損失生命值。
4、英雄生命值減少為0后會選擇距離最近的城市進行恢復。
5、英雄生命值恢復后會繼續探索野外。
為了快速跑通流程,我們先將麻煩的部分簡單處理,如:二手手游賬號購買英雄隨機選擇下一個探索的野外;每個野外的資源量設置為固定值等。
為了能更好的看到野外剩余資源量和英雄的血量,我們分別為它們添加兩個血條意思一下,并用腳本控制。
?
好了,我們已經有一個可以毫無原則,像沒頭蒼蠅一樣探索世界的英雄了。
雖然很多時候在現實中我們做事就是如此,但是游戲與現實畢竟是不同的,所以我們要為它們(英雄、野外等)添加一套簡單的數值體系,來讓英雄的探索更有邏輯性一些。
設置一個簡單的數值體系
我們先把上面提到的規則稍微細化一下:
1、野外的數據包含資源量、經驗值、金錢、聲望。
2、英雄的數據包括等級、經驗、力量、力量成長系數、生命值、金錢、聲望、金錢向和聲望向。
3、每個被創建的野外隨機[10. 30]的資源量,每個被探索完的野外將在若干秒后重置成新的隨機野外。
4、每個野外都有難度系數,難度系數的范圍在[1, 5],系數升序難度遞增。
5、每個難度對應一個探索最低力量值,英雄等于此力量值時,探索花費的時間等于資源量,低于此力量會延長探索時間,高于則會縮短探索時間。
6、英雄探索野外會獲得經驗值、金錢、聲望,英雄得到足夠的經驗值會升級,升級會根據力量成長系數來增加力量,英雄的最高等級為30級。
7、英雄每花費1秒鐘探索野外,將消耗1點生命值,每個英雄都有100點生命值,不會隨等級提升而提升,英雄生命值消耗到0時將前往最近的城市進行恢復 。
8、每個難度對應一個英雄等級,高于此等級的探索會得到較少的經驗和聲望,反之亦然。
9、英雄可創建多個,且它們的初始等級、力量成長系數會有一些差別。
10、英雄會結合自身情況及野外情況,根據收益最大化原則確定下一個要探索的野外,而非簡單的隨機。
11、收益由野外的資源量、經驗值、金錢、聲望、探索時間、前往野外的路途時間共同決定。
12、英雄的金錢向、聲望向影響英雄對野外的行動策略,金錢向較高的英雄會對產金幣更高的野外抱有更大興趣;聲望同理。
做這樣一個簡單的數值系統并不麻煩,雖然我沒有數值策劃的經驗,可是我有Excel啊。
?
因為數據量并不大,數據的維度也不復雜,我們用Excel搭建一個小工具來模擬一下這套數值系統。
?
可以看到,隨著野外難度的提升,對應的收益最大等級也在增加。
?
為了保證收益最大化,英雄會選擇適合自己等級的野外來探索。
我們的目的是:
1、英雄隨著等級的提升,逐步拋棄低收益的低難度野外,選擇更高級的野外進行探索。
2、世界管理器則根據英雄平均等級的提升,調整新野外的平均等級。
我們希望看到的是:
1、多個英雄時,英雄們自主選擇探索目標、自由探索并提升等級。
2、由于初始等級、力量成長系數不同,英雄間會拉開差距。
3、隨著英雄平均等級的增長,世界管理器將維護出更多更高級的野外。
讓我們奔著這個目標開始吧。
實現數值體系對世界的影響
先確定一下英雄屬性、野外屬性的數據結構:
?
替換英雄原來的隨機計算權重方式,變換為由一個計算器統一計算:
?
當然,具體計算的公式是參考上面Excel結果寫的。
?
為了能快點看到效果,就偷懶的使用.csv這種方式讀取吧。
為了更直觀的在地圖上區別出不同難度的野外,我們為每個難度設置了不同顏色。
?
這時我們再設置隨機難度的野外時,地圖會變成這樣:
?
再調整一下世界管理器,因為一個野外被探索完畢時,在一定時間后會重置;而重置出的野外,需要根據世界所有英雄、野外的情況來動態調整其難度。而世界管理器作為唯一對所有對象情況都有了解的家伙,需要承擔這個“主持大局”的責任。
?
最后,我們為其他對象補充上應該具有的一些功能,就差不多了:
?
看看效果吧:
?
驗證
如果你能看到這里,應該也會發現一個問題:我們如何驗證這個數值系統是否存在問題呢?
如:
1、英雄是否根據自己的喜好(金幣,聲望)去選擇對應產量不同野外探索?
2、不同的力量成長是否會拉開英雄之間的距離?
巧了,我也不知道。
能很快想到的辦法就是:讓世界運轉一段時間,然后收集英雄們的數據來看一下與預期是否相同。
?
用多倍速運行一段時間后,我們得到了一份英雄成長記錄,用excel簡單處理一下后,讓我們使用公式來驗證一下:
?
1、聲望向/金幣向高意味著英雄更看重聲望的獲取,因此它選擇探索的野外通常具有較高的聲望回報率。
2、相反的,金幣向高的英雄更看重金幣獲取,因此它選擇探索的野外通常具有較高的金幣回報率。
3、當英雄的聲望向與金幣向基本相同時,所探索野外的金幣回報率也會高于聲望回報率,是因為聲望獲取是隨英雄等級提升而減少的,而金幣則不會。
?
總體而言,較高的力量成長系數提高了英雄的經驗獲取速率,因為較高的力量成長系數影響英雄的絕對力量值,而力量值影響野外探索時間。
嗯,貌似還差不太多呢,有bug也就先這樣吧。
下回,將添加一個簡單的UI界面,用以實時觀察英雄和野外的情況。
總結
以上是生活随笔為你收集整理的从零点五开始,做半个不能玩的小游戏(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何快速转化PSD为UI界面?
- 下一篇: 如何设计渲染等级?