FiveM'de özel sesler çalin: NUI audio, mesafeye göre ses, formatlar

FiveM'de özel sesler çalin NUI audio ile (SendNUIMessage ve HTML audio öğesi), mesafeye dayalı ses, OGG dosyaları, xsound ve yerleşik ses bankaları.

Bir kapı zili, sireni veya bildirim gibi bir ses dosyanız var ve onu bir betikten çalmak istiyorsunuz. FiveM'nin özel ses dosyaları için basit yerleşik bir işlevi yoktur, bu nedenle olağan cevap NUI'dir: kaynakta gizli bir web sayfası, bir istemci betiği bunu çalması istediğinde dosyayı çalar. Bu, interact-sound tarzındaki kaynakların nasıl çalıştığıdır. Aşağıda kod, mesafe sesi, formatlar ve diğer seçenekleri bulabilirsiniz.

Nasıl çalışır

  1. Kaynağın, küçük bir betiği olan bir HTML sayfası (ui_page) vardır.
  2. İstemci betiği, SendNUIMessage ile sayfaya bir ileti gönderir.
  3. Sayfa, dosya ile bir Audio nesnesi oluşturur ve bunu çalar.

Sayfa görünmez kalabilir ve fare odağa gerek duymaz.

Kaynak

text
resources/[mic]/my_sounds/
  fxmanifest.lua
  client.lua
  html/
    index.html
    sounds/
      doorbell.ogg
      alarm.ogg
lua
-- fxmanifest.lua
fx_version 'cerulean'
game 'gta5'

ui_page 'html/index.html'

files {
    'html/index.html',
    'html/sounds/*.ogg',
}

client_script 'client.lua'

Ses dosyaları files'de olmalı, yoksa sayfa bunları yükleyemez.

HTML sayfası

html
<!DOCTYPE html>
<html>
<body>
<script>
  window.addEventListener('message', (event) => {
    const data = event.data
    if (data.action !== 'play') return

    const audio = new Audio('./sounds/' + data.file + '.ogg')
    audio.volume = Math.min(Math.max(data.volume ?? 1.0, 0), 1)
    audio.play().catch((err) => console.log('sound error', err))
  })
</script>
</body>
</html>

audio.volume 0.0'dan 1.0'ye gider. Bu aralığın dışındaki değerler bir hataya neden olur, bu nedenle kod bunu sıkıştırır.

İstemci betiği

lua
local function playSound(file, volume)
    SendNUIMessage({
        action = 'play',
        file = file,
        volume = volume or 1.0,
    })
end

RegisterNetEvent('my_sounds:play', function(file, volume)
    playSound(file, volume)
end)

exports('PlaySound', playSound)

Şimdi başka bir istemci betiği exports.my_sounds:PlaySound('doorbell', 0.6) çağırabilir, sunucu TriggerClientEvent('my_sounds:play', source, 'doorbell', 0.6) bir oyuncuya veya hepsi için -1 gönderebilir.

İpucu: Oyuncu tarafından her zaman duyması gereken bir ses (bildirim, telefon çalan sesi) için bu kadar yeterlidir. Bir yere ait olan bir ses için, aşağıdaki mesafe sürümünü kullanın.

Mesafeye dayalı ses

Bir binada bir alarm gibi bir noktada bir ses için, sunucu koordinatları gönderir ve her istemci ne kadar gürültülü olduğuna karar verir:

lua
-- client.lua
RegisterNetEvent('my_sounds:playAt', function(file, coords, maxDistance, baseVolume)
    local pos = GetEntityCoords(PlayerPedId())
    local dist = #(pos - vec3(coords.x, coords.y, coords.z))

    if dist >= maxDistance then return end

    local volume = (1.0 - dist / maxDistance) * (baseVolume or 1.0)
    playSound(file, volume)
end)
lua
-- server.lua: everyone gets it, only players in range hear it
TriggerClientEvent('my_sounds:playAt', -1, 'alarm', vec3(120.0, -1300.0, 29.0), 40.0, 1.0)

Bu, sesin başlamasında mesafeyi bir kez kontrol eder. Oyuncu hareketi yapan uzun bir ses için, konumu aralıklarla tekrar gönderin veya ses nesnesini sayfada tutun ve istemci yeni değerleri gönderirken ses seviyesini güncelleyin. Hareketli bir aracı izlemesi gereken bir ses, sonraki bölümde olduğu gibi hazır bir kitaplığın yardımcı olduğu yerdir.

Sunucuyu neyi tetikleyene kim karar veriyor üzerinde kontrolde tutun. İstemcilerin play for everyone olayı göndermesine izin verirseniz, herhangi bir hileci tüm sunucuya sesler gönderebilir. Bkz. server events and security.

Dosya formatları ve boyut

  • OGG: en iyi varsayılan, küçük ve iyi kalite.
  • MP3: da iyidir ve bulmak kolaydır.
  • WAV: çalışır, ancak büyüktür. Yalnızca çok kısa efektler için kullanın.

files'deki her dosya her oyuncu tarafından indirilir, bu nedenle onu kısa, efektler için mono ve sıkıştırılmış tutun. Dosyanın başında sessizliği kırpın: oyunda duyduğunuz bir gecikme genellikle bundan gelir. Toplam büyükse, diğer varlıklar için de aynı uyarı geçerlidir: bkz. oversized assets.

xsound ve diğer kütüphaneler

Sayfayı kendiniz yazmak yerine, xsound gibi bir ses kütüphanesi kullanabilirsiniz. Bir dosyadan veya URL'den bir konumda veya bir öğede ses çalar ve ses seviyesini ve konumu daha sonra değiştirebilir, bu da bir barında müzik veya oyuncuyu izleyen bir boom kutusu için uygun. Sürümler arasında farklılık gösterdiği için tam dışa aktarımlar için README'ini okuyun. Fikir aynıdır: gizli bir NUI sayfası sesi çalar, bir istemci betiği onu kontrol eder.

Yerleşik sesler ve ses bankaları

Oyunun kendi sesleri başka bir seçenektir. PlaySoundFrontend veya PlaySoundFromCoord gibi yerleşik işlevlerle, sesin adı ve seti ile çalınırlar, sizden dosya gerektirmezler. Oyunun ses sistemine kendi seslerinizi eklemek de mümkündür, ses banka dosyaları ve ses için data_file satırları ile, ancak kendi araçlarıyla uzmanlaşmış bir işdir ve kırılması kolaydır. Çoğu sunucu için NUI sesi daha basit ve yeterlidir.

Yaygın sorunlar

  • Hiç ses yok. Dosya adını kontrol edin ve dosyanın files'de olduğundan emin olun. Geliştirici araçlarınız varsa oyunda NUI'yi açın ve 404 için konsolu okuyun.
  • Ses sadece bir kez çalınır. Her seferinde yukarıdaki kodda olduğu gibi yeni bir Audio nesnesi oluşturun veya tutulan biri üzerinde currentTime sıfırlayın.
  • Çok yüksek veya çok sessiz. Sesi 0.0 ile 1.0 arasında tutun ve varsayılan olarak düşük ayarlayın.
  • Kaynak yeniden başlatıldığında ses kesiliyor. Sayfa kaynakla yeniden yükleniyor. Bu bekleniyor.
  • interact-sound kullanan bir betik başarısız olur. Bu adı bekleyen kaynakların aynı ada ve dışa aktarımlara sahip bir kaynakı gerekir. Yeniden adlandırmadan önce betiğin ne istediğini kontrol edin.

Kontrol listesi

Belirtisi Çözüm
Hiçbir şey çalmaz Dosyaları files'e koyun ve ui_page satırını kontrol edin
Yanlış yol HTML sayfası göreceli ./sounds/<name>.ogg kullanın
Çok yüksek audio.volume'ü 0 ile 1 arasında sıkıştırın ve varsayılanı düşürün
Ses mesafe ile solması gerekir Koordinatları gönderin ve ses seviyesini istemcide hesaplayın
İndirme yavaş Kısa OGG dosyalarını kullanın ve sıkıştırın
Hareketli kaynak (araç) xsound gibi bir kütüphane kullanın veya oyuncu hareket ettikçe ses seviyesini güncelleyin

Kısa yanıtlar

Hangi ses formatını kullanmalıyım?

OGG iyi bir varsayılandır: küçük dosyalar ve oyunun tarayıcı tarafından iyi desteklenmiş. MP3 de çalışır. Sesli sesleri kaçının, çünkü dosyalar büyüktür ve her oyuncu onları indirir.

Ses çalmak için SetNuiFocus gerekli mi?

Hayır. NUI'den ses çalmak odak gerektirmez ve görünür arayüz gerektirmez, yalnızca ses koduyla yüklenen ui_page gerekir.

Oyuncu uzak olduğunda bir sesi nasıl daha sessiz yapabilirim?

Ses koordinatlarını istemciye gönderin, oyuncuya olan mesafeyi ölçün ve ses seviyesini bundan ayarlayın, örneğin yakında 1'den maksimum mesafede 0'a doğrusal.

Bu sorunu yaşatmayan scriptler

Arcade MachinesGerçek kabinlerde oynanabilir yedi arcade oyunu; skor tabloları ve bahislerle.Scripti gör →Mic PhoneTablete dönüşen katlanabilir bir telefon; oyuncunun gerçek telefonuna da taşınır.Scripti gör →Crypto MiningBir depo alın, rigleri parça parça kurun ve sürekli hareket eden bir piyasada coin kazın.Scripti gör →

Okumaya devam edin