İçeriğe geç

UI / NUI kuralları

Her kaynağın kendi NUI sayfası vardır (ui_page 'html/index.html'). bs_ui HUD’dur, bildirimler ve paylaşılan parçalardır.

Aynı anda tek panel: bs:ui:opened / bs:ui:closed

Section titled “Aynı anda tek panel: bs:ui:opened / bs:ui:closed”

Paneliniz açıldığında bunu duyurursunuz. Diğer her panel bunu duyar ve kendini kapatır. Sizinki kapandığında bunu da duyurursunuz. bs_config’den gerçek kod:

local function close()
if not isOpen then return end
isOpen = false
SetNuiFocus(false, false)
SendNUIMessage({ action = 'close' })
TriggerEvent('bs:ui:closed', 'config')
end
local function open()
if isOpen then return close() end
isOpen = true
SetNuiFocus(true, true)
SendNUIMessage({ action = 'open', data = data })
TriggerEvent('bs:ui:opened', 'config')
end
-- another UI took over: step aside
AddEventHandler('bs:ui:opened', function(what)
if what ~= 'config' and isOpen then close() end
end)
AddEventHandler('onResourceStop', function(res)
if res == GetCurrentResourceName() and isOpen then
SetNuiFocus(false, false)
TriggerEvent('bs:ui:closed', 'config')
end
end)

Kurallar:

  • Her iki olayda da panel adınızı iletin. İşleyiciler bunu denetler; herhangi bir kapanışa tepki veren bir işleyici arazi haritasını aylarca bozdu.
  • Çifti her çıkışta eşleştirin: kapatma düğmesi, Esc, aç/kapa tuşu, başka bir arayüzün açılması, kaynak durması. Birini kaçırırsanız oyuncu fare imleciyle ve oyunsuz kalır.
  • opened’ı açıldıktan sonra duyurun ve kendi işleyicinizden kendinizi kapatın, başkalarının yapacağını varsaymayın.

/refreshui (bs_ui) panik düğmesidir: her şeyi kapatır, odağı bırakır ve nil ile bs:ui:closed tetikler.

-- client
TriggerEvent('bs:ui:notify', { type = 'info', title = 'Radio', message = 'Signal found.', duration = 3000 })
-- server
TriggerClientEvent('bs:ui:notify', src, { type = 'error', title = 'Denied', message = 'Nope.' })

Kodda kullanılan türler: info, success, error.

Sayfalar 1920x1080 için yerleştirilir. Her çözünürlüğe uymaları için paylaşılan ölçekleyiciyi dahil edin:

<script src="https://cfx-nui-bs_ui/html/shared/scale.js"></script>

<body>’yi transform ile ölçekler: --ui-scale = clamp(min(w/1920, h/1080), 0.6, 1.25). Oyuncular bunu ayarlardan geçersiz kılabilir (0.6 ile 1.4 arası).

Kullanırken bilinmesi gerekenler:

  • Sayfa CSS’inde vh/vw değerlerini calc(Nvh / var(--ui-scale, 1)) olarak yazın, böylece gerçek görünüm alanı oranları kalırlar.
  • clientX/clientY veya bir bounding rect’ten style.left/top ayarlayan JS, BSScale.get()’e bölmelidir. BSScale.w() / BSScale.h() yerel görünüm alanını verir.
  • <html data-bs-noscale> ile devre dışı bırakın.
  • Her sayfada html, body { background: transparent !important; }. Aksi halde oyunun üstünde siyah bir ekran olur.
  • Boştayken her karede NUI mesajı yok. Değişiklikte gönderin veya sınırlayın (drone HUD’u uçarken her 150 ms’de gönderir, bu yaklaşık üst sınırdır).
  • Palet, neredeyse siyah üzerinde kehribar / pas / kemik / toz. bs_ui CSS jetonlarını ve bs_menu/html/css/faction-hub.css dosyasını yeniden kullanın. Harici yazı tipi veya CDN yok; oyuncuların bunlara internet erişimi olmayabilir ve zaten bir gizlilik meselesidir.
  • Simgeler: bs_ui/html/js/icons.js içinde çizgi simgeler.
  • Sesler: bs_ui/html/js/sound.js konumsal sesleri yönetir (maxDistance, panning).