Skip to content
NDark edited this page Mar 2, 2014 · 6 revisions

{{toc}}

Conversation System 對話系統

概念

  1. 大多數遊戲的對話系統都是如下架構
  2. A. 演出或劇本(多場段落[take])→ B. 段落對話(對白,大頭加字串,重複直到結尾)→C. 字串(一句話)
  3. 要觸發劇情的時候就是用劇本的ID把A叫起來,A去找B,B去找C。
  4. 有些人不做C. 直接把字串寫在B裡面. 這樣也是一種方法,只是要改成多國語言的時候會很痛苦.
  5. 很少通用的原因是每個遊戲的B都不太一樣,有些遊戲一個畫面標準就是兩個大頭,一個對話;另一些遊戲每個大頭都有一個對話.像是沙漠商旅2則是更精簡,只有一個大頭(對方),然後敵我兩個對話.
  6. 然後要做選項分歧.這就是把B從A切出來的原因.在一場演出中可以在不同的B之間跳來跳去.所以段落對話(B)就要除了大頭對話之外另外定義選擇肢的腳本
  7. 然後再複雜一點就要做條件.這樣就可以做到觸發某一劇情之後或是身上攜帶某些道具才會顯示的對白及選項.條件可以簡單點作單選,或是多重條件邏輯柵(AND / OR / NOT)。
  8. 中山立志傳這邊就是做到多重條件與選擇肢。然後還做到觸發A的時候判定,劇情中B的時候判定。

說明

  1. 負責顯示對話顯示的系統
  2. 分為三層
    1. ConversationManager 對話系統管理器(多段對話集合)
    2. ConversationSet 對話集合(多組對話)
    3. Conversation 一組配置與對話
  3. 功能
    1. 被外界以Keyword啟動一個對話集合(故事)
    2. 玩家以下一步按鈕來顯示下一行對話
    3. 出現對話系統時要關閉其他重要的系統並且將時間減緩
    4. 出現對話系統及下一行時要發出聲音
    5. 一個對話集合裡面有多段對話,一段對話裡面有多行文字
    6. 當一個對話集合與其內文字全部展示完畢,就會關閉對話系統,並回復各系統正常運作。
    7. ActiveConversationSet() 被呼叫啟動各對話集合
    8. CheckIfPress() 檢查是否需要播放下一文字或對話
    9. PlayNext() 播放下一個對話
    10. CheckIsContinue() 檢查是否還有後續
    11. EnableAllDialog() 檢查顯示目前的對話配置
    12. 如果對話系統正在播放時被啟動其他的對話集合,則使用串列來堆積,避免遺失訊號。

架構圖

ConversationSystem.jpg

參考資料

  1. 功能清單GUI
  2. ConversationManager.cs
  3. ConversationSet.cs
  4. Conversation.cs

啟動對話系統

  1. 檢查並提取對象的對話集合
  2. 關閉其他必要的系統
  3. 將對象的對話集合推到等待區
  4. 狀態為啟動

對話系統啟動中

  1. 持續檢查是否按下下一步
  2. 切換狀態為結束

結束檢查下一步狀態

  1. 假如目前的對話集合已經結束,嘗試取得下一個對話集合。
  2. 對話集合還未結束,則顯示目前對話集合的配置
  3. 呼叫對話集合顯示下一步
  4. 播放音效
  5. 如果目前已經沒有需要的對話,則關閉目前的配置,開啟必要的系統,回復時間減緩。
Clone this wiki locally