Dialogic是Godot引擎的強大對話系統外掛,能大幅簡化遊戲對話開發流程。本文提供完整的Dialogic使用教學,協助開發者建立豐富的遊戲對話系統。
什麼是Dialogic?
Dialogic是Godot引擎的免費對話系統外掛,提供視覺化編輯器,讓開發者無需深入程式設計即可創建複雜的對話樹與劇情分支。
🎯 核心特色
- 視覺化編輯器:拖拽式對話樹編輯
- 豐富的角色系統:支援多角色、情緒表情
- 分支劇情:條件判斷、變數控制
- 自定義 UI:完全可自訂的對話介面
- 音效支援:打字音效、語音檔案
- 本地化:多語言支援
1. 安裝與設定
Dialogic 2.0 專為 Godot 4.x 設計,功能更強大、使用更簡單。
安裝步驟
重要提醒:目前 AssetLib 中的 Dialogic 仍為 1.0 版本,Dialogic 2.0 尚在測試階段,需要從 GitHub 手動下載。
方式一:安裝 Dialogic 1.0(穩定版)
1. AssetLib 搜尋 "Dialogic"
2. 下載並啟用插件
3. 重啟 Godot 編輯器
4. 在工具列找到 "Dialogic" 選項
方式二:安裝 Dialogic 2.0(測試版)
1. 前往 GitHub: github.com/coppolaemilio/dialogic
2. 下載 "2.x" 分支的 ZIP 檔案
3. 解壓縮到專案的 addons/ 資料夾
4. 在專案設定中啟用 Dialogic 插件
5. 重啟 Godot 編輯器
初始設定
# 在 autoload 中添加 Dialogic
# Project Settings -> AutoLoad -> Add
# Path: res://addons/dialogic/Core/DialogicGameHandler.gd
# Name: Dialogic
專業提示
建議將 Dialogic 設為 AutoLoad,這樣就能在任何場景中輕鬆調用對話系統。
2. 創建第一個對話
步驟一:建立角色
1. 開啟 Dialogic 編輯器
2. 切換到 Characters 標籤
3. 點擊 "Create Character"
4. 設定角色資訊:
- 名稱:艾莉絲
- 顏色:#4A90E2
- 頭像:匯入角色圖片
步驟二:編寫對話
艾莉絲: 歡迎來到神秘森林!
艾莉絲 (happy): 這裡充滿了驚奇和冒險。
- 我準備好了!
艾莉絲: 太好了!讓我們開始吧。
[signal="start_adventure"]
- 我需要更多時間準備
艾莉絲 (sad): 沒關係,準備充分很重要。
[wait=2]
艾莉絲: 準備好的時候再來找我吧!
步驟三:在遊戲中觸發
# 在場景腳本中
extends Node2D
func _ready():
# 連接對話結束信號
Dialogic.signal_event.connect(_on_dialogic_signal)
func start_dialogue():
# 開始對話
Dialogic.start('first_timeline')
func _on_dialogic_signal(argument: String):
match argument:
"start_adventure":
print("冒險開始!")
# 切換到遊戲場景
get_tree().change_scene_to_file("res://Adventure.tscn")
3. 進階功能實作
變數系統
使用變數追蹤玩家選擇、物品數量、關係值等遊戲狀態。
# 設定變數
[set="player_name" value="勇者"]
[set="gold" value=100]
[set="relationship_alice" value=0]
# 在對話中使用
艾莉絲: 你好,{player_name}!
艾莉絲: 你現在有 {gold} 金幣。
# 條件分支
[if="gold >= 50"]
艾莉絲: 看起來你很富有呢!
[set="relationship_alice" value="relationship_alice + 10"]
[else]
艾莉絲: 錢包有點緊呢,要小心花費喔。
角色情緒系統
# 在角色設定中定義情緒
# Characters -> 艾莉絲 -> Portraits
# 添加情緒狀態:
# - default: 普通表情.png
# - happy: 開心表情.png
# - sad: 傷心表情.png
# - angry: 生氣表情.png
# - surprised: 驚訝表情.png
# 在對話中切換情緒
艾莉絲 (happy): 太棒了!
艾莉絲 (surprised): 什麼?!
艾莉絲 (sad): 我很失望...
音效與動畫
# 播放音效
[sound="res://audio/notification.wav"]
艾莉絲: 你收到了一個新任務!
# 打字音效
[typing_sound="res://audio/typewriter.wav" volume=0.5]
# 等待和停頓
[wait=2]
艾莉絲: 讓我想想...
[wait=1]
艾莉絲: 好的,我知道了!
# 角色動畫
[portrait="alice" animation="bounce"]
艾莉絲 (excited): 我有個好主意!
4. 自定義對話 UI
基礎樣式設定
# 在 Dialogic 設定中
# Settings -> Layout -> Style
extends DialogicStyle
func _init():
name = "Custom Style"
# 對話框設定
box_modulate = Color.WHITE
text_color = Color.BLACK
text_size = 18
# 角色名稱樣式
name_color = Color.BLUE
name_size = 20
name_font = preload("res://fonts/CustomFont.ttf")
進階 UI 自定義
# 創建自定義對話場景
extends Control
@onready var dialog_text: RichTextLabel = $DialogContainer/DialogText
@onready var character_name: Label = $DialogContainer/CharacterName
@onready var character_portrait: TextureRect = $Portrait
func _ready():
# 連接 Dialogic 信號
Dialogic.text_signal.connect(_on_dialogic_text)
Dialogic.signal_event.connect(_on_dialogic_signal)
func _on_dialogic_text(text: String):
# 自定義文字顯示效果
dialog_text.text = ""
var tween = create_tween()
for i in range(text.length()):
tween.tween_callback(func(): dialog_text.text += text[i])
tween.tween_delay(0.05) # 打字速度
5. 實戰案例:RPG 商店系統
完整範例
結合對話、變數、條件的商店系統
這個範例展示如何用 Dialogic 創建一個功能完整的商店系統。
商店對話腳本
商人 (happy): 歡迎光臨我的小店!
[if="first_visit == null"]
[set="first_visit" value=true]
商人: 初次見面,這是歡迎禮物!
[set="gold" value="gold + 50"]
[signal="show_gold_animation"]
商人: 你想要什麼呢?
- 查看商品
商人: 這些是我的寶貝!
[signal="open_shop_menu"]
- 賣出物品
[if="inventory_count > 0"]
商人: 讓我看看你有什麼好東西。
[signal="open_sell_menu"]
[else]
商人 (sad): 你好像沒有可以賣的東西呢。
- 離開
商人: 歡迎下次再來!
[signal="close_shop"]
商店系統整合
extends Control
var shop_items = [
{"name": "生命藥水", "price": 50, "description": "回復 100 HP"},
{"name": "魔法藥水", "price": 30, "description": "回復 50 MP"},
{"name": "鐵劍", "price": 200, "description": "攻擊力 +20"}
]
func _on_dialogic_signal(argument: String):
match argument:
"open_shop_menu":
show_shop_items()
"open_sell_menu":
show_sell_interface()
"close_shop":
get_tree().change_scene_to_file("res://Town.tscn")
"show_gold_animation":
play_gold_effect()
func show_shop_items():
var shop_menu = preload("res://ui/ShopMenu.tscn").instantiate()
add_child(shop_menu)
shop_menu.setup_items(shop_items)
func buy_item(item_data: Dictionary):
var gold = Dialogic.VAR.get_variable("gold")
if gold >= item_data.price:
Dialogic.VAR.set_variable("gold", gold - item_data.price)
# 添加物品到背包
GameManager.add_item_to_inventory(item_data)
# 繼續對話
Dialogic.start('purchase_success')
else:
Dialogic.start('insufficient_gold')
6. 效能優化技巧
記憶體管理:適時釋放不需要的對話資源 預載入:將常用對話預先載入記憶體 壓縮圖片:優化角色頭像和背景圖片大小 音效優化:使用適當的音頻格式和品質
優化程式碼範例
# 對話管理器
extends Node
var preloaded_timelines = {}
var character_portraits = {}
func _ready():
# 預載入重要對話
preload_timeline("main_story")
preload_timeline("shop_dialogue")
func preload_timeline(timeline_name: String):
var timeline = load("res://dialogic/timelines/" + timeline_name + ".dtl")
preloaded_timelines[timeline_name] = timeline
func start_optimized_dialogue(timeline_name: String):
if timeline_name in preloaded_timelines:
Dialogic.start_timeline(preloaded_timelines[timeline_name])
else:
Dialogic.start(timeline_name)
# 清理不需要的資源
func cleanup_dialogue_resources():
for timeline in preloaded_timelines.values():
if timeline:
timeline.unreference()
preloaded_timelines.clear()
7. 除錯與測試
常見問題解決
對話不顯示:檢查 AutoLoad 設定和場景結構 變數不更新:確認變數名稱拼寫正確 音效不播放:檢查音頻檔案路徑和格式 UI 錯位:調整 Canvas Layer 和 Anchor 設定
測試工具
# 開發者除錯面板
extends Control
@onready var var_display: Label = $VarDisplay
@onready var timeline_input: LineEdit = $TimelineInput
func _ready():
if OS.is_debug_build():
visible = true
# 顯示所有變數
update_var_display()
func _input(event):
if event.is_action_pressed("debug_dialogic"):
visible = !visible
func update_var_display():
var text = "=== Dialogic Variables ===\n"
for var_name in Dialogic.VAR.get_variable_names():
text += var_name + ": " + str(Dialogic.VAR.get_variable(var_name)) + "\n"
var_display.text = text
func _on_test_button_pressed():
var timeline = timeline_input.text
if timeline != "":
Dialogic.start(timeline)
最佳實務建議
專業級開發技巧
- 模組化設計:將對話按功能分類管理
- 版本控制:使用 Git 追蹤對話檔案變更
- 團隊協作:建立對話撰寫規範和審核流程
- 使用者測試:定期測試對話流程和使用體驗
資源管理策略
# 對話資源管理系統
class_name DialogueManager
extends Node
signal dialogue_started(timeline_name: String)
signal dialogue_ended(timeline_name: String)
var active_dialogues: Array[String] = []
var dialogue_history: Array[Dictionary] = []
func start_dialogue_with_tracking(timeline_name: String, context: Dictionary = {}):
# 記錄對話開始
dialogue_started.emit(timeline_name)
active_dialogues.append(timeline_name)
# 保存上下文
dialogue_history.append({
"timeline": timeline_name,
"context": context,
"start_time": Time.get_unix_time_from_system()
})
Dialogic.start(timeline_name)
func end_dialogue(timeline_name: String):
dialogue_ended.emit(timeline_name)
active_dialogues.erase(timeline_name)
# 更新歷史記錄
for entry in dialogue_history:
if entry.timeline == timeline_name and not entry.has("end_time"):
entry.end_time = Time.get_unix_time_from_system()
break
總結
Dialogic 是 Godot 遊戲開發中不可或缺的對話系統解決方案。從簡單的 NPC 對話到複雜的劇情分支,它都能勝任。掌握這些技巧,你就能創造出引人入勝的遊戲體驗!
記住:好的對話系統不只是技術實現,更是玩家情感連結的橋樑。用心設計每一句台詞,讓你的遊戲更加動人!
延伸學習資源
開始你的 Dialogic 之旅,讓遊戲角色活起來!