Contents

การสร้างระบบการสนทนาใน 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)

รหัสปัจจุบันช่วยให้ตัวเอกสามารถนำทางโดยใช้คำสั่งลูกศร อำนวยความสะดวกในการก้าวหน้าผ่านแพลตฟอร์มที่หลากหลาย ในขณะเดียวกันก็คำนึงถึงการโต้ตอบหรือการชนกันที่อาจเกิดขึ้น

/th/images/simple-game-in-godot.jpg

การเพิ่มกล่องโต้ตอบ

เมื่อเริ่มการพัฒนาระบบบทสนทนา ระยะเริ่มต้นเกี่ยวข้องกับการรวมอินเทอร์เฟซสำหรับการแสดงข้อความเมื่อมีการโต้ตอบระหว่างตัวละครของผู้เล่นกับวัตถุเฉพาะหรือตัวละครที่ไม่ใช่ผู้เล่น (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"จะควบคุมระยะเวลาที่แต่ละข้อความยังคงมองเห็นได้บนหน้าจอก่อนที่จะดำเนินการต่อไปยังข้อความถัดไป

/th/images/text-in-godot.jpg

การเพิ่มปุ่มปิด

ตอนนี้คุณสามารถให้ตัวเลือกแก่เกมเมอร์ในการปิดหน้าต่างการสนทนาและเล่นเกมต่อได้ ซึ่งสามารถทำได้โดยการรวมปุ่ม"ปิด"ไว้ในกล่องโต้ตอบ ซึ่งเมื่อกดแล้วจะปกปิดหน้าต่างดังกล่าว และช่วยให้ผู้เข้าร่วมสามารถเข้าร่วมความคืบหน้าของเกมได้อีกครั้ง

แก้ไขฟังก์ชัน 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 

ด้วยการปรับเปลี่ยนนี้ ผู้เข้าร่วมจะสามารถมีส่วนร่วมในการสนทนาและยกเลิกกล่องโต้ตอบได้ตามดุลยพินิจของพวกเขา ทำให้พวกเขากลับมานำทางหรือโต้ตอบกับสภาพแวดล้อมดิจิทัลได้ตามต้องการ

/th/images/buttons-in-godot.jpg

แนวทางปฏิบัติที่ดีที่สุดสำหรับระบบการสนทนาของคุณ

การให้ความสำคัญกับแนวทางที่แนะนำเหล่านี้ในขณะที่คุณปรับปรุงและขัดเกลาโมเดลการสนทนาของคุณอย่างต่อเนื่องสามารถช่วยให้ผู้เล่นของคุณมีความลึกและความดื่มด่ำในการเล่าเรื่องได้อย่างเหมาะสมที่สุด

ความสม่ำเสมอเป็นสิ่งสำคัญ

การรักษาแนวทางทางภาษาที่เหมือนกันเป็นสิ่งสำคัญในการส่งเสริมความสัมพันธ์ที่แท้จริงระหว่างผู้เล่นและตัวละครในเกม ในขณะเดียวกันก็ส่งเสริมบรรยากาศที่เหนียวแน่นภายในสภาพแวดล้อมเสมือนจริง ความสม่ำเสมอที่ไม่เปลี่ยนแปลงนี้ทำให้เกิดความสัมพันธ์ระหว่างเกมเมอร์และการเล่าเรื่อง ซึ่งจะช่วยยกระดับประสบการณ์โดยรวมของพวกเขาโดยรับประกันว่าการผจญภัยจะราบรื่นและน่าดึงดูด

ประดิษฐ์เสียงตัวละคร

เพื่อสร้างตัวละครที่น่าเชื่อถือและน่าดึงดูด สิ่งสำคัญคือต้องทำให้แต่ละคนมีน้ำเสียงและอารมณ์ที่เป็นเอกลักษณ์ซึ่งถ่ายทอดมาจากเรื่องราวเบื้องหลัง วัตถุประสงค์ และความรู้สึกของพวกเขา ซึ่งจะช่วยให้ผู้อ่านหรือผู้ชมเข้าใจและเชื่อมโยงกับพวกเขาได้ดีขึ้นในระดับอารมณ์

การผสมผสานรูปแบบคำพูดและกิริยาท่าทางที่โดดเด่นสำหรับตัวละครแต่ละตัวไม่เพียงแต่ช่วยเพิ่มความเป็นตัวตนของพวกเขาเท่านั้น แต่ยังมีส่วนทำให้เกิดการแลกเปลี่ยนที่น่าจดจำระหว่างพวกเขาด้วย เนื่องจากเป็นตัวระบุที่ไม่ซ้ำกันที่แยกแยะบุคลิกภาพหนึ่งจากอีกบุคลิกภาพหนึ่ง โชคดีที่การนำรูปแบบเหล่านี้ไปใช้นั้นทำได้ง่ายภายใต้กรอบการทำงานของ Godot ทำให้นักพัฒนาสามารถสร้างคิวเสียงที่หลากหลายได้โดยใช้ความพยายามเพียงเล็กน้อย

ทางเลือกที่มีความหมาย

รวมผลลัพธ์ตัวเลือกที่มีผลกระทบอย่างมีนัยสำคัญต่อทั้งเนื้อเรื่องและการโต้ตอบระหว่างตัวละครกับผู้เล่น การเลือกที่เป็นผลสืบเนื่องเหล่านี้มีผลกระทบต่อด้านต่างๆ เช่น การพัฒนาโครงเรื่อง พลวัตระหว่างบุคคล หรือกฎของเกมหลัก กระตุ้นให้ผู้ใช้มีส่วนร่วมในลำดับการสนทนาอย่างแข็งขัน และส่งเสริมความมุ่งมั่นทางอารมณ์ต่อสิ่งที่ตนเลือก

การทดสอบและการวนซ้ำ

ประเมินลำดับบทสนทนาของคุณอย่างครอบคลุมโดยตรวจสอบการสะกดผิด ความไม่สอดคล้องทางไวยากรณ์ และความไม่สมดุลของจังหวะอย่างละเอียด ใช้เทคนิคการทดสอบการเล่นเพื่อรวบรวมข้อมูลเชิงลึกจากผู้เล่นและดำเนินการแก้ไขตามที่จำเป็นเพื่อรับประกันการโต้ตอบที่ราบรื่นและประสบการณ์การเล่นเกมที่ได้รับการปรับปรุงผ่านระบบบทสนทนา

ความสอดคล้องของ UI

เมื่อออกแบบระบบบทสนทนาสำหรับวิดีโอเกม สิ่งสำคัญคือต้องแน่ใจว่ารูปลักษณ์และเค้าโครงของมันสอดคล้องกับการออกแบบส่วนต่อประสานผู้ใช้ที่กว้างขึ้นของเกม การรักษาความสอดคล้องในแง่ขององค์ประกอบภาพ เช่น รูปแบบตัวอักษร โทนสี และองค์ประกอบกราฟิกอื่นๆ สามารถช่วยส่งเสริมสภาพแวดล้อมการเล่นเกมที่ดื่มด่ำโดยการส่งเสริมรูปลักษณ์ที่เป็นหนึ่งเดียวกันในทุกด้านของเกม

การปฏิบัติตามแนวทางที่แนะนำเหล่านี้ช่วยให้สามารถพัฒนาระบบที่ใช้บทสนทนาซึ่งไม่เพียงแต่ยกระดับการเล่าเรื่องในเกมของคุณ แต่ยังส่งเสริมการเผชิญหน้าที่น่าจดจำและดื่มด่ำสำหรับผู้เล่นอีกด้วย

ยกระดับเกม Godot ของคุณด้วยระบบบทสนทนา

การบูรณาการระบบที่ใช้บทสนทนาภายในเกม Godot ของคุณมีศักยภาพในการเพิ่มการมีส่วนร่วมของผู้เล่นและเปลี่ยนแปลงเทคนิคการเล่าเรื่อง ด้วยการอำนวยความสะดวกในการสื่อสารตัวละคร การแสดงออกทางอารมณ์ และการตอบสนองต่อตัวเลือกของผู้เล่น สภาพแวดล้อมการเล่นเกมที่ดื่มด่ำและเชื่อมโยงถึงกันมากขึ้นได้ถูกสร้างขึ้น

ด้วยการใช้แพลตฟอร์มที่ใช้งานง่ายที่ Godot มอบให้และควบคุมความสามารถของภาษาสคริปต์ GDScript นักพัฒนาจึงมีเครื่องมือในการสร้างระบบบทสนทนาที่น่าดึงดูด ซึ่งทำให้ผู้เล่นดื่มด่ำไปกับการเล่าเรื่องที่น่าสนใจอย่างมีประสิทธิภาพ และยกระดับประสบการณ์การเล่นเกมโดยรวมของพวกเขา