FiveM NUI'yi hata ayıklama: nui_devtools, konsol hataları ve başarısız geri aramalar

FiveM NUI'yi hata ayıkla: nui_devtools ile Chromium devtools'u aç, Uncaught TypeError hatalarını oku, https://resource/cb'ye başarısız getiri'yi düzelt ve UI'yi tarayıcıda test et.

NUI'niz boş bir panel olarak açılır, bir düğme hiçbir şey yapmaz veya imleç görünür ve hiçbir ekran takip etmez. Genellikle Lua hatası yoktur çünkü hata web sayfasında. Tarayıcı konsoluna ihtiyacınız var ve FiveM'de bir tane vardır. Bu rehber nasıl açılacağını, hatalarını nasıl okuyacağını ve UI'nizi oyun olmadan nasıl test edeceğinizi kapsar.

Devtools'u Açma: nui_devtools

NUI oyunun içinde bir Chromium sayfasıdır. FiveM konsolunu açmak için F8 tuşuna basın ve çalıştırın:

text
nui_devtools

NUI katmanı için bir devtools penceresi açılır, tarayıcıdan bildiğiniz gibi. Bu sekmeleri kullanın:

  • Konsol: JavaScript hataları ve kendi console.log satırlarınız.
  • Ağ: sayfanın yaptığı her istek, Lua'ya geri aramaları dahil.
  • Öğeler: canlı HTML ve CSS. Öğenizin var olup olmadığını, ne kadar büyük olduğunu ve gizli olup olmadığını görmek için kullanın.
  • Kaynaklar: betiğinizde kırılma noktaları ayarlayın.

Dikkat: nui_devtools'un kullanılabilir olup olmadığı ayarlarınıza ve çalıştırdığınız istemci derlemesine bağlıdır. Komut hiçbir şey yapmıyorsa, oyun istemcinizin güncel olduğunu kontrol edin ve aşağıda gösterildiği gibi UI'yi normal bir tarayıcıda test edin.

UI'niz yalnızca SendNUIMessage sonrasında görünüyorsa, önce devtools'u açın ve sonra eylemi tetikleyin, böylece gelen mesajları görürsünüz.

Konsol Hatalarını Okuma

Konsol sekmesindeki hatalar dosyayı ve betiğinizin satırını gösterir. En sık göreceğiniz olanlar:

text
Uncaught TypeError: Cannot read properties of undefined (reading 'items')

Kodunuz undefined olan bir şey üzerinde .items okudu. NUI'de bu neredeyse her zaman mesajdan gelir:

js
window.addEventListener('message', (event) => {
  const { action, data } = event.data
  if (action === 'open') {
    render(data.items)   // data is undefined
  }
})

Lua'nın gerçekte ne gönderdiğini kontrol edin. Önce tüm mesajı yazdırın:

js
window.addEventListener('message', (event) => {
  console.log('NUI message', JSON.stringify(event.data))
})

Sonra Lua çağrısıyla karşılaştırın:

lua
SendNUIMessage({ action = 'open', data = { items = items } })

Anahtarlar küçük harf dahil olmak üzere tam olarak eşleşmelidir. Lua'da nil olarak ayarlanan bir alan mesajdan eksik, bu nedenle JavaScript'te undefined'dır.

Diğer yaygın hatalar:

Konsol mesajı Yaygın neden
Uncaught ReferenceError: x is not defined Bir betik dosyası yüklenmedi veya bir addaki yazım hatası
Uncaught SyntaxError Kırık bir betik dosyası veya yanlış yolla bundler çıktısı
Failed to load resource: 404 Bir dosya fxmanifest'te files içinde listelenmemiş veya yol yanlış
Uncaught (in promise) TypeError: Failed to fetch Bir geri arama isteği başarısız, aşağıya bakın

Ağ sekmesi JS, CSS veya görüntüler için 404 gösteriyorsa, sayfanın yüklediği tüm dosyaları bildirimde files'a ekleyin ve ui_page'i doğru HTML'ye işaret edin:

lua
ui_page 'web/index.html'

files {
  'web/index.html',
  'web/**/*',
}

Bir Vite veya React derlemesi için, çıktı klasörünü kullanın, FiveM NUI React ve Vite ile bölümüne bakın.

https://resource/cb'ye başarısız getiri

NUI, https://<resource name>/<callback name> isteği ile Lua'ya mesajlar gönderir:

js
fetch(`https://${GetParentResourceName()}/close`, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({}),
})

Ağ sekmesinde başarısız bir istek kırmızıda gösterilir:

text
POST https://my_script/close net::ERR_FAILED

Bunları sırasıyla kontrol edin:

  1. Geri arama kayıtlı değil. Eğik çizgiden sonraki ad tam olarak istemcide bir RegisterNUICallback ile eşleşmelidir:
lua
RegisterNUICallback('close', function(data, cb)
    SetNuiFocus(false, false)
    cb('ok')
end)
  1. Kaynak adı yanlıştır. URL'deki host kaynak klasör adıdır. Klasörü yeniden adlandırdıysanız, hardcoded https://old_name/close başarısız olur. Sayfada yukarıdaki gibi GetParentResourceName() kullanın, böylece ad klasörü takip eder.
  2. Geri arama hiçbir zaman cevap vermez. Her zaman cb(...)'yi çağırın, hatta cb('ok') ile. Onu çağırmadan dönen bir işleyici isteği beklemede bırakır ve sayfa sonsuza kadar bekleyebilir.
  3. Lua işleyicisi cb öncesinde hata verir. Aynı anda bir betik hatası için F8 konsolunu kontrol edin. cb öncesindeki bir hata, cevabın hiçbir zaman gönderilmediği anlamına gelir.
  4. Kaynak çalışmıyor. Geri aramalar, onları kaydeden istemci betiği kadar uzun yaşar.

Odak ve İmleç

UI gösterilirse ancak tıklanamıyorsa veya fare kapandıktan sonra takılı kalırsa, sorun SetNuiFocus, sayfası değildir. NUI odak takılı imleç bölümüne bakın.

UI'yi Normal Bir Tarayıcıda Test Etme

Oyun içinde hata ayıklama yavaştır. NUI'nin çoğu, editörünüzün canlı yeniden yüklenmesiyle bir tarayıcıda test edilebilir.

index.html'ı yerel bir sunucu aracılığıyla açın veya Vite projesi için npm run dev çalıştırın. Daha sonra oyunun normalde sağladığı iki şeyi taklit edin.

İlk olarak, sahte GetParentResourceName ve başarısız olmayan geri aramalar:

js
if (!window.GetParentResourceName) {
  window.GetParentResourceName = () => 'my_script'
  window.fetch = async (url, options) => {
    console.log('NUI callback', url, options && options.body)
    return { ok: true, json: async () => ({}) }
  }
}

İkincisi, Lua'nın göndereceği mesajları gönderin. Tarayıcı konsolundan veya yalnızca geliştirme düğmesinden:

js
window.postMessage({ action: 'open', data: { items: [{ name: 'water', count: 3 }] } }, '*')

Bu, SendNUIMessage gibi tam olarak message dinleyicinizi çağırır. Tarayıcıda tasarlayabilir, düzeni düzeltebilir ve veri işlemeyi kontrol edebilir ve oyunu odak, gerçek veri ve gerçek geri aramaların son kontrolü için saklayabilirsiniz.

İpucu: Taslakları üretim derlemesinden kaldırın veya bunları sarın, böylece yalnızca sayfa oyunun dışında açıldığında çalışsın, yukarıdaki gibi GetParentResourceName üzerindeki if ile.

Kontrol Listesi

Belirti Çözüm
Boş NUI nui_devtools açın, Konsol ve Ağ sekmelerini okuyun
nui_devtools hiçbir şey yapmaz İstemciyi güncelleyin ve ayarlarınızı kontrol edin; normal bir tarayıcıda test edin
Uncaught TypeError ... of undefined event.data'yı günlüğe kaydedin ve SendNUIMessage tarafından gönderilen anahtarlarıyla eşleştirin
Bir dosya için 404 files içinde listeleyin ve ui_page'yi kontrol edin
POST https://resource/name başarısız olur Geri aramayı RegisterNUICallback ile kaydedin ve tam adı kullanın
URL'de yanlış kaynak adı GetParentResourceName() kullanın
Düğme çalışıyor, Lua'da hiçbir şey olmuyor Geri aramanın cb('ok') çağırdığından emin olun
Kapandıktan sonra imleç takılı SetNuiFocus(false, false) çağırın

Kısa yanıtlar

FiveM NUI için devtools'u nasıl açarım?

Oyun içinde F8 konsolunu açın ve nui_devtools çalıştırın. NUI katmanı için bir Chromium devtools penceresi açılır. Kullanılabilirlik ayarlarınıza ve istemci derlemesine bağlı olabilir.

NUI geri aramam neden başarısız olur?

https://resource_name/callback isteği Lua'ya ulaşmadı. Geri arama RegisterNUICallback ile kayıtlı değil, URL'deki kaynak adı yanlış veya geri arama hiçbir zaman cb ile cevap vermedi.

Oyunu başlatmadan NUI'mi test edebilir miyim?

Evet. Sayfayı normal bir tarayıcıda açın veya Vite dev sunucusunu çalıştırın, window.postMessage ile sahte mesajlar gönderin ve geri aramaları taklit edin. Yalnızca gerçek oyun size odak, gerçek veri ve gerçek geri aramalar verir.

Bu sorunu yaşatmayan scriptler

Mic PhoneTablete dönüşen katlanabilir bir telefon; oyuncunun gerçek telefonuna da taşınır.Scripti gör →Arcade MachinesGerçek kabinlerde oynanabilir yedi arcade oyunu; skor tabloları ve bahislerle.Scripti gör →CCTV Security CamerasYerleştirilebilir kameralar, canlı çoklu görüntü tableti ve basılı delil fotoğrafları.Scripti gör →

Okumaya devam edin