主題

【獨立開發 week3】 用regex寫一套RPG對話語言

趴趴鼠Loading | 2020-10-26 21:52:04

好啦,其實我也不太敢稱它是"語言"啦,是regex拆解搭配C#做後續處理。

目前還在debug階段,雖然還是半成品,但大魔王已經解決了,感覺再一下就能使用了。

展示:
對照標籤

就是直接讀文本然後展示出對應的資訊。
以下解釋tag的規則:

<story> :跟網頁一樣最外層都是<html></html>
一開始覺得沒必要加,但在處理巢狀tag(如下圖)時發現,巢狀tag開頭跟單行tag開頭可能有機率造成巢狀拆解錯誤,所以乾脆把整個文本都當成巢狀來解決。

<l> 內容.... </l> :基本單行對話
<select> 內容.... </select> :選項對話欄
<opt> 內容... </opt> 選項內容
<if></if> 條件達成才讀取裡面的,否則跳過內容

參數tag說明:
animation(物件名稱、動畫名) 找符合名稱的物件播放特定動畫,直接用GameObject.find找,雖然這樣效能輸給用tag找一大截,但給每個物件一個tag感覺也滿麻煩的。

img(左|中|右的對話框、圖片名)

title=" 內容... "  對話框標題欄

其實還有audio的處理,只是這裡沒用到。

set()跟if()的解釋比較麻煩,目前也還再動工,所以下一篇來講解! XD
簡單來說是用set來設定變數值至字典,if去從字典讀取資料有沒有符合,字典又分為暫時(這個文本讀完就清空)的跟永久的。
我想不到比字典更好用的型態了,不過目前是用<string,string>來存,所以做處理時就得先判斷是數字還是文字內容。



接下來是拆巢狀tag的方法:
一開始我找到這個語法:
(<!--((?!-->).)*-->|<\w*((?!\/<).)*\/>|<(?<tag>\w+)[^>]*>(?>[^<]|(?R))*<\/\k<tag>\s*>)
看起來還不錯,但看到那個(?R)了嗎?!  .NET竟然不支援,搞了個什麼"括號對稱"的東西。
(?R)大意大概是讀到它的時候就保留目前結果並返回regex的開頭重讀 ((大概ㄅ

接下來猛嗑了3天的regex終於打出:
(?:
(?:
<(?<tag>/?\w*)(?<arg>[^>]*)>
(?<text>[^<>]*)?
)|
(?<-tag> </\k<tag>>)+
)


解釋一下語法:
(?:  代表這層括號不要紀錄
(?<變數名稱>regex) 組名
(?<tag> regex1 )  內容.... (?<-tag> regex2) 這就是難搞的括號對稱,同(?<tag> regex1 )  內容.... (?<close-tag> regex2)
close是自己取的變數名,意思是: 從regex1到regex2之間的內容都給交給close,然後刪掉tag目前的內容。

出來後表格長這樣:
若簡單來說結果會是:
<if><if><l></l></if><l></l></if>
tag會按照順序印出,接下來就是在C#拆出階層關係。

當初在想到底是要用遞迴還是迴圈,像上述順序,第一個if應該要配最後一個/if,但用遞迴跑到第一個/if就回傳了。
想了一大堆,最後不知道嗑了甚麼,終於打出來了。
line是我的自訂變數,包含上表格的參數(tag,arg,text)和一個用來記錄終點位置的endline而已。


完整的程式碼跟使用說明要等我把全部debug完再一起介紹囉。


整個開發就像嗑藥一樣,打完後就完全看不懂自己打了什麼但卻能執行。




雜談:
最近一大堆事情啦啦啦啦

公司: 唉! Unity工程師耶。 (唉,穿山甲的口氣)
公司: 同學你做外包嗎?
我 : (做啊,哪次不做。)

雖然我還是主要被當美術用QQ,展覽用的AR/VR根本用不到什麼遊戲邏輯
138 巴幣: 120
甜在心饅頭
感覺好像嗑了不少ˊˇˋ~辛苦了
2020-10-26 22:05:08
趴趴鼠Loading
感謝[e5] 感覺寫regex就跟猜燈謎一樣
2020-10-26 22:53:51
悠閒紅茶(冷卻中)
佬(越看越覺得自己應該滾回去乖乖寫作的wwwwww
2020-10-27 01:18:36
趴趴鼠Loading
還好啦,我只是做我興趣的東西而已www
2020-10-27 17:35:08

更多創作