Tạo hệ thống đối thoại trong Godot bằng GDScript
Trong quá trình phát triển trò chơi, lối chơi hấp dẫn và cách kể chuyện lôi cuốn là chìa khóa để tạo ra những trải nghiệm đáng nhớ. Một công cụ mạnh mẽ có thể giúp bạn đạt được điều này là hệ thống đối thoại.
Cơ chế đối thoại được thực hiện đúng cách cho phép các nhân vật trò chuyện, trao đổi dữ liệu và kết nối với người chơi, từ đó nâng cao sự phong phú và chất lượng sống động của trải nghiệm chơi trò chơi.
Thiết lập trò chơi Godot của bạn
Bắt đầu quá trình phát triển bằng cách xây dựng cấu trúc cơ bản của trò chơi của bạn. Trong trường hợp này, hãy thiết lập cài đặt hai chiều cơ bản có hình đại diện có thể điều hướng bằng các phím mũi tên.
Mã nguồn được sử dụng trong ấn phẩm này có thể được truy cập thông qua kho lưu trữ công cộng trên GitHub, nơi cung cấp mã nguồn miễn phí để thuận tiện cho bạn theo các điều khoản của giấy phép MIT được chấp nhận rộng rãi.
Kết hợp đoạn mã đã cho vào Unity bằng cách bắt đầu cài đặt mới cho sự hiện diện của nhân vật người chơi. Giới thiệu một thể hiện của đối tượng CharacterBody2D
và kết nối nó với cảnh. Sau đó, thêm thành phần CollisionShape2D
có dạng hình chữ nhật để xác định ranh giới trong đó người chơi tương tác với các vật thể khác trong thế giới trò chơi.
Kết hợp tính di động và khả năng tương tác của ký tự với các đối tượng dựa trên nền tảng bằng cách sử dụng GDScript để thay thế tập lệnh mặc định của thành phần CharacterBody2D. Mã được cung cấp như sau:
extends CharacterBody2D
var speed = 300
func _physics_process(delta):
var input_dir = Vector2.ZERO
if Input.is_action_pressed("ui_left"):
input_dir.x -= 1
if Input.is_action_pressed("ui_right"):
input_dir.x \+= 1
if Input.is_action_pressed("ui_up"):
input_dir.y -= 1
if Input.is_action_pressed("ui_down"):
input_dir.y \+= 1
velocity = input_dir.normalized() * speed
move_and_collide(velocity * delta)
Mã hiện tại cho phép nhân vật chính điều hướng bằng các lệnh phím mũi tên, tạo điều kiện thuận lợi cho quá trình của họ thông qua nhiều nền tảng khác nhau đồng thời tính đến mọi tương tác hoặc va chạm có thể xảy ra.
Thêm hộp thoại
Khi bắt đầu phát triển hệ thống đối thoại, giai đoạn đầu tiên bao gồm việc kết hợp giao diện hiển thị văn bản khi tương tác giữa nhân vật của người chơi và các đối tượng cụ thể hoặc nhân vật không phải người chơi (NPC).
Để nâng cao chức năng của tập lệnh CharacterBody2D
, chúng tôi nên kết hợp các biến bổ sung cho phép chúng tôi quản lý hộp thoại và nội dung của nó một cách hiệu quả. Điều này có thể đạt được bằng cách giới thiệu các biến mới như \_dialogBox
, \_previousLine
và \_currentLine
. Cái trước sẽ giữ tham chiếu đến đối tượng hộp thoại, trong khi hai cái sau sẽ đại diện cho dòng hiện tại được nhập vào trường văn bản và dòng trước đó tương ứng. Bằng cách sử dụng các biến này, chúng tôi có thể triển khai các tính năng như thu hồi lịch sử và cập nhật theo thời gian thực của trường văn bản nhập khi nhập.
var dialogue_box: Label
var close_button: Button
var dialogue_lines: Array = ["Hello, adventurer!", "Welcome to our village."]
var current_line: int = 0
var line_timer: float = 0
Dialog\_box
được thiết kế để hiển thị nội dung hội thoại và close\_button
đóng vai trò là phương tiện để người dùng loại bỏ hộp thoại bất cứ khi nào họ thấy cần thiết.
Trong hàm ready
, tôi sẽ tạo và khởi tạo một hộp thoại cho ứng dụng của chúng ta. Hộp thoại này rất cần thiết để cung cấp giao diện giữa người dùng và chương trình, cho phép họ tương tác với nó một cách có ý nghĩa. Hộp thoại có thể hiển thị nhiều thông báo hoặc lời nhắc khác nhau tùy thuộc vào hành động nào đang được người dùng hoặc chương trình thực hiện. Ngoài ra, hộp thoại này đóng vai trò là nơi chứa các thành phần khác mà chúng tôi sẽ thêm sau, chẳng hạn như các nút hoặc trường văn bản, cho phép người dùng nhập dữ liệu hoặc thực hiện các tác vụ cụ thể trong ứng dụng.
func _ready():
dialogue_box = Label.new()
dialogue_box.visible = false
add_child(dialogue_box)
Hiển thị văn bản đối thoại
Bây giờ bạn có thể tập trung trình bày nội dung trong hộp thoại. Có thể mở rộng văn bản trên nhiều dòng và cho phép cuộn, chỉ hiển thị một dòng mỗi lần.
Để sửa đổi chức năng xử lý vật lý nhằm phù hợp với việc hiển thị các dòng hội thoại, hãy làm theo các bước sau: 1. Thêm một biến mới gọi là “dialogueLines” để lưu trữ dữ liệu văn bản cho từng dòng hội thoại. Điều này có thể được thực hiện bằng cách tạo một mảng trống và gán nó cho khóa “dialogueLines” trong đối tượng hoặc tập lệnh mong muốn.2. Cập nhật vòng lặp mô phỏng để bao gồm việc xử lý các dòng hội thoại. Trong vòng lặp này, truy xuất dữ liệu văn bản từ mảng “dialogueLines” bằng cách sử dụng giá trị chỉ mục làm mã định danh. Sau đó, cập nhật vị trí và hiển thị ô lời thoại phù hợp dựa trên các thuộc tính được xác định trong tài liệu thiết kế ban đầu.
if line_timer > 0:
line_timer -= delta
elif current_line < dialogue_lines.size():
show_next_dialogue_line()
Đoạn mã đã cho sẽ đánh giá xem giá trị của biến line\_timer có vượt quá một ngưỡng nhất định hay không. Trong trường hợp điều kiện này đúng, giá trị của bộ đếm thời gian sẽ giảm theo giá trị delta đã chỉ định. Hơn nữa, nếu bộ hẹn giờ hiện không hoạt động và vẫn còn nội dung hội thoại bổ sung được hiển thị, thì chương trình con show\_next\_dialogue\_line sẽ được gọi.
Triển khai hàm show_next_dialogue_line như sau:
func show_next_dialogue_line():
dialogue_box.text = dialogue_lines[current_line]
current_line \+= 1
# Display each line for 3 seconds
line_timer = 3.0
Hàm hiện tại sửa đổi văn bản có trong ô lời thoại bằng cách nói gần đây nhất và tăng giá trị của bộ đếm dòng hiện tại. Bộ hẹn giờ, được gọi là “dòng\_timer”, quy định khoảng thời gian mà mỗi câu lệnh vẫn hiển thị trên màn hình trước khi chuyển sang thông báo tiếp theo.
Thêm nút Đóng
Bây giờ bạn có thể cấp cho người chơi tùy chọn đóng cửa sổ hội thoại và tiếp tục chơi trò chơi. Điều này có thể đạt được bằng cách kết hợp nút “đóng” trong hộp thoại, khi nhấn nút này, sẽ ẩn cửa sổ nói trên và cho phép người tham gia tham gia lại diễn biến của trò chơi.
Sửa đổi hàm ready
hiện có để tạo nút đóng với chức năng tương ứng bằng cách kết hợp mã HTML cần thiết cho nút đóng trong hàm nghe sự kiện mở cửa sổ phương thức.
func _ready():
dialogue_box = Label.new()
dialogue_box.visible = false
add_child(dialogue_box)
close_button = Button.new()
close_button.text = "Close"
close_button.position = Vector2(50, 30)
close_button.visible = false
close_button.pressed.connect(_on_close_button_pressed)
add_child(close_button)
Mã được cung cấp sẽ tạo đối tượng aButton, điều chỉnh cách trình bày và vị trí trực quan của nó, đồng thời thiết lập kết nối giữa tín hiệu sự kiện nhấn và hàm\_on\_close\_button\_press\*.
Kết hợp một phương thức mới có tên \_on\_close\_button\_press
trong lớp GameUIManager
. Trong chức năng này, đảm bảo rằng cả khả năng hiển thị của hộp thoại và nút đóng của nó đều được đặt thành false
. Khi làm như vậy, người dùng không thể xem hoặc tương tác với giao diện hội thoại nữa.
Để bắt đầu lại, điều khôn ngoan là khôi phục chỉ số dòng hiện tại về trạng thái ban đầu bằng 0 để đảm bảo rằng cuộc thảo luận của chúng ta sẽ bắt đầu lại từ đầu trong mỗi trường hợp mà người tham gia nhắc nhở giao tiếp:
func _on_close_button_pressed():
dialogue_box.visible = false
close_button.visible = false
current_line = 0
Thông qua sửa đổi này, người tham gia sẽ có khả năng tham gia vào cuộc trò chuyện và loại bỏ hộp thoại theo ý mình, cho phép họ tiếp tục điều hướng hoặc tương tác với môi trường kỹ thuật số như mong muốn.
Các phương pháp hay nhất cho hệ thống đối thoại của bạn
Việc duy trì sự tập trung vào các nguyên tắc được đề xuất này khi bạn dần dần cải thiện và hoàn thiện mô hình trò chuyện của mình có thể tạo điều kiện làm phong phú tối ưu chiều sâu tường thuật và sự đắm chìm cho người chơi của bạn.
Tính nhất quán là chìa khóa
Duy trì cách tiếp cận ngôn ngữ thống nhất là rất quan trọng để thúc đẩy kết nối đích thực giữa người chơi và các nhân vật trong trò chơi, đồng thời thúc đẩy bầu không khí gắn kết trong môi trường ảo. Tính nhất quán vững chắc này cho phép thiết lập mối quan hệ giữa người chơi và người kể chuyện, từ đó nâng cao trải nghiệm tổng thể của họ bằng cách đảm bảo một cuộc phiêu lưu suôn sẻ và hấp dẫn.
Giọng nhân vật thủ công
Để tạo ra những nhân vật chân thực và hấp dẫn, điều quan trọng là phải ban cho mỗi cá nhân một giọng nói và khí chất riêng xuất phát từ cốt truyện, mục tiêu và cảm xúc của họ. Điều này sẽ cho phép người đọc hoặc người xem hiểu rõ hơn và kết nối với họ ở mức độ cảm xúc.
Việc kết hợp các kiểu nói và cách cư xử đặc biệt cho mỗi nhân vật không chỉ nâng cao cá tính của họ mà còn góp phần tạo ra những trao đổi đáng nhớ giữa họ, vì nó cung cấp một dấu hiệu nhận dạng duy nhất để phân biệt tính cách này với tính cách khác. May mắn thay, việc triển khai các biến thể này rất đơn giản trong khuôn khổ Godot, cho phép các nhà phát triển tạo ra các tín hiệu âm thanh đa dạng mà không tốn nhiều công sức.
Những lựa chọn ý nghĩa
Kết hợp các kết quả lựa chọn có ý nghĩa quan trọng đối với cả cốt truyện và tương tác giữa người chơi và nhân vật. Bằng cách ảnh hưởng đến các khía cạnh như phát triển cốt truyện, động lực giữa các cá nhân hoặc các quy tắc trò chơi cốt lõi, những lựa chọn mang tính hệ quả này sẽ thúc đẩy người dùng tham gia tích cực vào chuỗi cuộc trò chuyện và thúc đẩy cam kết tình cảm đối với lựa chọn của họ.
Kiểm tra và lặp lại
Thực hiện đánh giá toàn diện các chuỗi hội thoại của bạn bằng cách kiểm tra kỹ lưỡng các lỗi chính tả, mâu thuẫn ngữ pháp và mất cân bằng nhịp độ. Sử dụng các kỹ thuật chơi thử để thu thập thông tin chi tiết từ người chơi và thực hiện các sửa đổi nếu cần để đảm bảo tương tác liền mạch và trải nghiệm chơi trò chơi nâng cao thông qua hệ thống đối thoại.
Tính nhất quán của giao diện người dùng
Khi thiết kế hệ thống hội thoại cho trò chơi điện tử, điều quan trọng là phải đảm bảo rằng hình thức và bố cục của nó phù hợp với thiết kế giao diện người dùng rộng hơn của trò chơi. Việc duy trì tính nhất quán về các thành phần hình ảnh như kiểu phông chữ, cách phối màu và các yếu tố đồ họa khác có thể giúp thúc đẩy môi trường chơi game sống động bằng cách thúc đẩy giao diện thống nhất trên tất cả các khía cạnh của trò chơi.
Việc tuân thủ các phương pháp được đề xuất này cho phép phát triển hệ thống dựa trên đối thoại, hệ thống này không chỉ nâng cao cách kể chuyện trong trò chơi của bạn mà còn thúc đẩy cuộc gặp gỡ khó quên và hấp dẫn cho người chơi.
Nâng tầm trò chơi Godot của bạn bằng hệ thống đối thoại
Việc tích hợp hệ thống dựa trên hội thoại trong trò chơi Godot của bạn có khả năng nâng cao sự tham gia của người chơi và chuyển đổi kỹ thuật kể chuyện. Thông qua việc tạo điều kiện thuận lợi cho việc giao tiếp với nhân vật, thể hiện cảm xúc và phản ứng với các lựa chọn của người chơi, một môi trường chơi game ngày càng hấp dẫn và kết nối với nhau được tạo ra.
Bằng cách sử dụng nền tảng trực quan do Godot cung cấp và khai thác khả năng của ngôn ngữ kịch bản GDScript, các nhà phát triển được trang bị các phương tiện để tạo ra hệ thống đối thoại hấp dẫn giúp người chơi đắm chìm một cách hiệu quả vào một câu chuyện hấp dẫn và nâng cao trải nghiệm chơi trò chơi tổng thể của họ.