Contents

วิธีเพิ่มการตรวจจับการชนอย่างมีประสิทธิภาพใน Godot เพื่อการเล่นเกมที่ราบรื่น

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

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

การตั้งค่าเกม Godot

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

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

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

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

 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)

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

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

รูปร่างการชนที่แตกต่างกัน

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

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

รูปร่างการชนกันของวงกลม

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

 # Inside the player character's script
var collision_shape = CollisionShape2D.new()
var circle_shape = CircleShape2D.new()
circle_shape.radius = 32
collision_shape.shape = circle_shape
add_child(collision_shape) 

รูปร่างการชนกันของสี่เหลี่ยมผืนผ้า

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

 # Inside the player character's script
var collision_shape = CollisionShape2D.new()
var rect_shape = RectangleShape2D.new()
rect_shape.extents = Vector2(32, 64)
collision_shape.shape = rect_shape
add_child(collision_shape) 

รูปร่างการชนกันของรูปหลายเหลี่ยมนูน

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

 # Inside the player character's script
var collision_shape = CollisionShape2D.new()
var polygon_shape = ConvexPolygonShape2D.new()
polygon_shape.set_points([Vector2(-32,-64), Vector2(32,-64), Vector2(0, 64)])
collision_shape.shape = polygon_shape
add_child(collision_shape) 

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

การตรวจจับการชน

การตรวจจับข้อขัดแย้งระหว่างวัตถุเป็นสิ่งสำคัญในการใช้งานองค์ประกอบเชิงโต้ตอบและกลไกการเล่นเกม ภายใน Godot การรวมตัวกันของกลไกฟิสิกส์ช่วยให้สามารถตรวจจับการชนดังกล่าวได้

 # Detecting Collisions in _physics_process
func _physics_process(delta):
    var input_dir = Vector2.ZERO
    # ... (input handling)

    velocity = input_dir.normalized() * speed
    var collision = move_and_collide(velocity * delta)

    if collision:
        print("collided") 

ด้านล่างเป็นผลลัพธ์:

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

สัญญาณการชนและมาสก์การชน

Godot นำเสนอคุณสมบัติขั้นสูง เช่น สัญญาณการชนกันและมาสก์การชนกัน ซึ่งสามารถใช้เพื่อเพิ่มความซับซ้อนของการโต้ตอบระหว่างวัตถุในเกม

สัญญาณการชน

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

เพื่อสร้างคิวเสียงเพื่อตอบสนองต่อตัวละครเอกที่สัมผัสกับวัตถุที่รวบรวมได้ เราอาจใช้สัญญาณการชนกันดังต่อไปนี้:

 # Inside the player character's script
func _ready():
    connect("body_entered", self, "_on_body_entered")

func _on_body_entered(body: Node):
    if body.is_in_group("collectible"):
        # Play a sound effect
        play_collectible_sound()

        # Perform additional logic like collecting the item

        # Remove the collectible from the scene
        body.queue_free() 

ในการสาธิตนี้ สัญญาณ body\_entered จะถูกทริกเกอร์เมื่อตัวละครของผู้เล่นสัมผัสกับเอนทิตีทางกายภาพอื่น การใช้เมธอด \_on\_body\_entered อาจตอบสนองต่อการชนกัน หากวัตถุที่ส่งผลกระทบอยู่ในกลุ่ม collectible ก็เป็นไปได้ที่จะเล่นเอฟเฟกต์เสียงที่ไม่มีใบอนุญาตตามมา

หน้ากากการชนกัน

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

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

 # Inside the enemy's script
func _ready():
    # Disable collision with other enemies
    set_collision_mask_value(2, false)
    
    # Enable collision with platforms
    set_collision_mask_value(3, true)

# Inside the bullet's script
func _ready():
    # Enable collision with enemies
    set_collision_mask_value(2, true)

    # Disable collision with platforms
    set_collision_mask_value(3, false) 

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

แนวทางปฏิบัติที่ดีที่สุดสำหรับการตรวจจับการชน

เพื่อรับประกันประสบการณ์การเล่นเกมที่ราบรื่นและการตรวจจับการชนที่มีประสิทธิภาพ ขอแนะนำให้ปฏิบัติตามแนวทางที่แนะนำเหล่านี้

ใช้รูปทรงที่เรียบง่าย

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

มาสก์การชนกันของเลเยอร์

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

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

กลุ่มการชนกัน

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

กล่องล้อมรอบ

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

ใช้แบบสอบถามจลนศาสตร์

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

ทำให้เกม Godot มีส่วนร่วมมากขึ้นด้วยการตรวจจับการชนกัน

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

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