從零開始做一個SLG遊戲(七):遊戲系統以及配置表
![從零開始做一個SLG遊戲(七):遊戲系統以及配置表](https://i.iter01.com/images/5c9a75d93049d9c72357b7c68af0fcddb7bd35c02810536af3b982568135efc2.png)
本文主要是來梳理下游戲內的基本系統(雖然只是照搬polytopia的,但是還是要總結一下),並預先做一些配置表,並實現讀取。
一、經濟系統
![從零開始做一個SLG遊戲(七):遊戲系統以及配置表](https://i.iter01.com/images/8c24e419ee8639109fda05a025f36589a1529d832a57079306f853fd92018df2.jpg)
1.總述
經濟系統可以是整個遊戲的核心。在本遊戲中只有一種資源:金幣。
每個回合都會獲得一定數量的金幣。
金幣主要有兩種來源:城市基本產出和建築的額外產出。
金幣的消耗方式有三種:1.建造建築2.解鎖科技3.建造士兵,而士兵維持是不需要額外的金幣的。
2.城市的建設
和文明類遊戲一樣,每個地塊都有其所屬的城市。
在城市等級比較低的時候,只有該城市周圍1格的地塊屬於那座城市。而城市等級到達一定程度時,可以解鎖讓城市範圍擴張為2格。
地塊的開發分兩種:對於資源的收集和對於地形的開發。
每個地塊上都有對應的地形,針對不同的地形,可以建設不同的建築,比如森林地形可以建造伐木場,沃土地形可以建造農田等。
而在這個地形的基礎上,有些地塊可能會有一些額外的資源,比如動物和植物等,玩家在前期可以通過採集的方式來增加人口。
3.配置表設計
以下是配置表的設計:
首先是地形表。
![從零開始做一個SLG遊戲(七):遊戲系統以及配置表](https://i.iter01.com/images/222fbcf7f1baafda5dc12a292a090e6714042960d290192f1076bae2a758b9f2.jpg)
在本系列最早的文章內,已經介紹了地形的生成方法,前文定義了Water,Plain,Mountain三種地形,對應海拔1,2,3。現在再加一種新的海拔0用以代表深海。這樣4種高度的地形就齊了。
而同一海拔的地形會有多種形態,比如海拔為2的平原將有平原、沃土、森林三種情況,通過科技這幾種狀態甚至可以相互轉換。而區分這幾種狀態的方式是增加額外的裝飾物。而資源id便是裝飾物的檔名,填0表示沒有任何裝飾物。
移動力花費指的是士兵移動走上去所需要消耗的移動點數。
然後是資源表。
![從零開始做一個SLG遊戲(七):遊戲系統以及配置表](https://i.iter01.com/images/b6764ef31e5c16620b36b0a1ac73fd49332614de96dfa3eed5013a9865bbf0b8.jpg)
和上面一樣,資源id指的是資源對應的檔名,生成地圖的時候,將根據所屬的海拔分配資源。比如鯨魚就只能出現在海拔為0的深海區域內。
獎勵型別分兩種,型別1指的是給所在的城市增加人口,型別2指的是直接增加金幣。
接下來是建築表:
![從零開始做一個SLG遊戲(七):遊戲系統以及配置表](https://i.iter01.com/images/3519b7fcb857305b1cd10d710e40cd042be423bdb2b095ba0443d722df11334e.jpg)
地形指的是建造所需要的地形,對於的是地形表中的id,其中34這種兩位數的id指的是3和4兩種地形都可以,因為地形種類沒有超過10,所以就用這種方式實現了(如果超過10其實也可以,不過需要把10以上的數字改為abcd)
鄰近建築指的是有些建築建造,需要周邊地塊擁有某些建築。比如穀倉建造需要旁邊的地塊上有農田。
作用型別1指的是直接增加人口,比如碼頭的作用就是給該城市增加2人口。
作用型別2指的是,根據周邊地塊某建築的數量來加人口,比如穀倉的效果是周圍有一個農田就加1人口,所以穀倉的鄰近建築是3(農田),作用型別是2,效果是1。
作用型別3指的是根據周圍某建築的數量直接增加回合金幣,這也是唯一的一個直接通過建築增加回合金幣的途徑。
最後是城市表:
![從零開始做一個SLG遊戲(七):遊戲系統以及配置表](https://i.iter01.com/images/44f4f0cd724a39aaf27c8edd19057388a907e6c016148f26c9f710d40c171213.jpg)
後續實現的時候會根據效果id實現對應的效果。其中1,2,3級城市的2個效果是2選一的。
二、科技系統
科技系統簡單說就是花費金幣解鎖科技,而隨著城市數量的增加,科技花費也要增加。
公式如下:
科技花費=(基礎花費+(城市數量-1)*科技等級)*(1-科技減免)
科技分為3個等級,其基礎花費分別為5,6,7
科技減免指的是某個科技點了之後會有一個科技花費20%減免的效果。
下面是科技花費表:
![從零開始做一個SLG遊戲(七):遊戲系統以及配置表](https://i.iter01.com/images/e337da66183f9b7d876bdcb665ec00942164a1c41e2a2f87baf4e1c864c1f0be.png)
很簡單的一張表。
下面是科技表:
![從零開始做一個SLG遊戲(七):遊戲系統以及配置表](https://i.iter01.com/images/1fc756b83c0d614c939cf44be6c4f4eb2305b831ae4f72a5f13d848969f04ed6.jpg)
這張表數量有點多,並且作用程式碼一欄我沒填。將來實現的時候會把這張表完善起來。
三、兵種系統
先把兵種表附上:
![從零開始做一個SLG遊戲(七):遊戲系統以及配置表](https://i.iter01.com/images/e89c728984a42a6e7babe27a16b62fd108205087e7ef6e80c91b664317fd380b.jpg)
兵種就不多說了,大部分SLG遊戲都差不多。
比較注意的是:
1.船是無法直接製造的。陸地單位在碼頭處下海後,能變成一艘小船,小船的血量以及血量上限和該單位在陸地上時相當。
2.A攻擊了B,如果A在B的攻擊範圍內,則B會在同時進行一次反擊。
攻擊傷害=攻擊方血量*攻擊方攻擊/(防守方防禦*(1+防守方防禦加成))
反擊傷害=反擊方血量*(反擊方防禦*(1+反擊方防禦加成))/攻擊方攻擊
四、配置表的匯入和讀取
1.配置表的儲存
配置表的我是用excel儲存的,匯出方式是匯出為csv檔案。
![從零開始做一個SLG遊戲(七):遊戲系統以及配置表](https://i.iter01.com/images/ef3a93ed1705e6e51afd1efbb0061ba5884e17e62f7929162f775ef742db9495.jpg)
csv檔案的匯出很簡單,先切換到想要儲存的那個excel標籤頁。
![從零開始做一個SLG遊戲(七):遊戲系統以及配置表](https://i.iter01.com/images/37cdd3b71dd9fdbfe5a2e88fc7d2bab4b44903407c5193439c9a8612ccba8246.png)
然後選擇另存為。
![從零開始做一個SLG遊戲(七):遊戲系統以及配置表](https://i.iter01.com/images/c9ccf48d8e23f6dd6b02eaa205687c9b83049cdd2c2178aadeeca78d386bb4c5.jpg)
然後在儲存型別的時候切換到csv就行了,記得檔名也要改一下,因為這次匯出的只是一個標籤。
![從零開始做一個SLG遊戲(七):遊戲系統以及配置表](https://i.iter01.com/images/9dc970b0b5ecaba6ce8fbc969d4213699ca15b3cffbada2014cff89fad6262fa.png)
然後再在下面這個目錄中建立CSV資料夾,並且把想要讀取的csv檔案都放進去。
2.配置表格式的修改
這是的配置表有兩個問題:首先unity對csv格式據說不是很支援,最好改成txt格式。然後就是,這時候儲存出來的編碼是非utf-8的,所以unity直接讀會讀不出來。
這兩個問題手動操作肯定也是能夠解決的(用txt開啟,改編碼然後另存為txt格式),但是太麻煩了,尤其隨著製作的推進,表越來越多,每次都手動修改會浪費大量時間。
這時候就需要做一個內建工具了:
- using System.IO;
- using System.Text;
- using UnityEditor;
- using UnityEngine;
- public class TranslateUTF8
- {
- [MenuItem("MyMenu/UTF8Transform")]
- static private void TransformUTF8()
- {
- string spriteDir = Application.dataPath + "/Resources/CSV";
- DirectoryInfo rootDirInfo = new DirectoryInfo(spriteDir);
- foreach (FileInfo csvFile in rootDirInfo.GetFiles("*.csv", SearchOption.AllDirectories))
- {
- string csvpath = csvFile.FullName;
- Translate(csvpath);
- }
- Debug.Log("utf8轉換成功");
- }
- private static void Translate(string path)
- {
- string content = File.ReadAllText(path, Encoding.Default);
- File.Delete(path);
- File.WriteAllText(path.Remove(path.LastIndexOf("."))+".txt", content, Encoding.UTF8);
- Debug.Log(path + " 轉換完畢");
- }
- }
這是我以前寫的一個轉化工具,功能是把Resources/CSV這個資料夾下的所有csv檔案轉化成utf-8的txt檔案,並把原來的csv檔案刪除掉。
在專案中新建一個指令碼檔案,然後把這段程式碼複製進去把原來的替換掉就能使用。
![從零開始做一個SLG遊戲(七):遊戲系統以及配置表](https://i.iter01.com/images/7cd97160ff22e497e6889e9076e0de4866fbb1b19bc6e8fa60a797bd1571a46e.jpg)
這時候,回到unity介面,會出現一個MyMenu選單欄,進去後點選一下就行了。
3.配置表的讀取
![從零開始做一個SLG遊戲(七):遊戲系統以及配置表](https://i.iter01.com/images/5dee99d1997075afb0e5943c1b3434b7e420a3b71eda75d0013799e73bba6d26.jpg)
配置表是csv格式的。csv格式的意思是,原excel中,每一行的單元格之間,用逗號分隔開,如上圖。
所以在填寫配置表時,要儘量避免逗號的出現。以下是程式碼:
- public class CSVUtil
- {
- public static List<string[]> Process(string filePathName)
- {
- TextAsset asset = Resources.Load(filePathName) as TextAsset;
- string file = asset.text;
- List<string[]> ls = new List<string[]>();
- if (file == "")
- {
- return default(List<string[]>);
- }
- else
- {
- string[] strList = file.Split("\r\n"[0]);
- foreach (string str in strList)
- {
- string s = str.Replace("\n", "");
- if (s != "")
- {
- ls.Add(s.Split(","[0]));
- }
- }
- return ls;
- }
- }
- }
"\r\n"是換行符,但不知道是什麼原因,我用"\r\n"來分割字串後,還是有"\n"留下來,所以我在下面處理的時候把“\n”又去掉了一次。
相關閱讀:
從零開始做一個SLG遊戲(一):六邊形網格
從零開始做一個SLG遊戲(二):用mesh實現簡單的地形
從零開始做一個SLG遊戲(三):用unity繪製圖形
從零開始做一個SLG遊戲(四):UI系統之主介面搭建
從零開始做一個SLG遊戲(五):UI系統之彈窗功能
從零開始做一個SLG遊戲(六):UI系統擴充套件
作者:觀復
專欄地址:https://zhuanlan.zhihu.com/p/70155323
相關文章
- 從零開始做一個SLG遊戲(八):配置表載入元件遊戲元件
- 從零開始做一個SLG遊戲(六):UI系統擴充套件遊戲UI套件
- 從零開始做一個SLG遊戲(四):UI系統之主介面搭建遊戲UI
- 從零開始做一個SLG遊戲(五):UI系統之彈窗功能遊戲UI
- 從零開始做一個SLG遊戲(一):六邊形網格遊戲
- 從零開始做一個SLG遊戲(三):用unity繪製圖形遊戲Unity
- 從零開始做一個SLG遊戲(二):用mesh實現簡單的地形遊戲
- 從零開始實現放置遊戲(一)遊戲
- 從零開始:用REACT寫一個格鬥遊戲(一)React遊戲
- 從零開始:用REACT寫一個格鬥遊戲(二)React遊戲
- 從零點五開始用Unity做半個2D戰棋小遊戲(一)Unity遊戲
- 從零開始實現放置遊戲(三):後臺管理系統搭建遊戲
- UGC遊戲浪潮(三)做一個UGC遊戲與在UGC做一個遊戲GC遊戲
- 從零開始實現放置遊戲(一):整體框架搭建遊戲框架
- phaser3入門教程-從零開始開發一個打磚塊遊戲遊戲
- 用Unity做個遊戲(二) – 事件系統Unity遊戲事件
- 遊戲走向成功從一個好的IP題材開始……遊戲
- 從零開始實現放置遊戲(五):管理系統搭建之實現切面日誌遊戲
- 從零開始實現放置遊戲(六):Excel批量匯入遊戲Excel
- ? es6 + canvas 開源 蓋樓小遊戲 完整程式碼註釋 從零教你做遊戲(一)Canvas遊戲
- 從0開始用python寫一個命令列小遊戲(二)Python命令列遊戲
- 從0開始用python寫一個命令列小遊戲(十)Python命令列遊戲
- 從0開始用python寫一個命令列小遊戲(六)Python命令列遊戲
- AlphaZero進化論:從零開始,制霸所有棋類遊戲遊戲
- 從零開始實現放置遊戲(四)後臺數值配置的增刪查改遊戲
- NFT遊戲系統開發/遊戲開發技術遊戲開發
- 學習程式設計從遊戲開始程式設計遊戲
- 遊戲開發者的孤獨之旅:潛行七年做一款潛行遊戲遊戲開發
- 從零開始手把手教你使用javascript+canvas開發一個塔防遊戲01地圖建立JavaScriptCanvas遊戲地圖
- 在遊戲裡做遊戲?從《坦克大戰》到DOTA遊戲
- 悠遊世界合成遊戲系統技術開發解析/合成遊戲/小遊戲遊戲
- JavaWeb——從零開始構建一個客戶管理系統(一)JavaWeb
- DApp遊戲系統開發APP遊戲
- 文案策劃必修課(1):從零開始的遊戲劇情創作遊戲
- Unity遊戲示例來了,用Unity開源遊戲資源做遊戲,遊戲開發不再難!Unity遊戲開發
- 從零開始實現放置遊戲(六)——實現掛機戰鬥(4)匯入Excel數值配置遊戲Excel
- 悠遊世界/遊戲/系統技術開發/悠遊世界養成遊戲開發解析遊戲開發
- 新手開發者如何著手遊戲設計? 從解剖桌遊開始!遊戲設計