Tambahkan audio 2D

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

Audio 2D adalah suara non-arah yang tidak berasal dari lokasi tertentu, tetap sama terlepas dari posisi atau orientasi pendengar di ruang 3D. Ini berarti bahwa saat pemain memindahkan pendengar mereka di sekitar lingkungan, mereka dapat secara konsisten mendengar audio 2D dari mana saja mereka berbalik.

Menggunakan file Gingerbread House - Start .rbxl sebagai tempat awal dan Gingerbread House - Complete Audio sebagai referensi, tutorial ini menunjukkan kepada Anda cara menambahkan audio 2D baik yang berulang maupun satu kali ke dalam permainan Anda, termasuk panduan tentang:

  • Musik latar yang berulang yang diputar segera setelah pemain terhubung ke server.
  • Memicu audio untuk memberikan umpan balik instan kepada pemain sesuai dengan tujuan permainan mereka.
  • Mengaktifkan berbagai suara untuk menunjukkan interaksi antarmuka pengguna yang berbeda.

Jika pada titik mana pun Anda terjebak dalam proses, Anda dapat menggunakan Gingerbread House - Complete Audio sebagai referensi untuk membandingkan kemajuan Anda.

Objek audio 2D

Untuk membuat audio non-arah, penting untuk memahami objek audio yang akan Anda kerjakan sepanjang tutorial ini. Ada tiga jenis utama objek audio untuk audio 2D:

  • Objek AudioPlayer memuat dan memutar file audio.
  • Objek AudioDeviceOutput adalah perangkat keras fisik di dunia nyata, seperti speaker atau headphone.
  • Wires membawa aliran audio dari satu objek ke objek lainnya.

Semua objek audio ini bekerja sama untuk membawa suara dari pemutaran file ke perangkat keras setiap pemain. Mari kita lihat bagaimana ini bekerja dalam praktik menggunakan contoh seorang pemain yang mengenakan headset saat bermain game dengan laptop mereka:

  • AudioPlayer memuat ID aset audio 127645268874265 ke dalam permainan untuk suara pembelian mata uang.
  • Sebuah Wire membawa aliran dari AudioPlayer ke AudioDeviceOutput sehingga aliran keluar dari headset pemain.
  • Objek AudioDeviceOutput membawa suara ke speaker fisik pemain, atau dalam hal ini, headphone mereka.

Bagian berikut menyelami lebih dalam dan merujuk pada objek-objek ini saat Anda belajar bagaimana memutar audio 2D baik yang berulang maupun satu kali. Saat Anda meninjau objek-objek ini dengan teknik yang akan datang, Anda dapat lebih akurat memprediksi bagaimana menangkap dan memberi suara dari permainan kepada pemain.

Audio berulang

Audio 2D berulang, atau audio non-arah yang diulang tanpa henti segera setelah pemain terhubung ke server, adalah teknik desain suara umum untuk memberikan latar belakang auditori yang kohesif terlepas dari apa yang dilakukan pemain atau di mana mereka berada dalam ruang 3D. Selain itu, audio 2D berulang memastikan bahwa permainan Anda tidak pernah sepenuhnya hening, yang dapat membingungkan dan mengalihkan perhatian pemain dari tujuan mereka.

Untuk mendemonstrasikan konsep ini, tinjau bagaimana audio 2D berikut secara signifikan meningkatkan kualitas dari contoh Hazardous Space Station. Tanpa musik latar, stasiun luar angkasa terasa kosong dan tidak bernyawa. Namun, ketika stasiun luar angkasa menyertakan musik latar, stasiun luar angkasa terasa menakutkan dan berbahaya, menambah suasana spooky secara keseluruhan.

Tanpa audio 2D berulang
Dengan audio 2D berulang

Audio berulang sangat berguna untuk menetapkan bagaimana Anda ingin pemain merasa segera setelah mereka bergabung dengan permainan Anda. Misalnya, contoh ini bertujuan untuk memberikan pemain petualangan ceria di negeri musim dingin, jadi menggunakan trek audio yang ceria untuk mempengaruhi suasana hati mereka secara positif saat mereka memasuki lingkungan. Untuk melihat seberapa berpengaruh teknik ini, pertimbangkan bagaimana pengalaman pemain akan berubah jika Anda mengganti audio berulang dengan trek metal.

Untuk mereproduksi audio 2D berulang dalam file tempat Gingerbread House - Complete Audio:

  1. Aktifkan pendengar default yang terpasang pada karakter pemain Anda.

    1. Di jendela Explorer, pilih SoundService.
    2. Di jendela Properties, atur DefaultListenerLocation ke Character. Ketika Anda menjalankan permainan, mesin secara otomatis membuat AudioDeviceOutput di bawah SoundService.
  2. Di jendela Explorer, navigasikan ke SoundService, kemudian:

    1. Masukkan objek AudioPlayer untuk membuat sumber audio.
    2. Masukkan objek AudioDeviceOutput untuk membuat speaker yang memutar sepanjang permainan.
    3. Masukkan objek Wire untuk membawa aliran dari pemutar audio ke speaker.
  3. Pilih AudioPlayer, kemudian di jendela Properties,

    1. Atur AssetID ke rbxassetid://1841461968 untuk memutar trek audio yang ceria.
    2. Aktifkan Looping sehingga audio diulang tanpa henti.
    3. Atur Volume ke 0.2 untuk memutar audio pada volume rendah sehingga Anda masih dapat mendengar sumber audio lainnya dalam permainan.
  4. Pilih Wire, kemudian di jendela Properties,

    1. Atur SourceInstance ke AudioPlayer baru Anda untuk menentukan bahwa Anda ingin kabel membawa audio dari pemutar audio spesifik ini.
    2. Atur TargetInstance ke AudioDeviceOutput baru Anda untuk menentukan bahwa Anda ingin kabel membawa audio ke speaker spesifik ini.
  5. Kembali ke jendela Explorer, masukkan Script ke dalam AudioPlayer, ganti namanya menjadi LoopBackgroundMusic, atur properti RunContext ke Client, kemudian tempelkan kode berikut ke dalam skrip:

    local audioPlayer = script.Parent
    audioPlayer:Play()

    Skrip ini dimulai dengan mendeklarasikan variabel untuk mewakili induk skrip AudioPlayer. Skrip kemudian mengatur sumber audio untuk diputar dari saat pemain bergabung dengan permainan hingga saat mereka keluar dari permainan.

  6. Uji permainan untuk mendengar musik latar yang berulang.

Audio satu kali

Audio 2D satu kali, atau audio non-arah yang diputar sekali pada waktu dan posisi tertentu kecuali pemain memicunya lagi, memberikan konteks penting kepada pemain tentang apa pun yang tidak ingin mereka lewatkan. Menggunakan jenis umpan balik auditori ini dalam permainan Anda sangat penting karena memberikan respons instan dan jelas terhadap fungsi permainan yang penting dan tindakan pemain, seperti memulai pertarungan bos atau kehilangan sejumlah besar kesehatan.

Bagian berikut memberikan detail implementasi untuk skenario permainan umum di mana pemain membutuhkan umpan balik non-arah yang tepat waktu, termasuk umpan balik permainan, interaksi elemen UI, dan narasi suara untuk tutorial.

Umpan balik permainan

Saat pemain maju melalui permainan Anda, penting bahwa mereka menerima umpan balik auditori instan tentang status apa pun yang memengaruhi permainan mereka, seperti skor, kesehatan, atau kemajuan level. Karena jenis audio ini langsung terhubung dengan tujuan pemain, penting bahwa suara-suara ini jelas, terdengar, dan menyampaikan informasi yang berguna dan akurat.

Untuk mendemonstrasikan konsep ini, mari kita tinjau audio 2D satu kali berikut dari template Platformer yang diputar saat pemain melompat dan mengumpulkan koin:

  • Suara whoosh yang ringan diputar segera setelah pemain menekan tombol lompat di perangkat mereka.
  • Suara ding tinggi dan suara koin yang bergetar diputar segera setelah karakter pemain menyentuh koin.

Kedua suara ini langsung dikenali dalam konteks ruang 3D, dan membantu pemain memahami keberhasilan tindakan mereka tanpa bergantung hanya pada petunjuk visual.

Ketika Anda memutar beberapa suara sekaligus, suara tertentu mungkin lebih penting untuk didengar pemain daripada yang lain. Dalam hal ini, suara pengumpulan koin menyampaikan informasi permainan yang lebih berharga daripada suara lompat, jadi permainan memutarnya pada volume yang sedikit lebih tinggi. Namun, tidak ada standar atau aturan untuk mencapai campuran yang hebat, jadi sesuaikan suara dalam permainan Anda untuk mencerminkan apa yang Anda rasa paling penting.

Misalnya, contoh ini mencakup berbagai pemicu audio di seluruh permainan, tetapi tidak semuanya memiliki tingkat kepentingan yang sama untuk memahami tujuan utama permainan: mengumpulkan gumdrops untuk membuka rumah jahe. Untuk memastikan bahwa pemain menyadari apa yang perlu mereka lakukan, contoh ini melipatgandakan amplitudo umpan balik auditori setiap kali pemain mengumpulkan gumdrop.

Untuk mereproduksi audio umpan balik status satu kali dalam file tempat Gingerbread House - Complete Audio:

  1. Di jendela Explorer, navigasikan ke WorkspaceGumdropsGumdrop, kemudian:

    1. Masukkan objek AudioPlayer untuk membuat sumber audio.
    2. Masukkan objek AudioDeviceOutput untuk membuat speaker yang memutar sepanjang permainan.
    3. Masukkan objek Wire untuk membawa aliran dari pemutar audio ke speaker.
  2. Pilih AudioPlayer, kemudian di jendela Properties,

    1. Atur AssetID ke rbxassetid://9113723699 untuk memutar trek audio mengunyah yang lembut.
    2. Atur TimePosition ke 0.15 untuk memulai trek audio lebih dekat ke suara mengunyah yang sebenarnya.
    3. Atur Volume ke 3 untuk memutar audio pada volume tinggi sehingga Anda mendengar suara gumdrop di atas sumber audio lainnya dalam permainan.
  3. Pilih Wire, kemudian di jendela Properties,

    1. Atur SourceInstance ke AudioPlayer baru Anda untuk menentukan bahwa Anda ingin kabel membawa audio dari pemutar audio spesifik ini.
    2. Atur TargetInstance ke AudioDeviceOutput baru Anda untuk menentukan bahwa Anda ingin kabel membawa audio ke speaker spesifik ini.
  4. Duplikat Gumdrop hingga Anda memiliki tiga gumdrops, kemudian sebar mereka di sekitar lingkungan.

  5. Kembali ke jendela Explorer, navigasikan ke ServerScriptService, kemudian masukkan Script, ganti namanya menjadi GumdropService, atur properti RunContext ke Server, kemudian tempelkan kode berikut ke dalam skrip:

    -- Menginisialisasi layanan
    local Workspace = game:GetService("Workspace")
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    local TweenService = game:GetService("TweenService")
    -- Modul
    local Leaderboard = require(ServerStorage.Leaderboard)
    local PlayerData = require(ServerStorage.PlayerData)
    -- Variabel
    local gumdropsFolder = Workspace.Gumdrops
    local gumdrops = gumdropsFolder:GetChildren()
    local GUMDROP_KEY_NAME = PlayerData.GUMDROP_KEY_NAME
    local GUMDROP_AMOUNT_TO_ADD = 1
    local function updatePlayerGumdrops(player, updateFunction)
    -- Memperbarui tabel gumdrop
    local newGumdropAmount = PlayerData.updateValue(player, GUMDROP_KEY_NAME, updateFunction)
    -- Memperbarui papan peringkat gumdrop
    Leaderboard.setStat(player, GUMDROP_KEY_NAME, newGumdropAmount)
    -- Memeriksa apakah pemain telah mengumpulkan tiga gumdrops
    if newGumdropAmount >= 3 then
    -- Memutar audio acara pintu saat pemain mengumpulkan tiga gumdrops
    local audioPlayer = Workspace.Door.AudioPlayer
    audioPlayer:Play()
    -- Menganimasi pintu untuk bergerak ke bawah
    local doorPart = Workspace.Door
    local tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Linear)
    local tween = TweenService:Create(doorPart, tweenInfo, {Position = doorPart.Position + Vector3.new(0, -15, 0)})
    tween:Play()
    end
    end
    -- Mendefinisikan penangan acara
    local function onGumdropTouched(otherPart, gumdrop)
    if gumdrop:GetAttribute("Active") then
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    -- Pemain menyentuh gumdrop
    local audioPlayer = gumdrop.AudioPlayer
    audioPlayer:Play()
    gumdrop.Transparency = 1
    gumdrop:SetAttribute("Active", false)
    updatePlayerGumdrops(player, function(oldGumdropAmount)
    oldGumdropAmount = oldGumdropAmount or 0
    return oldGumdropAmount + GUMDROP_AMOUNT_TO_ADD
    end)
    end
    end
    end
    -- Mengatur pendengar acara
    for _, gumdrop in gumdrops do
    gumdrop:SetAttribute("Active", true)
    gumdrop.Touched:Connect(function(otherPart)
    onGumdropTouched(otherPart, gumdrop)
    end)
    end

    Skrip ini dimulai dengan menginisialisasi layanan Workspace, Players, ServerStorage, dan TweenService sehingga dapat merujuk pada anak-anak dan fungsionalitas mereka. Kemudian, ia memerlukan modul Leaderboard dan PlayerData di ServerStorage; modul-modul ini bertanggung jawab untuk membuat dan memperbarui papan peringkat di sudut kanan atas layar yang melacak jumlah gumballs yang dikumpulkan pemain di lingkungan.

    Fungsi updatePlayerGumdrops dalam skrip ini sebagian besar bertanggung jawab untuk memperbarui papan peringkat setiap kali pemain mengumpulkan gumdrop, dan menunggu saat mereka mengumpulkan semua tiga gumdrops sehingga dapat memicu suara posisi dan animasi untuk pintu rumah jahe. Untuk informasi lebih lanjut tentang bagian skrip ini, lihat Tambahkan audio 3D - Umpan balik acara.

    Fungsi onGumdropTouched dalam skrip ini adalah tempat sebagian besar pekerjaan terjadi untuk memicu audio 2D untuk umpan balik permainan, dan mengambil dua argumen:

    • otherPart - Sebuah bagian yang bertabrakan dengan gumdrop.
    • gumdrop - Sebuah bagian bulat yang mewakili gumdrop.

    Ketika apa pun bertabrakan dengan bagian gumdrop, skrip pertama-tama memeriksa untuk melihat apakah gumdrop aktif. Jika ya, ia memeriksa untuk memverifikasi bahwa objek yang bertabrakan adalah pemain. Jika ya, skrip kemudian:

    • Memutar trek audio 2D dari pemutar audio.
    • Mengubah gumdrop menjadi tidak terlihat.
    • Menonaktifkan gumdrop sehingga pemain tidak dapat berinteraksi dengan gumdrop yang tidak terlihat.
    • Memperbarui papan peringkat untuk pemain yang menyentuh gumdrop.

    Akhirnya, skrip mengatur pendengar acara sehingga untuk setiap gumdrop, ia menghubungkan fungsi ke acara Touched, yang memanggil fungsi onGumdropTouched ketika pemain menyentuh gumdrop.

  6. Uji permainan untuk mendengar suara mengunyah setelah Anda mengumpulkan gumdrop.

Interaksi UI

Ketika pemain berinteraksi dengan elemen antarmuka pengguna (UI) Anda, seperti mengarahkan kursor ke atas kotak centang atau memilih tombol pembelian, penting untuk memberikan umpan balik instan sehingga mereka secara intuitif memahami bagaimana mereka berinteraksi dengan UI Anda. Misalnya, banyak desainer mengubah karakteristik visual UI ketika pemain mengaktifkan atau menonaktifkan pengaturan untuk mengkomunikasikan status pengaturan tersebut.

Namun, bagi pemain dengan gangguan penglihatan di mana perubahan warna atau animasi lebih sulit untuk dipahami sendiri, berguna untuk memberikan beberapa bentuk umpan balik sensorik untuk interaksi UI Anda sehingga tetap dapat diakses dan intuitif bagi sebanyak mungkin pemain. Untuk memperluas konsep ini, mari kita pertimbangkan keadaan UI berikut yang penting untuk tombol pembelian template UGC Homestore:

  • Dalam fokus - Menunjukkan bahwa pemain sedang menyoroti elemen UI dalam persiapan untuk memilihnya.
  • Saat melayang - Menunjukkan bahwa pemain sedang melayang di atas elemen UI dengan kursor mereka.
  • Terpilih - Menunjukkan bahwa pemain telah memilih elemen UI melalui input mereka.

Ketiga interaksi ini sangat penting untuk alur pengguna utama template yang melibatkan pemain menjelajahi, memilih, dan membeli pakaian dan aksesori avatar, jadi sangat penting bahwa tidak ada yang bingung tentang cara berinteraksi dengan UI. Untuk mempersiapkan pemain untuk sukses, template ini memberikan umpan balik visual dan auditori untuk setiap interaksi UI.

Umpan Balik Visual
Tampilan default
Dalam keadaan fokus
Saat melayang
Keadaan terpilih

Untuk memberikan contoh bagaimana Anda dapat mengonfigurasi beberapa bentuk umpan balik sensorik, contoh ini memberikan umpan balik visual dan auditori setiap kali pemain menekan tombol peppermint di layar. Ketika pemain tidak berinteraksi dengan tombol, tombol tersebut terlihat seperti permen peppermint biasa, tetapi ketika mereka menekan tombol, contoh ini:

  • Memutar trek audio jingle yang menyenangkan.
  • Mewarnai tombol dengan nuansa teal.
  • Menggerakkan tombol sedikit ke bawah di layar.

Dari sini, Anda dapat menghubungkan interaksi ini ke berbagai tindakan permainan yang berguna, seperti membuka menu atau membeli item.

Tampilan default
Keadaan ditekan

Untuk mereproduksi audio interaksi UI satu kali dalam file tempat Gingerbread House - Complete Audio:

  1. Di jendela Explorer, navigasikan ke StarterGui2DAudioButton, kemudian:

    1. Masukkan objek AudioPlayer untuk membuat sumber audio.
    2. Masukkan objek AudioDeviceOutput untuk membuat speaker yang memutar sepanjang permainan.
    3. Masukkan objek Wire untuk membawa aliran dari pemutar audio ke speaker.
  2. Pilih AudioPlayer, kemudian di jendela Properties, atur AssetID ke rbxassetid://3422389728 untuk memutar trek audio jingle retro.

  3. Pilih Wire, kemudian di jendela Properties,

    1. Atur SourceInstance ke AudioPlayer baru Anda untuk menentukan bahwa Anda ingin kabel membawa audio dari pemutar audio spesifik ini.
    2. Atur TargetInstance ke AudioDeviceOutput baru Anda untuk menentukan bahwa Anda ingin kabel membawa audio ke speaker spesifik ini.
  4. Kembali ke jendela Explorer, masukkan LocalScript ke dalam 2DAudioButton, ganti namanya menjadi PlayAudioWhenPressed, kemudian tempelkan kode berikut ke dalam skrip:

    local TweenService = game:GetService("TweenService")
    local buttonGui = script.Parent
    local buttonImageButton = buttonGui.ButtonFrame.ButtonImageButton
    local buttonAudioPlayer = buttonGui.AudioPlayer
    local tweenInfo = TweenInfo.new(.2, Enum.EasingStyle.Exponential)
    local buttonTweenByIsPressed = {
    -- Ditekan
    [true] = TweenService:Create(buttonImageButton, tweenInfo, {
    Position = buttonImageButton.Position + UDim2.fromScale(0, .1),
    ImageColor3 = Color3.fromRGB(117, 255, 255),
    }),
    -- Default
    [false] = TweenService:Create(buttonImageButton, tweenInfo, {
    Position = buttonImageButton.Position,
    ImageColor3 = Color3.fromRGB(255, 255, 255),
    }),
    }
    local function onIsPlayingChanged()
    local isPlaying = buttonAudioPlayer.IsPlaying
    local tween = buttonTweenByIsPressed[isPlaying]
    tween:Play()
    end
    onIsPlayingChanged()
    buttonAudioPlayer:GetPropertyChangedSignal("IsPlaying"):Connect(onIsPlayingChanged)
    buttonAudioPlayer.Ended:Connect(onIsPlayingChanged)
    buttonImageButton.Activated:Connect(function(_hit)
    buttonAudioPlayer:Play()
    end)

    Skrip ini dimulai dengan mendapatkan:

    • TweenService sehingga dapat menganimasi elemen UI.
    • Induk skrip 2DAudioButton ScreenGui objek.
    • Permen peppermint ImageButton.
    • Pemutar audio yang relevan dengan trek audio jingle Anda.

    Skrip kemudian mendefinisikan:

    • Objek TweenInfo yang menentukan bahwa animasi tombol akan diputar dengan gaya animasi eksponensial.
    • Dua tween yang mewakili keadaan tombol yang ditekan atau tidak ditekan.
      • Keadaan ditekan true menggerakkan tombol sedikit ke bawah di layar dan mewarnainya dengan nuansa teal.
      • Keadaan tidak ditekan false menggerakkan tombol kembali ke posisi aslinya di layar dan menghapus nuansa sebelumnya.

    Sisa skrip adalah tempat sebagian besar pekerjaan terjadi untuk memicu umpan balik interaksi UI 2D, jadi mari kita tinjau bagaimana fungsi onIsPlayingChanged dan pendengar acara bekerja sama untuk alur pengguna UI:

    1. buttonImageButton.Activated mendengarkan pemain untuk mengklik tombol, kemudian memanggil fungsi Play() untuk mulai memutar audio yang terkait dari pemutar audio. Proses ini mengubah properti AudioPlayer.IsPlaying dari false menjadi true.
    2. buttonAudioPlayer:GetPropertyChangedSignal("IsPlaying") mendengarkan perubahan properti IsPlaying pemutar audio, kemudian memanggil fungsi onIsPlayingChanged.
    3. Fungsi onIsPlayingChanged menggunakan informasi ini untuk memicu tween yang mengubah penampilan visualnya di layar.
    4. Untuk mencegah pemain secara tidak sengaja memulai ulang audio jika mereka mengklik tombol dengan cepat, buttonAudioPlayer.Ended mendengarkan pemutar audio untuk selesai memutar sebelum memanggil fungsi onIsPlayingChanged lagi.

    Penting untuk dicatat bahwa acara onIsPlayingChanged hanya dipicu ketika berubah dari false menjadi true, yang berarti bahwa tidak dipicu ketika berubah dari true menjadi false. Ini adalah perilaku yang dimaksudkan karena komplikasi dengan waktu mereplikasi properti dari server ke klien. Karena ini, acara Ended disediakan dan didengarkan dalam contoh ini untuk mencakup kedua kasus tersebut.

  5. Uji permainan untuk mendengar jingle setiap kali Anda menekan tombol di layar.

©2026 Roblox Corporation. Roblox, logo Roblox, dan Powering Imagination termasuk dalam merek dagang kami yang terdaftar dan tidak terdaftar di AS dan negara lainnya.