Godot Dialogic完整教學:遊戲對話系統開發指南

Godot Dialogic對話系統完整教學,從基礎安裝到進階功能,協助遊戲開發者建立豐富的角色對話與劇情分支。

Godot Dialogic教學指南
Godot Dialogic教學指南

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)

最佳實務建議

專業級開發技巧

  1. 模組化設計:將對話按功能分類管理
  2. 版本控制:使用 Git 追蹤對話檔案變更
  3. 團隊協作:建立對話撰寫規範和審核流程
  4. 使用者測試:定期測試對話流程和使用體驗

資源管理策略

# 對話資源管理系統
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 之旅,讓遊戲角色活起來!

作者:Drifter

·

更新:2025年8月1日 上午09:10

· 回報錯誤
下拉重新整理