從零開始做一個SLG遊戲(六)遊戲系統以及配置表
本文主要是來梳理下游戲內的基本系統(雖然只是照搬polytopia的,但是還是要總結一下),並預先做一些配置表,並實現讀取。
一、經濟系統
1。總述
經濟系統可以是整個遊戲的核心。在本遊戲中只有一種資源:金幣。
每個回合都會獲得一定數量的金幣。
金幣主要有兩種來源:城市基本產出和建築的額外產出。
金幣的消耗方式有三種:1。建造建築 2。解鎖科技 3。建造士兵,而士兵維持是不需要額外的金幣的。
2。城市的建設
和文明類遊戲一樣,每個地塊都有其所屬的城市。
在城市等級比較低的時候,只有該城市周圍1格的地塊屬於那座城市。而城市等級到達一定程度時,可以解鎖讓城市範圍擴張為2格。
地塊的開發分兩種:對於資源的收集和對於地形的開發。
每個地塊上都有對應的地形,針對不同的地形,可以建設不同的建築,比如森林地形可以建造伐木場,沃土地形可以建造農田等。
而在這個地形的基礎上,有些地塊可能會有一些額外的資源,比如動物和植物等,玩家在前期可以透過採集的方式來增加人口。
3。配置表設計
以下是配置表的設計:
首先是地形表。
在本系列最早的文章內,已經介紹了地形的生成方法,前文定義了Water,Plain,Mountain三種地形,對應海拔1,2,3。現在再加一種新的海拔0用以代表深海。這樣4種高度的地形就齊了。
而同一海拔的地形會有多種形態,比如海拔為2的平原將有平原、沃土、森林三種情況,透過科技這幾種狀態甚至可以相互轉換。而區分這幾種狀態的方式是增加額外的裝飾物。而資源id便是裝飾物的檔名,填0表示沒有任何裝飾物。
移動力花費指的是士兵移動走上去所需要消耗的移動點數。
然後是資源表。
和上面一樣,資源id指的是資源對應的檔名,生成地圖的時候,將根據所屬的海拔分配資源。比如鯨魚就只能出現在海拔為0的深海區域內。
獎勵型別分兩種,型別1指的是給所在的城市增加人口,型別2指的是直接增加金幣。
接下來是建築表:
地形指的是建造所需要的地形,對於的是地形表中的id,其中34這種兩位數的id指的是3和4兩種地形都可以,因為地形種類沒有超過10,所以就用這種方式實現了(如果超過10其實也可以,不過需要把10以上的數字改為abcd)
鄰近建築指的是有些建築建造,需要周邊地塊擁有某些建築。比如穀倉建造需要旁邊的地塊上有農田。
作用型別1指的是直接增加人口,比如碼頭的作用就是給該城市增加2人口。
作用型別2指的是,根據周邊地塊某建築的數量來加人口,比如穀倉的效果是周圍有一個農田就加1人口,所以穀倉的鄰近建築是3(農田),作用型別是2,效果是1。
作用型別3指的是根據周圍某建築的數量直接增加回合金幣,這也是唯一的一個直接透過建築增加回合金幣的途徑。
最後是城市表:
後續實現的時候會根據效果id實現對應的效果。其中1,2,3級城市的2個效果是2選一的。
二、科技系統
科技系統簡單說就是花費金幣解鎖科技,而隨著城市數量的增加,科技花費也要增加。
公式如下:
科技花費 = ( 基礎花費 + ( 城市數量 - 1 ) * 科技等級 ) * (1 - 科技減免)
科技分為3個等級,其基礎花費分別為5,6,7
科技減免指的是某個科技點了之後會有一個科技花費20%減免的效果。
下面是科技花費表:
很簡單的一張表。
下面是科技表:
這張表數量有點多,並且作用程式碼一欄我沒填。將來實現的時候會把這張表完善起來。
三、兵種系統
先把兵種表附上:
兵種就不多說了,大部分SLG遊戲都差不多。
比較注意的是:
1。船是無法直接製造的。陸地單位在碼頭處下海後,能變成一艘小船,小船的血量以及血量上限和該單位在陸地上時相當。
2。A攻擊了B,如果A在B的攻擊範圍內,則B會在同時進行一次反擊。
攻擊傷害=攻擊方血量 * 攻擊方攻擊 / ( 防守方防禦 * ( 1 + 防守方防禦加成 ) )
反擊傷害=反擊方血量 * ( 反擊方防禦 * ( 1 + 反擊方防禦加成 ) ) / 攻擊方攻擊
四、配置表的匯入和讀取
1。配置表的儲存
配置表的我是用excel儲存的,匯出方式是匯出為csv檔案。
csv檔案的匯出很簡單,先切換到想要儲存的那個excel標籤頁。
然後選擇另存為。
然後在儲存型別的時候切換到csv就行了,記得檔名也要改一下,因為這次匯出的只是一個標籤。
然後再在下面這個目錄中建立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檔案刪除掉。
在專案中新建一個指令碼檔案,然後把這段程式碼複製進去把原來的替換掉就能使用。
這時候,回到unity介面,會出現一個MyMenu選單欄,進去後點選一下就行了。
3。配置表的讀取
配置表是csv格式的。csv格式的意思是,原excel中,每一行的單元格之間,用逗號分隔開,如上圖。
所以在填寫配置表時,要儘量避免逗號的出現。以下是程式碼:
public class CSVUtil
{
public static List
{
TextAsset asset = Resources。Load(filePathName) as TextAsset;
string file = asset。text;
List
if (file == “”)
{
return default(List
}
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”又去掉了一次。