從零開始做一個SLG遊戲(七):遊戲系統以及配置表

遊資網發表於2019-10-23
從零開始做一個SLG遊戲(七):遊戲系統以及配置表

本文主要是來梳理下游戲內的基本系統(雖然只是照搬polytopia的,但是還是要總結一下),並預先做一些配置表,並實現讀取。

一、經濟系統

從零開始做一個SLG遊戲(七):遊戲系統以及配置表

1.總述

經濟系統可以是整個遊戲的核心。在本遊戲中只有一種資源:金幣。

每個回合都會獲得一定數量的金幣。

金幣主要有兩種來源:城市基本產出和建築的額外產出。

金幣的消耗方式有三種:1.建造建築2.解鎖科技3.建造士兵,而士兵維持是不需要額外的金幣的。

2.城市的建設

和文明類遊戲一樣,每個地塊都有其所屬的城市。

在城市等級比較低的時候,只有該城市周圍1格的地塊屬於那座城市。而城市等級到達一定程度時,可以解鎖讓城市範圍擴張為2格。

地塊的開發分兩種:對於資源的收集和對於地形的開發。

每個地塊上都有對應的地形,針對不同的地形,可以建設不同的建築,比如森林地形可以建造伐木場,沃土地形可以建造農田等。

而在這個地形的基礎上,有些地塊可能會有一些額外的資源,比如動物和植物等,玩家在前期可以通過採集的方式來增加人口。

3.配置表設計

以下是配置表的設計:

首先是地形表。

從零開始做一個SLG遊戲(七):遊戲系統以及配置表

在本系列最早的文章內,已經介紹了地形的生成方法,前文定義了Water,Plain,Mountain三種地形,對應海拔1,2,3。現在再加一種新的海拔0用以代表深海。這樣4種高度的地形就齊了。

而同一海拔的地形會有多種形態,比如海拔為2的平原將有平原、沃土、森林三種情況,通過科技這幾種狀態甚至可以相互轉換。而區分這幾種狀態的方式是增加額外的裝飾物。而資源id便是裝飾物的檔名,填0表示沒有任何裝飾物。

移動力花費指的是士兵移動走上去所需要消耗的移動點數。

然後是資源表。

從零開始做一個SLG遊戲(七):遊戲系統以及配置表

和上面一樣,資源id指的是資源對應的檔名,生成地圖的時候,將根據所屬的海拔分配資源。比如鯨魚就只能出現在海拔為0的深海區域內。

獎勵型別分兩種,型別1指的是給所在的城市增加人口,型別2指的是直接增加金幣。

接下來是建築表:

從零開始做一個SLG遊戲(七):遊戲系統以及配置表

地形指的是建造所需要的地形,對於的是地形表中的id,其中34這種兩位數的id指的是3和4兩種地形都可以,因為地形種類沒有超過10,所以就用這種方式實現了(如果超過10其實也可以,不過需要把10以上的數字改為abcd)

鄰近建築指的是有些建築建造,需要周邊地塊擁有某些建築。比如穀倉建造需要旁邊的地塊上有農田。

作用型別1指的是直接增加人口,比如碼頭的作用就是給該城市增加2人口。

作用型別2指的是,根據周邊地塊某建築的數量來加人口,比如穀倉的效果是周圍有一個農田就加1人口,所以穀倉的鄰近建築是3(農田),作用型別是2,效果是1。

作用型別3指的是根據周圍某建築的數量直接增加回合金幣,這也是唯一的一個直接通過建築增加回合金幣的途徑。

最後是城市表:

從零開始做一個SLG遊戲(七):遊戲系統以及配置表

後續實現的時候會根據效果id實現對應的效果。其中1,2,3級城市的2個效果是2選一的。

二、科技系統

科技系統簡單說就是花費金幣解鎖科技,而隨著城市數量的增加,科技花費也要增加。

公式如下:

科技花費=(基礎花費+(城市數量-1)*科技等級)*(1-科技減免)

科技分為3個等級,其基礎花費分別為5,6,7

科技減免指的是某個科技點了之後會有一個科技花費20%減免的效果。

下面是科技花費表:

從零開始做一個SLG遊戲(七):遊戲系統以及配置表

很簡單的一張表。

下面是科技表:

從零開始做一個SLG遊戲(七):遊戲系統以及配置表

這張表數量有點多,並且作用程式碼一欄我沒填。將來實現的時候會把這張表完善起來。

三、兵種系統

先把兵種表附上:

從零開始做一個SLG遊戲(七):遊戲系統以及配置表

兵種就不多說了,大部分SLG遊戲都差不多。

比較注意的是:

1.船是無法直接製造的。陸地單位在碼頭處下海後,能變成一艘小船,小船的血量以及血量上限和該單位在陸地上時相當。

2.A攻擊了B,如果A在B的攻擊範圍內,則B會在同時進行一次反擊。

攻擊傷害=攻擊方血量*攻擊方攻擊/(防守方防禦*(1+防守方防禦加成))

反擊傷害=反擊方血量*(反擊方防禦*(1+反擊方防禦加成))/攻擊方攻擊

四、配置表的匯入和讀取

1.配置表的儲存

配置表的我是用excel儲存的,匯出方式是匯出為csv檔案。

從零開始做一個SLG遊戲(七):遊戲系統以及配置表

csv檔案的匯出很簡單,先切換到想要儲存的那個excel標籤頁。

從零開始做一個SLG遊戲(七):遊戲系統以及配置表

然後選擇另存為。

從零開始做一個SLG遊戲(七):遊戲系統以及配置表

然後在儲存型別的時候切換到csv就行了,記得檔名也要改一下,因為這次匯出的只是一個標籤。

從零開始做一個SLG遊戲(七):遊戲系統以及配置表

然後再在下面這個目錄中建立CSV資料夾,並且把想要讀取的csv檔案都放進去。

2.配置表格式的修改

這是的配置表有兩個問題:首先unity對csv格式據說不是很支援,最好改成txt格式。然後就是,這時候儲存出來的編碼是非utf-8的,所以unity直接讀會讀不出來。

這兩個問題手動操作肯定也是能夠解決的(用txt開啟,改編碼然後另存為txt格式),但是太麻煩了,尤其隨著製作的推進,表越來越多,每次都手動修改會浪費大量時間。

這時候就需要做一個內建工具了:

  1. using System.IO;
  2. using System.Text;
  3. using UnityEditor;
  4. using UnityEngine;

  5. public class TranslateUTF8
  6. {
  7.         [MenuItem("MyMenu/UTF8Transform")]
  8.         static private void TransformUTF8()
  9.         {
  10.                 string spriteDir = Application.dataPath + "/Resources/CSV";
  11.                 DirectoryInfo rootDirInfo = new DirectoryInfo(spriteDir);
  12.                 foreach (FileInfo csvFile in rootDirInfo.GetFiles("*.csv", SearchOption.AllDirectories))
  13.                 {
  14.                         string csvpath = csvFile.FullName;
  15.                         Translate(csvpath);
  16.                 }
  17.                 Debug.Log("utf8轉換成功");
  18.         }

  19.         private static void Translate(string path)
  20.         {
  21.                 string content = File.ReadAllText(path, Encoding.Default);
  22.                 File.Delete(path);
  23.                 File.WriteAllText(path.Remove(path.LastIndexOf("."))+".txt", content, Encoding.UTF8);
  24.                 Debug.Log(path + " 轉換完畢");
  25.         }
  26. }
複製程式碼

這是我以前寫的一個轉化工具,功能是把Resources/CSV這個資料夾下的所有csv檔案轉化成utf-8的txt檔案,並把原來的csv檔案刪除掉。

在專案中新建一個指令碼檔案,然後把這段程式碼複製進去把原來的替換掉就能使用。

從零開始做一個SLG遊戲(七):遊戲系統以及配置表

這時候,回到unity介面,會出現一個MyMenu選單欄,進去後點選一下就行了。

3.配置表的讀取

從零開始做一個SLG遊戲(七):遊戲系統以及配置表

配置表是csv格式的。csv格式的意思是,原excel中,每一行的單元格之間,用逗號分隔開,如上圖。

所以在填寫配置表時,要儘量避免逗號的出現。以下是程式碼:

  1. public class CSVUtil
  2. {

  3.         public static List<string[]> Process(string filePathName)
  4.         {
  5.                 TextAsset asset = Resources.Load(filePathName) as TextAsset;
  6.                 string file = asset.text;
  7.                 List<string[]> ls = new List<string[]>();
  8.                 if (file == "")
  9.                 {
  10.                         return default(List<string[]>);
  11.                 }
  12.                 else
  13.                 {
  14.                         string[] strList = file.Split("\r\n"[0]);
  15.                         foreach (string str in strList)
  16.                         {
  17.                                 string s = str.Replace("\n", "");
  18.                                 if (s != "")
  19.                                 {
  20.                                         ls.Add(s.Split(","[0]));
  21.                                 }
  22.                         }
  23.                         return ls;
  24.                 }
  25.         }
  26. }
複製程式碼


"\r\n"是換行符,但不知道是什麼原因,我用"\r\n"來分割字串後,還是有"\n"留下來,所以我在下面處理的時候把“\n”又去掉了一次。

相關閱讀:
從零開始做一個SLG遊戲(一):六邊形網格
從零開始做一個SLG遊戲(二):用mesh實現簡單的地形
從零開始做一個SLG遊戲(三):用unity繪製圖形
從零開始做一個SLG遊戲(四):UI系統之主介面搭建
從零開始做一個SLG遊戲(五):UI系統之彈窗功能

從零開始做一個SLG遊戲(六):UI系統擴充套件

作者:觀復
專欄地址:https://zhuanlan.zhihu.com/p/70155323


相關文章