پشت صحنه: طراحی یک بازی به سبک بیت سابر با گودو

Summarize this content to 400 words in Persian Lang
بازی Beat Saber در Meta Quest 2 یک بازی هیجانانگیز است، اما صادقانه بگویم، بیش از 20 دقیقه من را با سردردی که برای مدتی درگیر میشود، عصبانی میکند. با این حال، این مانع من نشد که به ساختن نسخه خودم در گودو بپردازم. من قصد داشتم همان ریتم شدید برش و تاس را ثبت کنم. چالش این بود که گیم پلی بازی را تقلید کنم و آن را با تفاسیر فنی خودم آغشته کنم.
ساختمان:
راه اندازی شمشیرهای لیزری
من با ساخت شمشیرهای لیزری برای کنترلرهای VR شروع کردم. با استفاده از LineRenderer گودو، شمشیرهایی را که در امتداد محور z منفی کنترلکنندهها امتداد داشتند، کشیدم. دید هر شمشیر با دکمههای کنترلکننده مربوطه تغییر میکرد – 'A' برای سمت راست و 'X' برای چپ- و مطمئن میشد که فقط زمانی که من میخواهم با عناصر بازی تعامل داشته باشند.
اهداف مکعب پویا
سپس، مکعب ها. این بچه ها از دور شروع می کنند و به سمت شما زوم می کنند و رفلکس ها و ریتم شما را آزمایش می کنند. من آنها را برنامهریزی کردم که وقتی با شمشیر مورد اصابت قرار میگیرند، به هوا بریزند – درست به اندازه بیت سابر واقعی.
مرکزیت مجدد نمای بازیکن
یکی از ویژگیهای جالبی که میتوان اضافه کرد، تغییر مجدد دیدگاه بازیکن بود. به سیگنال “On Pose Recentered” OpenXR، فشار دادن و نگه داشتن دکمه Oculus اکنون نمای بازیکن را مستقیماً به یک مکعب ورودی میگیرد و آنها را کاملاً برای عمل در مرکز قرار میدهد.
# Handle OpenXR pose recentered signal
func _on_right_controller_button_pressed(name):
if name == “primary_click”:
XRServer.center_on_hmd(XRServer.RESET_BUT_KEEP_TILT, true)
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
افزودن بازخورد صوتی
جلوه های صوتی بسیار مهم بود. من جلو رفتم و صداهای خنده دار بونگ را برای همراهی با هر تخریب مکعب یکپارچه کردم، چرا که نه؟ من فقط دارم لذت می برم. کاوش در پایگاههای دادههای صوتی رایگان، کلیپهای کاملی را برای من فراهم کرد که سپس با بازدیدهای مکعب همگامسازی کردم.
مکانیسم تخم ریزی مکعب
برای زنده نگه داشتن بازی، اسکریپت CubeSpawner را پیاده سازی کردم. این قطعه کوچک کد به طور تصادفی مکعب هایی را در فواصل زمانی بین 0.5 تا 2.0 ثانیه تولید می کند و تضمین می کند که گیم پلی غیرقابل پیش بینی و جذاب باقی می ماند.
extends WorldEnvironment
var cube = preload(“res://SceneInstances/cube.tscn”)
var second_cube = preload(“res://SceneInstances/second_cube.tscn”)
var timer = Timer.new()
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
timer.wait_time = randf_range(0.5, 2.0)
timer.autostart = true
timer.one_shot = false
add_child(timer)
timer.timeout.connect(_on_Timer_timeout)
# Called every frame. ‘delta’ is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass
func _on_Timer_timeout():
var red_cube = cube.instantiate()
red_cube.set_script(load(“res://Scripts/CubeMovement.gd”))
red_cube.get_child(0).set_collision_layer_value(10, true)
add_child(red_cube)
var blue_cube = second_cube.instantiate()
blue_cube.set_script(load(“res://Scripts/CubeOnMove.gd”))
blue_cube.get_child(0).set_collision_layer_value(9, true)
add_child(blue_cube)
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
مدیریت کارآمد اشیاء بازی
سپس با حصول اطمینان از اینکه مکعبهایی که ضربه نمیخوردند باقی نمیمانند، مشکلات عملکرد بالقوه را حل کردم – آنها به طور خودکار تخریب میشوند تا همه چیز را روان نگه دارند. و درست مانند نسخه اصلی، فقط یک شمشیر با رنگ مناسب می تواند مکعب مربوطه خود را بشکند.
نتیجه:
ساخت این بازی الهام گرفته از بیت سابر در گودو سرگرم کننده بود. درک من از قابلیت های واقعیت مجازی در گودو را تقویت کرد. در حال حاضر، این جایی است که من در حال مکث هستم، اما برای ارتقای بیشتر بازی هیجانزده هستم. مراحل بعدی شامل یکپارچهسازی یک آهنگ موسیقی برای تعامل با بازیکنان و افزودن بافتهای جهتدار به هر مکعب برای نشان دادن جهت ضربه است – فلشها به سمت بالا، پایین، چپ یا راست نشان داده میشوند. علاوه بر این، من میخواهم که مکعبها به قطعات کوچکتر تقسیم شوند که با ضربه زدن پراکنده و ناپدید شوند.
آیا ایدهای قاتل برای بهتر کردن این موضوع دارید؟ آنها را در نظرات بگذارید!
بازی Beat Saber در Meta Quest 2 یک بازی هیجانانگیز است، اما صادقانه بگویم، بیش از 20 دقیقه من را با سردردی که برای مدتی درگیر میشود، عصبانی میکند. با این حال، این مانع من نشد که به ساختن نسخه خودم در گودو بپردازم. من قصد داشتم همان ریتم شدید برش و تاس را ثبت کنم. چالش این بود که گیم پلی بازی را تقلید کنم و آن را با تفاسیر فنی خودم آغشته کنم.
ساختمان:
راه اندازی شمشیرهای لیزری
من با ساخت شمشیرهای لیزری برای کنترلرهای VR شروع کردم. با استفاده از LineRenderer گودو، شمشیرهایی را که در امتداد محور z منفی کنترلکنندهها امتداد داشتند، کشیدم. دید هر شمشیر با دکمههای کنترلکننده مربوطه تغییر میکرد – 'A' برای سمت راست و 'X' برای چپ- و مطمئن میشد که فقط زمانی که من میخواهم با عناصر بازی تعامل داشته باشند.
اهداف مکعب پویا
سپس، مکعب ها. این بچه ها از دور شروع می کنند و به سمت شما زوم می کنند و رفلکس ها و ریتم شما را آزمایش می کنند. من آنها را برنامهریزی کردم که وقتی با شمشیر مورد اصابت قرار میگیرند، به هوا بریزند – درست به اندازه بیت سابر واقعی.
مرکزیت مجدد نمای بازیکن
یکی از ویژگیهای جالبی که میتوان اضافه کرد، تغییر مجدد دیدگاه بازیکن بود. به سیگنال “On Pose Recentered” OpenXR، فشار دادن و نگه داشتن دکمه Oculus اکنون نمای بازیکن را مستقیماً به یک مکعب ورودی میگیرد و آنها را کاملاً برای عمل در مرکز قرار میدهد.
# Handle OpenXR pose recentered signal
func _on_right_controller_button_pressed(name):
if name == "primary_click":
XRServer.center_on_hmd(XRServer.RESET_BUT_KEEP_TILT, true)
افزودن بازخورد صوتی
جلوه های صوتی بسیار مهم بود. من جلو رفتم و صداهای خنده دار بونگ را برای همراهی با هر تخریب مکعب یکپارچه کردم، چرا که نه؟ من فقط دارم لذت می برم. کاوش در پایگاههای دادههای صوتی رایگان، کلیپهای کاملی را برای من فراهم کرد که سپس با بازدیدهای مکعب همگامسازی کردم.
مکانیسم تخم ریزی مکعب
برای زنده نگه داشتن بازی، اسکریپت CubeSpawner را پیاده سازی کردم. این قطعه کوچک کد به طور تصادفی مکعب هایی را در فواصل زمانی بین 0.5 تا 2.0 ثانیه تولید می کند و تضمین می کند که گیم پلی غیرقابل پیش بینی و جذاب باقی می ماند.
extends WorldEnvironment
var cube = preload("res://SceneInstances/cube.tscn")
var second_cube = preload("res://SceneInstances/second_cube.tscn")
var timer = Timer.new()
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
timer.wait_time = randf_range(0.5, 2.0)
timer.autostart = true
timer.one_shot = false
add_child(timer)
timer.timeout.connect(_on_Timer_timeout)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass
func _on_Timer_timeout():
var red_cube = cube.instantiate()
red_cube.set_script(load("res://Scripts/CubeMovement.gd"))
red_cube.get_child(0).set_collision_layer_value(10, true)
add_child(red_cube)
var blue_cube = second_cube.instantiate()
blue_cube.set_script(load("res://Scripts/CubeOnMove.gd"))
blue_cube.get_child(0).set_collision_layer_value(9, true)
add_child(blue_cube)
مدیریت کارآمد اشیاء بازی
سپس با حصول اطمینان از اینکه مکعبهایی که ضربه نمیخوردند باقی نمیمانند، مشکلات عملکرد بالقوه را حل کردم – آنها به طور خودکار تخریب میشوند تا همه چیز را روان نگه دارند. و درست مانند نسخه اصلی، فقط یک شمشیر با رنگ مناسب می تواند مکعب مربوطه خود را بشکند.
نتیجه:
ساخت این بازی الهام گرفته از بیت سابر در گودو سرگرم کننده بود. درک من از قابلیت های واقعیت مجازی در گودو را تقویت کرد. در حال حاضر، این جایی است که من در حال مکث هستم، اما برای ارتقای بیشتر بازی هیجانزده هستم. مراحل بعدی شامل یکپارچهسازی یک آهنگ موسیقی برای تعامل با بازیکنان و افزودن بافتهای جهتدار به هر مکعب برای نشان دادن جهت ضربه است – فلشها به سمت بالا، پایین، چپ یا راست نشان داده میشوند. علاوه بر این، من میخواهم که مکعبها به قطعات کوچکتر تقسیم شوند که با ضربه زدن پراکنده و ناپدید شوند.
آیا ایدهای قاتل برای بهتر کردن این موضوع دارید؟ آنها را در نظرات بگذارید!