創作內容

12 GP

UNITY程式紀錄-可透過載入外部XML劇本動作的RPG對話系統

作者:Pyramide│2020-07-15 21:05:48│巴幣:24│人氣:607
先聲明,這不是教學,應為我不太會搞教學文,比較像是對自己程式的紀錄。

因為最近專題的需求可能會做到字幕與劇本的系統,所以就試著照著RPG的對話方式製作對話系統。

使用XML語法來做載入,會使用這種語法是因為他的架構很像HTML(個人覺得),再把台詞匯入會比較輕鬆。

思路是這樣的-
1.將對話簡單分為兩種,單人中間闡述,與雙人對話。
2.將角色圖片分狀態,在右邊,還是在左邊。
3.將角色台詞分狀態,連續的講話到換人算一個Part,換人就會換Part,每個Part裡都會有台詞

關於XML的載入是參考這部影片


先宣告一個可序列化的Class來做為一個Part的指標。
第一個角色名用作讀取角色圖片和對話框的角色名稱。
第二個是預製來讀取聲音的。
第三個是用來分辨對話模式的狀態機。
第四個是分辨位置的狀態機。
最後則是放台詞腳本的LIST,可以一段一段放。

(狀態機,其實就是可選項)
而TalkingPos狀態機只有在雙人對話模式才會使用到。

這樣就做完了一個Part的宣告,但只是一個Part對吧,所以我要做一個List來放很多個Part。
宣告一個Class,用來放裝有很多個Part的List。
感覺就像一本劇本裡放了很多頁的感覺(抱歉我不太會描述)。

有了劇本,接下來就需要管理劇本的,其實上述的東西都是寫在管理劇本的腳本裡(我會附上原檔,我紀錄文還真的不太會QQ)
目前是把載入劇本寫在Awake哩,不過載入劇本可以在你想要呼叫的時候用就是了。

把劇本管理使用單例模式(singleton,其實我照那影片裡寫的,這不太算完整的單例),這樣能確保這個管理器只會有一個產生,我將它作為載入劇本的指標,他也只負責載入劇本。

接下來是儲存與載入的方法,但儲存其實我只有用到一次,目的是為了建立基本架構


載入方法,這裡使用呼叫方法時輸入的字串來改變路徑中讀取檔案的位置,也就是說,所有劇本都要放在同一個資料夾。
讀取完了以後記得要關起來,不然會報錯,因為那檔案會一直在程式裡開著。
<------------------------------------------------------分隔線---------------------------------------------------------->
接下來就是重頭戲,負責管台詞推進,跳過,重設、要求更換劇本的腳本DialogueFunction

宣告部分
首先是公開的
中間角色照放置處(用於單人對話)
左右角色照放置處(用於雙人對話)
對話顯示區(就是整塊對話,用來顯示隱藏)
對話文字區
對話主角名區
聲音播放器
這些能在UNITY裡看到並且指定。

接著是私有的,只有在這個腳本裡能使用,因為我不希望他們被外部任意修改
取得的要播放的聲音
用來記錄第幾句台詞的整數
用來記錄第幾個PART的整數
用來存取劇本提供腳本的參考

整個模式基本運作順序是

判斷對話模式->調整角色位置->載入照片->載入對話->載入聲音

接下來我把每個部分拆分成不同的方法區塊

首先是判斷對話模式(直接加上註解好ㄌ,這樣比較明顯)
改變照片顏色是因為UNITY如果你載入一張圖片去調UGUI的顏色會發現它是呈現覆蓋效果,如此一來便可達成不說話的角色比較暗的效果。


如果該Part的模式是單人模式,則執行這個部分


這是載入照片的代碼,前面的選擇位置過程中就有包含這段。

不過這一段是參考網路上的寫法,只是我在讀取路徑用跟前面讀取劇本一樣的方法,只要餵給他那個Part的角色名就可以拿到圖片庫中的圖片,但圖片庫的檔名一定要跟角色名一樣,還要是PNG。
台詞與段落控管,這裡主要用來管理現在的台詞是啥。
我對劇本的架構設定是這樣的
劇本
-Part1
  -台詞1....
  -台詞2
-Part2...(以此類推到結束)

這裡是推進台詞的方法
每次觸發台詞就+1,然後上面管理台詞的方法就會處理,阿,我現在該執行第幾個台詞...

然後當台詞指標超過該Part的台詞數,就會判斷會溢出,跳到下一Part並把台詞指標歸零

跳到下一Part便會把Part指標+1來推進,就這樣輪迴直到劇本結束,關閉對話框。

接下來是這方法裡提供的其他可用方法,可以拿去掛在Button上或是透過其他腳本呼叫,不過我可能之後要弄成委派,這樣比較好。

重置劇本,這功能能讓你回到該劇本的第一句話

跳過劇本,這功能能讓你跳過該劇本的所有劇情

要求剛剛的劇本管理器換劇本,我有時候總覺得一些功能應該要寫到管理器那邊==,還有設定Part內容的Class要獨立成一個沒有Mono的腳本放著比較好維護。
這是DialogueFunction在場景一開始做的事
跟重置劇本很像的動作。
至於為什麼要先載入下一Part的角色是因為我在調整位置那邊寫的顏色更改是以最後載入的為當前講話的角色,先載入的會變灰,所以要先載入下一Part的角色。
載入聲音還是試製,所以放在這裡測試,不過之後就會跟著台詞一起跑了。
<------------------------------------------------------分隔線---------------------------------------------------------->
抱歉寫得真的很混亂,接下來我會分析XML檔(也就是劇本)給你們看。

就是長這樣,然後由好幾個Part組成

在這裡就可以依照你的劇本輸入台詞了。

每一Part就是一個角色講話

所以我寫的這個的缺點是如果兩個角色都單句對噴,你就要搞很多Part,會中風。

要取得空XML就要先執行劇本管理器(不是很多方法那個)的儲存方法,就能先取的一個空劇本,之後慢慢編輯就好,不過要注意劇本名。

還有一個缺點是因為我載入都是用StreamingAssets路徑,所以不能載入線上劇本,不過RPG對話通常也是單機GAME就是了。
測試影片-
<------------------------------------------------------分隔線---------------------------------------------------------->
不過如果想快速製作劇情對話遊戲,Unity的AssetStore有一個輔助工具包叫FUNGUS,它簡單好用可視化易上手,網路上也有很多教學。

我做這個其實是想要有更方便快速的方法建置劇本對話,但可能不好維護就是了

我的GIT(裡面其實只有這個,我菜==)

感謝收看
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4850184
All rights reserved. 版權所有,保留一切權利

相關創作

留言共 4 篇留言

那由多カルタ
U質~先收藏了

07-15 21:14

Pyramide
我打得有點亂就是了[e18],歹勢。07-15 22:16
七海千歲
看不懂...但感覺真的好厲害!

07-16 00:03

Pyramide
謝謝,雖然我很多重複寫的地方QQ07-16 22:42
earthworm
有對話一整個就生動起來ㄌ..可是好難

07-16 17:34

Pyramide
黑阿,快速開發還是用別人的ㄉ工具包方便[e1]07-16 22:43
Zona
您好,想請問是否有上面那些的原檔~[e13]

07-24 15:37

Pyramide
https://github.com/KirovPyramid/UnityRPGFunctions
這裡有包含上面程式的原檔和其他腳本,不過有點年久失修了[e13]
可以直接clone或下載專案下來在UNITY開啟08-07 00:38
我要留言提醒:您尚未登入,請先登入再留言

12喜歡★catcat6103 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:給我源石好嗎.png... 後一篇:UNITY-GetCom...

追蹤私訊切換新版閱覽

作品資料夾

Kokage
祝今天看到的您也有個美好的一天 (´▽`ʃ♡ƪ)"看更多我要大聲說57分前


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】