การสร้างระบบการสนทนาใน Godot ด้วย GDScript
ในการพัฒนาเกม การเล่นเกมที่น่าดึงดูดและการเล่าเรื่องที่น่าดึงดูดเป็นกุญแจสำคัญในการสร้างประสบการณ์ที่น่าจดจำ เครื่องมืออันทรงพลังอย่างหนึ่งที่สามารถช่วยให้คุณบรรลุเป้าหมายนี้คือระบบการสนทนา
กลไกบทสนทนาที่ดำเนินการอย่างเหมาะสมช่วยให้ตัวละครสามารถสนทนา แลกเปลี่ยนข้อมูล และเชื่อมต่อกับผู้เล่นได้ ซึ่งจะช่วยเพิ่มความสมบูรณ์และคุณภาพที่ดื่มด่ำของประสบการณ์การเล่นเกม
การตั้งค่าเกม Godot ของคุณ
เริ่มต้นกระบวนการพัฒนาโดยการสร้างโครงสร้างพื้นฐานของเกมของคุณ ในกรณีนี้ ให้สร้างการตั้งค่าพื้นฐานสองมิติที่มีรูปประจำตัวซึ่งสามารถนำทางได้โดยใช้ปุ่มลูกศร
ซอร์สโค้ดที่ใช้ในเอกสารนี้สามารถเข้าถึงได้ผ่านพื้นที่เก็บข้อมูลสาธารณะบน GitHub ซึ่งนำเสนอโดยไม่เสียค่าใช้จ่ายเพื่อความสะดวกของคุณภายใต้เงื่อนไขของใบอนุญาต MIT ที่ได้รับการยอมรับอย่างกว้างขวาง
รวมข้อมูลโค้ดที่ให้ไว้ใน Unity โดยเริ่มต้นการตั้งค่าใหม่สำหรับการปรากฏตัวของตัวละครของผู้เล่น แนะนำอินสแตนซ์ของวัตถุ CharacterBody2D
และเชื่อมต่อกับฉาก หลังจากนั้น ให้เพิ่มส่วนประกอบ CollisionShape2D
โดยมีรูปแบบเป็นรูปสี่เหลี่ยมผืนผ้าเพื่อกำหนดขอบเขตที่ผู้เล่นโต้ตอบกับวัตถุอื่นๆ ในโลกของเกม
ผสมผสานการเคลื่อนไหวของตัวละครและการโต้ตอบกับออบเจ็กต์บนแพลตฟอร์มโดยใช้ GDScript เพื่อแทนที่สคริปต์เริ่มต้นของส่วนประกอบ CharacterBody2D รหัสที่ให้มามีดังนี้:
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)
รหัสปัจจุบันช่วยให้ตัวเอกสามารถนำทางโดยใช้คำสั่งลูกศร อำนวยความสะดวกในการก้าวหน้าผ่านแพลตฟอร์มที่หลากหลาย ในขณะเดียวกันก็คำนึงถึงการโต้ตอบหรือการชนกันที่อาจเกิดขึ้น
การเพิ่มกล่องโต้ตอบ
เมื่อเริ่มการพัฒนาระบบบทสนทนา ระยะเริ่มต้นเกี่ยวข้องกับการรวมอินเทอร์เฟซสำหรับการแสดงข้อความเมื่อมีการโต้ตอบระหว่างตัวละครของผู้เล่นกับวัตถุเฉพาะหรือตัวละครที่ไม่ใช่ผู้เล่น (NPC)
เพื่อที่จะปรับปรุงการทำงานของสคริปต์ CharacterBody2D
ของเรา เราควรรวมตัวแปรเพิ่มเติมที่จะช่วยให้เราจัดการกล่องโต้ตอบและเนื้อหาได้อย่างมีประสิทธิภาพ ซึ่งสามารถทำได้โดยการแนะนำตัวแปรใหม่ เช่น \_dialogBox
, \_previousLine
และ \_currentLine
แบบแรกจะเก็บการอ้างอิงถึงวัตถุกล่องโต้ตอบ ในขณะที่สองรายการหลังจะแสดงบรรทัดปัจจุบันที่กำลังพิมพ์ในช่องข้อความและบรรทัดก่อนหน้าตามลำดับ ด้วยการใช้ตัวแปรเหล่านี้ เราสามารถใช้คุณลักษณะต่างๆ เช่น การเรียกคืนประวัติ และการอัปเดตช่องข้อความอินพุตแบบเรียลไทม์เมื่อพิมพ์
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
dialogue\_box
ได้รับการออกแบบมาเพื่อแสดงเนื้อหาการสนทนา และ close\_button
ทำหน้าที่เป็นช่องทางให้ผู้ใช้ปิดกล่องโต้ตอบทุกครั้งที่เห็นว่าจำเป็น
ในฟังก์ชัน ready
ฉันจะสร้างและเริ่มต้นกล่องโต้ตอบสำหรับแอปพลิเคชันของเรา กล่องโต้ตอบนี้จำเป็นสำหรับการจัดเตรียมอินเทอร์เฟซระหว่างผู้ใช้และโปรแกรม ทำให้พวกเขาโต้ตอบกับมันได้อย่างมีความหมาย กล่องโต้ตอบสามารถแสดงข้อความหรือข้อความแจ้งต่าง ๆ ขึ้นอยู่กับว่าผู้ใช้หรือโปรแกรมกำลังดำเนินการใดอยู่ นอกจากนี้ กล่องโต้ตอบนี้ยังทำหน้าที่เป็นคอนเทนเนอร์สำหรับส่วนประกอบอื่นๆ ที่เราจะเพิ่มในภายหลัง เช่น ปุ่มหรือช่องข้อความ ซึ่งจะช่วยให้ผู้ใช้ป้อนข้อมูลหรือทำงานเฉพาะภายในแอปพลิเคชันได้
func _ready():
dialogue_box = Label.new()
dialogue_box.visible = false
add_child(dialogue_box)
การแสดงข้อความบทสนทนา
ตอนนี้คุณอาจมุ่งความสนใจไปที่การนำเสนอเนื้อหาภายในกล่องโต้ตอบได้แล้ว คุณสามารถขยายข้อความเป็นหลายบรรทัดและเปิดใช้งานการเลื่อน โดยแสดงเพียงบรรทัดเดียวในแต่ละครั้ง
หากต้องการปรับเปลี่ยนฟังก์ชันกระบวนการทางฟิสิกส์เพื่อรองรับการแสดงเส้นบทสนทนา ให้ปฏิบัติตามขั้นตอนเหล่านี้:1. เพิ่มตัวแปรใหม่ที่เรียกว่า"DialogueLines"เพื่อจัดเก็บข้อมูลข้อความสำหรับบทสนทนาแต่ละบรรทัด ซึ่งสามารถทำได้โดยการสร้างอาร์เรย์ว่างและกำหนดให้กับคีย์"dialogueLines"ภายในวัตถุหรือสคริปต์ที่ต้องการ2. อัปเดตลูปการจำลองเพื่อรวมการจัดการบรรทัดบทสนทนา ภายในลูปนี้ ให้ดึงข้อมูลข้อความจากอาร์เรย์"dialogueLines"โดยใช้ค่าดัชนีเป็นตัวระบุ จากนั้น อัปเดตการวางตำแหน่งและการเรนเดอร์ของกรอบคำพูดตามคุณสมบัติที่กำหนดไว้ในเอกสารการออกแบบต้นฉบับ
if line_timer > 0:
line_timer -= delta
elif current_line < dialogue_lines.size():
show_next_dialogue_line()
โค้ดที่กำหนดจะประเมินว่าค่าของตัวแปร line\_timer เกินขีดจำกัดที่กำหนดหรือไม่ ในกรณีที่เงื่อนไขนี้เป็นจริง ค่าของตัวจับเวลาจะลดลงตามค่าเดลต้าที่ระบุ นอกจากนี้ หากตัวจับเวลาไม่ทำงานในขณะนี้ และยังคงมีเนื้อหาบทสนทนาเพิ่มเติมที่จะแสดง รูทีนย่อย show\_next\_dialog\_line จะถูกเรียกใช้
ใช้ฟังก์ชันshow_next_dialogue_lineดังต่อไปนี้:
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
ฟังก์ชันปัจจุบันจะแก้ไขข้อความที่อยู่ในกรอบคำพูดด้วยคำพูดล่าสุด และเพิ่มค่าของตัวนับบรรทัดปัจจุบัน ตัวจับเวลาที่เรียกว่า"line\_timer"จะควบคุมระยะเวลาที่แต่ละข้อความยังคงมองเห็นได้บนหน้าจอก่อนที่จะดำเนินการต่อไปยังข้อความถัดไป
การเพิ่มปุ่มปิด
ตอนนี้คุณสามารถให้ตัวเลือกแก่เกมเมอร์ในการปิดหน้าต่างการสนทนาและเล่นเกมต่อได้ ซึ่งสามารถทำได้โดยการรวมปุ่ม"ปิด"ไว้ในกล่องโต้ตอบ ซึ่งเมื่อกดแล้วจะปกปิดหน้าต่างดังกล่าว และช่วยให้ผู้เข้าร่วมสามารถเข้าร่วมความคืบหน้าของเกมได้อีกครั้ง
แก้ไขฟังก์ชัน read
ที่มีอยู่เพื่อสร้างปุ่มปิดที่มีฟังก์ชันที่สอดคล้องกันโดยการรวมโค้ด HTML ที่จำเป็นสำหรับปุ่มปิดภายในฟังก์ชันตัวฟังเหตุการณ์ที่เปิดหน้าต่างโมดอล
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)
รหัสที่ให้มาจะสร้างวัตถุ aButton ปรับแต่งการนำเสนอและการวางตำแหน่งด้วยภาพ และสร้างการเชื่อมต่อระหว่างสัญญาณเหตุการณ์การกดและฟังก์ชัน\_on\_close\_button\_pressed\*
รวมวิธีการใหม่ชื่อ \_on\_close\_button\_pressed
ไว้ในคลาส GameUIManager
ภายในฟังก์ชันนี้ ตรวจสอบให้แน่ใจว่าทั้งการมองเห็นกล่องโต้ตอบและปุ่มปิดถูกตั้งค่าเป็น false
เมื่อทำเช่นนี้ ผู้ใช้จะไม่สามารถดูหรือโต้ตอบกับอินเทอร์เฟซการสนทนาได้อีกต่อไป
ในการเริ่มต้นใหม่ เป็นการระมัดระวังที่จะคืนค่าดัชนีบรรทัดปัจจุบันกลับสู่สถานะเดิมเป็นศูนย์ เพื่อรับประกันว่าวาทกรรมของเราจะเริ่มต้นใหม่อีกครั้งในแต่ละกรณีที่ผู้เข้าร่วมแจ้งการสื่อสาร:
func _on_close_button_pressed():
dialogue_box.visible = false
close_button.visible = false
current_line = 0
ด้วยการปรับเปลี่ยนนี้ ผู้เข้าร่วมจะสามารถมีส่วนร่วมในการสนทนาและยกเลิกกล่องโต้ตอบได้ตามดุลยพินิจของพวกเขา ทำให้พวกเขากลับมานำทางหรือโต้ตอบกับสภาพแวดล้อมดิจิทัลได้ตามต้องการ
แนวทางปฏิบัติที่ดีที่สุดสำหรับระบบการสนทนาของคุณ
การให้ความสำคัญกับแนวทางที่แนะนำเหล่านี้ในขณะที่คุณปรับปรุงและขัดเกลาโมเดลการสนทนาของคุณอย่างต่อเนื่องสามารถช่วยให้ผู้เล่นของคุณมีความลึกและความดื่มด่ำในการเล่าเรื่องได้อย่างเหมาะสมที่สุด
ความสม่ำเสมอเป็นสิ่งสำคัญ
การรักษาแนวทางทางภาษาที่เหมือนกันเป็นสิ่งสำคัญในการส่งเสริมความสัมพันธ์ที่แท้จริงระหว่างผู้เล่นและตัวละครในเกม ในขณะเดียวกันก็ส่งเสริมบรรยากาศที่เหนียวแน่นภายในสภาพแวดล้อมเสมือนจริง ความสม่ำเสมอที่ไม่เปลี่ยนแปลงนี้ทำให้เกิดความสัมพันธ์ระหว่างเกมเมอร์และการเล่าเรื่อง ซึ่งจะช่วยยกระดับประสบการณ์โดยรวมของพวกเขาโดยรับประกันว่าการผจญภัยจะราบรื่นและน่าดึงดูด
ประดิษฐ์เสียงตัวละคร
เพื่อสร้างตัวละครที่น่าเชื่อถือและน่าดึงดูด สิ่งสำคัญคือต้องทำให้แต่ละคนมีน้ำเสียงและอารมณ์ที่เป็นเอกลักษณ์ซึ่งถ่ายทอดมาจากเรื่องราวเบื้องหลัง วัตถุประสงค์ และความรู้สึกของพวกเขา ซึ่งจะช่วยให้ผู้อ่านหรือผู้ชมเข้าใจและเชื่อมโยงกับพวกเขาได้ดีขึ้นในระดับอารมณ์
การผสมผสานรูปแบบคำพูดและกิริยาท่าทางที่โดดเด่นสำหรับตัวละครแต่ละตัวไม่เพียงแต่ช่วยเพิ่มความเป็นตัวตนของพวกเขาเท่านั้น แต่ยังมีส่วนทำให้เกิดการแลกเปลี่ยนที่น่าจดจำระหว่างพวกเขาด้วย เนื่องจากเป็นตัวระบุที่ไม่ซ้ำกันที่แยกแยะบุคลิกภาพหนึ่งจากอีกบุคลิกภาพหนึ่ง โชคดีที่การนำรูปแบบเหล่านี้ไปใช้นั้นทำได้ง่ายภายใต้กรอบการทำงานของ Godot ทำให้นักพัฒนาสามารถสร้างคิวเสียงที่หลากหลายได้โดยใช้ความพยายามเพียงเล็กน้อย
ทางเลือกที่มีความหมาย
รวมผลลัพธ์ตัวเลือกที่มีผลกระทบอย่างมีนัยสำคัญต่อทั้งเนื้อเรื่องและการโต้ตอบระหว่างตัวละครกับผู้เล่น การเลือกที่เป็นผลสืบเนื่องเหล่านี้มีผลกระทบต่อด้านต่างๆ เช่น การพัฒนาโครงเรื่อง พลวัตระหว่างบุคคล หรือกฎของเกมหลัก กระตุ้นให้ผู้ใช้มีส่วนร่วมในลำดับการสนทนาอย่างแข็งขัน และส่งเสริมความมุ่งมั่นทางอารมณ์ต่อสิ่งที่ตนเลือก
การทดสอบและการวนซ้ำ
ประเมินลำดับบทสนทนาของคุณอย่างครอบคลุมโดยตรวจสอบการสะกดผิด ความไม่สอดคล้องทางไวยากรณ์ และความไม่สมดุลของจังหวะอย่างละเอียด ใช้เทคนิคการทดสอบการเล่นเพื่อรวบรวมข้อมูลเชิงลึกจากผู้เล่นและดำเนินการแก้ไขตามที่จำเป็นเพื่อรับประกันการโต้ตอบที่ราบรื่นและประสบการณ์การเล่นเกมที่ได้รับการปรับปรุงผ่านระบบบทสนทนา
ความสอดคล้องของ UI
เมื่อออกแบบระบบบทสนทนาสำหรับวิดีโอเกม สิ่งสำคัญคือต้องแน่ใจว่ารูปลักษณ์และเค้าโครงของมันสอดคล้องกับการออกแบบส่วนต่อประสานผู้ใช้ที่กว้างขึ้นของเกม การรักษาความสอดคล้องในแง่ขององค์ประกอบภาพ เช่น รูปแบบตัวอักษร โทนสี และองค์ประกอบกราฟิกอื่นๆ สามารถช่วยส่งเสริมสภาพแวดล้อมการเล่นเกมที่ดื่มด่ำโดยการส่งเสริมรูปลักษณ์ที่เป็นหนึ่งเดียวกันในทุกด้านของเกม
การปฏิบัติตามแนวทางที่แนะนำเหล่านี้ช่วยให้สามารถพัฒนาระบบที่ใช้บทสนทนาซึ่งไม่เพียงแต่ยกระดับการเล่าเรื่องในเกมของคุณ แต่ยังส่งเสริมการเผชิญหน้าที่น่าจดจำและดื่มด่ำสำหรับผู้เล่นอีกด้วย
ยกระดับเกม Godot ของคุณด้วยระบบบทสนทนา
การบูรณาการระบบที่ใช้บทสนทนาภายในเกม Godot ของคุณมีศักยภาพในการเพิ่มการมีส่วนร่วมของผู้เล่นและเปลี่ยนแปลงเทคนิคการเล่าเรื่อง ด้วยการอำนวยความสะดวกในการสื่อสารตัวละคร การแสดงออกทางอารมณ์ และการตอบสนองต่อตัวเลือกของผู้เล่น สภาพแวดล้อมการเล่นเกมที่ดื่มด่ำและเชื่อมโยงถึงกันมากขึ้นได้ถูกสร้างขึ้น
ด้วยการใช้แพลตฟอร์มที่ใช้งานง่ายที่ Godot มอบให้และควบคุมความสามารถของภาษาสคริปต์ GDScript นักพัฒนาจึงมีเครื่องมือในการสร้างระบบบทสนทนาที่น่าดึงดูด ซึ่งทำให้ผู้เล่นดื่มด่ำไปกับการเล่าเรื่องที่น่าสนใจอย่างมีประสิทธิภาพ และยกระดับประสบการณ์การเล่นเกมโดยรวมของพวกเขา