سیستم باس صوتی داخلی Godot 4 قدرتمند است، اما سطحی پایین دارد: کنترل صدا، افکت و مسیریابی کانال را در اختیارتان میگذارد، اما مفهومی از «وضعیتهای بازی» یا کراسفید بین آنها ندارد. در این آموزش، این لایه را از صفر میسازیم؛ با استفاده از قطعهای خروجیگرفتهشده از Mowjera، به یک اتولود (autoload) قابلاستفادهی مجدد بهنام AudioManager میرسیم که در پروژههای بعدیتان هم به کارتان میآید.
در پایان این آموزش به چه چیزی میرسید
یک سینگلتون (اتولود) که فقط یک تابع بیرون میدهد — transition_to(state_name) — و کراسفید بین هر تعداد وضعیت موسیقاییِ لوپشونده را با دقت نمونه (sample-accurate) و بدون کوچکترین درزی در صدا مدیریت میکند.
گام ۱: خروجی گرفتن از یک قطعه برای Godot
از صفحهی جزئیات هر قطعه در Mowjera، روی دکمهی «دریافت بسته» (Get bundle) کلیک کنید. فایل ZIP شامل یک پوشهی godot/ با فایل Mowjera.gd و یک پوشهی stems/ با یک فایل WAV برای هر ترک در هر وضعیت است:
Mowjera_MyScore/
godot/
Mowjera.gd
stems/
Explore_melody.wav
Explore_bass.wav
Combat_melody.wav
Combat_bass.wav
...گام ۲: ایمپورت فایلهای صوتی با لوپ فعال
Godot بهطور پیشفرض فایلهای WAV را لوپ نمیکند. برای هر stem:
۱. فایل را در پنل FileSystem انتخاب کنید. ۲. تب Import را باز کنید. ۳. در بخش Loop Mode، گزینهی Forward را انتخاب کنید. ۴. روی Reimport کلیک کنید.
فراموشکردن همین یک گام، رایجترین دلیلی است که یک ترک «لوپشونده» هر بار تکرار میشود، یک کلیک شنیدنی دارد.
گام ۳: افزودن اتولود
۱. فایل godot/Mowjera.gd را در پوشهی scripts/ پروژهتان کپی کنید. ۲. به مسیر Project → Project Settings → Autoload بروید. ۳. اسکریپت را اضافه کنید و نامش را AudioManager بگذارید.
گام ۴: فراخوانی ترنزیشنها از کد گیمپلی
func _on_enemy_spotted():
AudioManager.transition_to("Combat")
func _on_area_cleared():
AudioManager.transition_to("Explore")
func _on_boss_defeated():
AudioManager.transition_to("Victory")اتولود، محوشدن نودهای AudioStreamPlayer وضعیت قبلی و اوجگرفتن نودهای وضعیت جدید را مدیریت میکند؛ زمانبندی این کار دقیقاً روی مرز میزان بعدی، بر اساس BPM قطعهتان انجام میشود — همان منطق کراسفیدی که Mowjera بهصورت زنده در ادیتور مرورگر پیشنمایش میدهد.
نکات و مشکلات رایج مخصوص Godot
- AudioStreamPlayer در برابر AudioStreamPlayer2D/3D: برای موسیقی پسزمینهی غیرمکانی (non-positional)، از نود سادهی
AudioStreamPlayerاستفاده کنید، نه نسخههای 2D/3D — آنها بر اساس فاصله صدا را تضعیف میکنند که برای موسیقی پسزمینه نمیخواهید. - مسیریابی باسها: همهی پلیرهای موسیقی را به یک باس اختصاصی بهنام «Music» متصل کنید (نه «Master»)، تا بازیکن بتواند در منوی تنظیمات، صدای موسیقی و افکتها را جدا از هم کنترل کند.
- قالبهای اکسپورت: فایلهای WAV میتوانند حجم نسخهی نهایی بازیتان را بهشدت بالا ببرند. برای نسخهی release، بهتر است stemها را با فرمت Ogg Vorbis و کیفیت ۰.۷ دوباره اکسپورت بگیرید — ایمپورتر Godot خودش تبدیل را انجام میدهد و لوپ هم درست کار میکند.
تست کراسفید
صحنهتان را اجرا کنید، یک تغییر وضعیت را trigger کنید و با هدفون گوش بدهید. اگر برای کسری از ثانیه، پیش از محوشدن کامل وضعیت قبلی، ملودی را «دوتایی» شنیدید، طبیعی است — یعنی کراسفید دارد درست کار میکند. اما اگر یک قطع ناگهانی یا کلیک شنیدید، بررسی کنید که stemهای هر دو وضعیت دقیقاً BPM و طول لوپ یکسانی داشته باشند (Mowjera این را بهصورت خودکار تضمین میکند؛ ویرایش دستی stemها این تضمین را ندارد).
قطعات تطبیقی موجود در مارکتپلیس Mowjera را ببینید — همهی آنها با یک بستهی Godot آماده برای همین گردشکار عرضه میشوند.