از این تکنیک برای تقویت حرکت و رفتار دشمن با تقلید از دید اولیه استفاده کنید.
تشخیص خط دید با مکانیزمی که به شخصیت ها یا اشیاء اجازه می دهد محیط اطراف خود را درک کنند، لایه ای از پیچیدگی را به بازی شما اضافه می کند. شما می توانید از این ویژگی برای رفتار هوش مصنوعی دشمن، مکانیک دید بازیکن، گیم پلی مخفی کاری و غیره استفاده کنید.
در گودو، گره RayCast2D یک راه ساده و کارآمد برای دستیابی به تشخیص خط دید ارائه می دهد.
راه اندازی بازی گودو
قبل از غواصی در گرههای RayCast2D، یک محیط بازی دو بعدی اولیه را در Godot 4 راهاندازی کنید. یک شخصیت بازیکن ایجاد کنید که بتواند با استفاده از ورودیهای صفحهکلید حرکت کند و با پلتفرمها تعامل داشته باشد.
ابتدا یک صحنه برای شخصیت بازیکن ایجاد کنید. یک گره CharacterBody2D به عنوان ریشه صحنه اضافه کنید. داخل CharacterBody2D، یک CollisionShape2D با شکل مستطیل و یک Sprite2D برای نمایش بصری شخصیت اضافه کنید.
کد استفاده شده در این مقاله در این مخزن 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
برای ایجاد تشخیص خط دید، از گره RayCast2D استفاده کنید. در اینجا نحوه اضافه کردن گره RayCast2D با استفاده از GDScript آورده شده است:
var raycast: RayCast2D
func _ready():
raycast = RayCast2D.new()
add_child(raycast)
مطمئن شوید که این اسکریپت را به گره CharacterBody2D متصل کرده اید. این قطعه کد یک گره RayCast2D جدید ایجاد می کند و آن را در کودکی به شخصیت پخش کننده متصل می کند.
ارائه بازخورد بصری در مورد تعامل خط دید
اکنون، هر زمان که خط دید بازیکن با یک پلت فرم تقاطع پیدا کرد، می توانید پیامی را چاپ کنید. یک پرتو از موقعیت بازیکن در جهت حرکت پرتاب کنید. اگر پرتو با یک جسم برخورد کند، به این معنی است که بازیکن یک خط دید به یک سکو دارد.
کد زیر را به همان اسکریپت اضافه کنید:
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() می توانید به اولین شی که با پرتو قطع شده است دسترسی پیدا کنید. اگر شیئی در مسیر پرتو نباشد، متد null را برمیگرداند. این به ویژه برای شناسایی شی خاصی که پخش کننده شما به آن خط دید دارد مفید است.
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 (0, 0) خواهد بود.
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، می توانید بینش مهمی در مورد تعاملات بین اشعه و اشیاء در حال برخورد به دست آورید.
این روش ها شما را قادر می سازد تا اطلاعات ضروری را جمع آوری کنید که می تواند به طور قابل توجهی بر مکانیک بازی، تعاملات اشیا و بازخورد بازیکن تأثیر بگذارد.
از جمله ویژگی های اضافی
علاوه بر قابلیت تشخیص خط دید اصلی، می توانید پویایی بازی خود را با اجرای برخی ویژگی های پیشرفته بیشتر کنید.
محرک های رویداد
به جای اینکه صرفاً یک پیام را چاپ کنید، می توانید رویدادهای خاص درون بازی را راه اندازی کنید. به عنوان مثال، آشکار کردن مسیرهای مخفی، فعال کردن مکانیسم ها، یا هشدار دادن به دشمنان در مورد حضور بازیکن می تواند به گیم پلی شما عمق دهد.
مدیریت انسداد دینامیک
سناریوهایی را در نظر بگیرید که در آن موانع می توانند خط دید را مسدود کنند. پیادهسازی تشخیص انسداد پویا تضمین میکند که با حرکت اشیا به داخل و خارج از دید بازیکن، خط دید در زمان واقعی بهروزرسانی میشود.
نشانگرهای بصری سفارشی
به جای تکیه صرف بر متن، میتوانید شاخصهای بصری سفارشی ایجاد کنید تا حضور تعاملات خط دید را برجسته کنید. این می تواند شامل تغییر رنگ پخش کننده یا شی اسپرایت، نمایش یک نماد یا متحرک سازی عناصر مرتبط باشد.
مه مکانیک جنگ
برای بازی های استراتژیک یا اکتشافی می توانید مکانیک های مه جنگ را معرفی کنید. این امر دید بازیکن را تا زمانی که یک خط دید ایجاد کند محدود می کند، دنیای بازی را به تدریج آشکار می کند و تصمیم گیری استراتژیک را تشویق می کند.
بهترین روش ها برای تشخیص خط دید
بهینه سازی تشخیص خط دید برای حفظ یک تجربه گیم پلی روان بسیار مهم است. در اینجا برخی از بهترین روشها وجود دارد که باید به خاطر داشته باشید.
فرکانس Raycast
در صورت عدم نیاز، از انجام پرتوهای هر فریم خودداری کنید. فقط زمانی که موقعیت بازیکن یا محیط به طور قابل توجهی تغییر می کند، خط دید را بررسی کنید. این به کاهش محاسبات غیر ضروری کمک می کند.
طول پرتو
طول پرتوی خود را متعادل کنید. پرتوهای بسیار طولانی می توانند بر عملکرد تأثیر بگذارند، بنابراین طولی را انتخاب کنید که منطقه لازم را پوشش دهد و در عین حال بار محاسباتی را کنترل کنید.
لایه های برخورد
از لایههای برخورد و ماسکها برای تنظیم دقیق اشیایی که تشخیص خط دید در نظر میگیرد استفاده کنید. این از ارسال پرتوهای غیر ضروری به اشیاء نامربوط جلوگیری می کند.
کش کردن نتایج
اگر تشخیص خط دید یکسانی را برای چندین شی یا فریم انجام میدهید، برای جلوگیری از محاسبات اضافی، نتایج را در حافظه پنهان نگه دارید.
ادغام در سطح پلتفرم
مکانیک های تشخیص خط دید خود را با طراحی سطح بازی پلتفرمر خود هماهنگ کنید. عمودی بودن محیط، ارتفاعات مختلف پلت فرم و موانع احتمالی را که می توانند مانع از دید شوند را در نظر بگیرید.
اطمینان حاصل کنید که سیستم تشخیص شما این تفاوت های ظریف را برای ایجاد یک تجربه پخش یکپارچه و شهودی در نظر می گیرد.
جذابتر کردن بازیهای گودو با تشخیص خط دید
تشخیص خط دید به دنیای بازی شما عمق و واقع گرایی می افزاید. بازیکنان می توانند بر اساس خط دید خود استراتژی، پنهان یا رویکرد متفاوتی به چالش ها داشته باشند. این مکانیک میتواند یک پلتفرمر ساده را به تجربهای فراگیرتر تبدیل کند و گیمپلی را جذابتر و خاطرهانگیزتر کند.