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