Contents

วิธีใช้โหนด RayCast2D สำหรับการตรวจจับแนวสายตาใน Godot

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

ใน Godot การใช้งานการตรวจจับแนวสายตาผ่านการใช้งานโหนด RayCast2D นั้นมีความคล่องตัวและมีไหวพริบ

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

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

เพื่อเริ่มออกแบบตัวละครของผู้เล่นใน Unity ให้ทำตามขั้นตอนเหล่านี้:1. สร้างฉากว่างโดยคลิกขวาภายในหน้าต่างโครงการและเลือก"ฉาก"ตั้งชื่อบางอย่างเช่น"ตัวละครผู้เล่น"หรือคล้ายกัน2. ลาก GameObject ใหม่ไปยังแผงลำดับชั้นภายในฉากที่สร้างขึ้นใหม่นี้ สิ่งนี้จะทำหน้าที่เป็นวัตถุหลักสำหรับตัวละครผู้เล่นของเรา3. เมื่อเลือก GameObject รูทแล้ว ให้ไปที่แผงตัวตรวจสอบและคลิกที่ปุ่ม"เพิ่มส่วนประกอบ"ที่ด้านล่าง จากรายการส่วนประกอบที่มี ให้เลือก “CharacterController2D” และคลิก “เพิ่ม” ส่วนประกอบนี้จำเป็นสำหรับการเคลื่อนไหวของตัวละคร 2D ใน Unity4 จากนั้น ลาก GameObject อื่นไปยังแผงลำดับชั้นจากแผงสินทรัพย์ คราวนี้เลือกก่อน

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

รหัส 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-los-in-godot.jpg

การตั้งค่า RayCast2D

หากต้องการรวมการตรวจจับแนวสายตาในโครงการของคุณโดยใช้ Unity3D และ GDScript ให้ทำตามขั้นตอนเหล่านี้เพื่อรวมโหนด Raycast2D จาก Godot Engine:

 var raycast: RayCast2D

func _ready():
    raycast = RayCast2D.new()
    add_child(raycast) 

ตรวจสอบให้แน่ใจว่าคุณติดสคริปต์นี้ใน

ให้ข้อเสนอแนะภาพเกี่ยวกับการโต้ตอบแนวสายตา

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

รวมรหัสดังกล่าวภายในสคริปต์ที่มีอยู่ดังต่อไปนี้:

 func _physics_process(delta):
    # ... (previous movement code)

    raycast.target_position = Vector2(100, 0)

    if raycast.is_colliding():
        print("Collided with platform!") 

นี่คือผลลัพธ์:

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

ขยายฟังก์ชันการทำงานของ RayCast2D

การใช้ฟังก์ชันที่เป็นนวัตกรรมใหม่มากมายเป็นสิ่งสำคัญยิ่งในการยกระดับการโต้ตอบและความซับซ้อนภายในเกมให้อยู่ในระดับที่โดดเด่น

get_collider()

การใช้ฟังก์ชัน get\_collider() ช่วยให้สามารถดึงข้อมูลเอนทิตีเริ่มต้นที่รังสีพบได้ หากไม่มีวัตถุใดอยู่ในวิถีของรังสี วิธีการนี้จะคืนค่าเป็นโมฆะ ซึ่งจะให้ข้อมูลที่มีค่าเกี่ยวกับการไม่มีสิ่งกีดขวางในแนวสายตาของผู้เล่น

 if raycast.is_colliding():
    var collided_object = raycast.get_collider()

    if collided_object:
        print("You can see:", collided_object.name) 

get_collider_rid()

ฟังก์ชัน get\_collider\_rid() ช่วยให้สามารถดึงรหัสทรัพยากร (RID) ที่สอดคล้องกับวัตถุที่ชนกันครั้งแรกภายในระบบตรวจจับการชนกัน โดยให้ข้อมูลที่มีคุณค่าในการพิจารณาว่าวัตถุใดสัมผัสกันระหว่างการเล่นเกมหรือแอปพลิเคชันเชิงโต้ตอบอื่น ๆ

 if raycast.is_colliding():
    var collider_rid = raycast.get_collider_rid()

    if !collider_rid.is_valid():
        print("No valid object RID")
    else:
        print("Object RID:", collider_rid) 

get_collider_shape()

ฟังก์ชัน get\_collider\_shape() จะดึงข้อมูลตัวระบุเฉพาะที่เกี่ยวข้องกับรูปแบบเรขาคณิตของวัตถุที่ทับซ้อนกันเริ่มต้น หรือศูนย์ (0) ในกรณีที่ไม่เกิดการชนกัน

 if raycast.is_colliding():
    var collider_shape = raycast.get_collider_shape()

    if collider_shape == 0:
        print("No valid shape ID")
    else:
        print("Shape ID:", collider_shape) 

get_collision_normal()

เพื่อให้เข้าใจปฏิสัมพันธ์ลึกซึ้งยิ่งขึ้น การใช้ฟังก์ชัน get\_collision\_normal() จะให้เวกเตอร์ปกติของวัตถุ ณ จุดที่ชนกัน เมื่อรังสีกำเนิดจากภายในรูปร่างและตรงตามเงื่อนไข hit\_from\_inside ค่าปกติที่ส่งคืนโดยฟังก์ชันนี้จะแสดงเป็นอินสแตนซ์ Vector2 ที่มีค่า x เป็นศูนย์และค่า y เป็นศูนย์

 if raycast.is_colliding():
    var collision_normal = raycast.get_collision_normal()
    print("Collision Normal:", collision_normal) 

get_collision_point()

เมื่อเผชิญกับวัตถุที่วัตถุชนกัน ฟังก์ชัน get\_collision\_point() จะระบุจุดที่เกิดการชนกันอย่างแม่นยำภายในระบบพิกัดที่กำหนดทั่วโลก

 if raycast.is_colliding():
    var collision_point = raycast.get_collision_point()
    print("Collision Point:", collision_point) 

การใช้ประโยชน์จากฟังก์ชันการทำงานที่ซับซ้อนของโมดูล RayCast2D ทำให้เราได้รับความเข้าใจอันล้ำค่าเกี่ยวกับการทำงานร่วมกันระหว่างลำแสงที่ฉายกับสิ่งกีดขวางภายในฉาก

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

รวมถึงคุณสมบัติเพิ่มเติม

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

ทริกเกอร์เหตุการณ์

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

การจัดการสิ่งกีดขวางแบบไดนามิก

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

ตัวบ่งชี้ภาพที่กำหนดเอง

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

กลศาสตร์หมอกแห่งสงคราม

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

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

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

ความถี่เรย์แคสต์

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

ความยาวเรย์

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

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

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

ผลลัพธ์การแคช

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

บูรณาการระดับ Platformer

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

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

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

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