Bắt đầu nhanh
Ba bước. Không phải học gì trước.
1. Thêm node
Bật NPC TalkKit ở Project Settings → Plugins, rồi thêm node NPCTalkKit làm con của một NPC bạn đã có.
Player controller, nhiệm vụ và save game không bị đụng tới. Không có autoload, không có class cha nào phải kế thừa.
2. Gõ lời thoại
Chọn node rồi bấm Open Editor trong thẻ tóm tắt ở Inspector, hoặc mở main screen TalkKit trên thanh đầu Godot. Trong Conversations, bấm +, đặt tên greeting, rồi gõ. Enter sang câu tiếp theo; ở câu cuối nó tạo thêm câu.
Không file nào được tạo ra. Hội thoại nằm trong scene, giống như animation nằm trong AnimationPlayer.

3. Phát nó
extends Node
## Docs: /guide/quick-start — the whole surface needed to say two lines.
func _ready() -> void:
_build_without_files()
#region play
# Nothing here needs a .tres file. The conversation was typed in the TalkKit
# workspace, and this is the entire runtime surface.
func greet() -> void:
$NPCTalkKit.play(&"greeting")
#endregion
## Builds in code what the TalkKit workspace builds by hand, so this file runs.
func _build_without_files() -> void:
var talk := NPCTalkKit.new()
talk.name = "NPCTalkKit"
var smith := TalkSpeaker.new()
smith.display_name = "Torvald"
talk.speakers = [smith]
var box := _instant_box()
talk.dialogue_boxes = [box]
var conversation := TalkConversation.new()
conversation.conversation_id = &"greeting"
conversation.default_speaker = smith
conversation.default_dialogue_box = box
var first := TalkLine.new()
first.text = "The forge runs hot today."
var second := TalkLine.new()
second.text = "Come back when you need steel."
conversation.lines = [first, second]
talk.conversations = [conversation]
add_child(talk)
func _verify() -> Array[String]:
var failures: Array[String] = []
var spoken: Array[String] = []
var talk: NPCTalkKit = $NPCTalkKit
talk.line_started.connect(func(line: TalkLine) -> void: spoken.append(line.text))
greet()
if not talk.is_running():
failures.append("quick_start: play() did not start the conversation")
talk.advance()
talk.advance()
if spoken.size() != 2:
failures.append("quick_start: expected two lines, got %s" % str(spoken))
if talk.is_running():
failures.append("quick_start: the conversation should have ended")
return failures
## Typing speed lives on the dialogue box now, so turning it off for a scripted
## run means handing the node a box that types instantly.
func _instant_box() -> TalkBoxTemplate:
var template := TalkBoxTemplate.new()
template.typewriter_speed = 0.0
return templateĐó là toàn bộ bề mặt runtime để một NPC biết nói.
Ba thứ TalkKit biết
Bạn có thể dừng đọc ở đây và bắt tay làm. Bảng này dành cho lúc bạn muốn đổi một trong ba thứ — chúng độc lập với nhau, nên đổi cái này không bắt bạn đổi cái kia.
| Quyết định | Nằm ở đâu | |
|---|---|---|
| Conversation | nói gì | trên node, hoặc trong kho dùng chung |
| Dialogue Box | hộp là gì và trông thế nào | một template, dùng chung được |
| Placement | nằm ở đâu, bám vào đâu | mặc định của conversation hoặc ngoại lệ của line — màn hình hoặc bám node |
Script view: sắp ra mắt
Tab Script · Coming soon chỉ là bản xem trước cho workflow viết dạng text trong tương lai. Nó chưa phải định dạng có thể sửa; workspace trực quan và các resource hiện tại vẫn là nguồn dữ liệu chuẩn.
Classic Panel vẫn bám được đỉnh đầu NPC. Speech Bubble vẫn ghim được vào góc màn hình. Chọn hộp không có nghĩa là chọn luôn vị trí.
Những gì TalkKit không làm
Nó không quản nhiệm vụ, túi đồ, save game, điều khiển nhân vật, AI của NPC hay logic rẽ nhánh. Game của bạn đã có những thứ đó, và TalkKit được thiết kế để không đụng vào.
Muốn cho người chơi lựa chọn thì xem Sự kiện và rẽ nhánh: hội thoại tạm dừng, rồi GDScript của bạn quyết định tiếp theo là gì.
Tiếp theo
- Viết hội thoại — tham số, tuỳ chọn từng câu
- Hộp thoại — template, tuỳ chỉnh, lưu lại
- Sự kiện và rẽ nhánh — lựa chọn mà không cần engine rẽ nhánh
- Tra cứu API — một trang, đủ mọi thứ công khai