FiveM menüyü kapadıktan sonra imleç takılı mı veya hareket edemiyor mu: NUI odak düzeltmesi

Menüyü kapadıktan sonra imleç ekranda takılı mı veya hareket edemiyor mu? SetNuiFocus nasıl çalışır, NUI geri araması ile kapanış, JavaScript'te ESC'yi işleme ve suçluyu bulma.

Bir menüyü kapatırsınız ve bunlardan biri gerçekleşir:

text
the mouse cursor stays on screen
the character will not move or look around
the keyboard does nothing until you reconnect

Konsola hiçbir şey gösterilmez, çünkü çalışan kodda hiçbir sorun yoktur: yalnızca odağı hiçbir zaman geri vermemiştir. Odak nasıl çalışır, menüyü düzgün kapatmak ve suçluyu bulmak aşağıda açıklanmıştır.

NUI odağı nasıl çalışır

NUI, FiveM'in oyunun üzerine çizdiği bir web sayfasıdır (HTML, CSS ve JavaScript). Odak alırken, fare ve klavye sayfa yerine oyuna gider. Bir betik odağı bir native ile verir ve alır:

lua
SetNuiFocus(hasFocus, hasCursor)
  • SetNuiFocus(true, true): NUI klavyeyi ve fareyi alır, imleç gösterilir.
  • SetNuiFocus(true, false): NUI klavyeyi alır, imleç yoktur.
  • SetNuiFocus(false, false): odak oyuna geri döner ve imleç gizlenir.

Bir menü true, true ile açılır ve hiçbir kod SetNuiFocus(false, false) çağırmaz, oyun kilitli kalır, sayfa gizli olsa bile.

Çözüm: Her zaman SetNuiFocus(false, false) ile kapatma

Kapanışı bir işlev içine koyun ve menüyü kapatmanın her yolu için kullanın:

lua
local open = false

local function openMenu()
    open = true
    SetNuiFocus(true, true)
    SendNUIMessage({ action = 'open' })
end

local function closeMenu()
    open = false
    SetNuiFocus(false, false)
    SendNUIMessage({ action = 'close' })
end

Menü diğer kodlar tarafından da kapatılabilirse aynısını yapın: oyuncu ölür, bir araca girer veya kaynak durduğunda.

lua
AddEventHandler('onResourceStop', function(resource)
    if resource == GetCurrentResourceName() and open then
        SetNuiFocus(false, false)
    end
end)

Bu son konu önemlidir. Bir kaynak menüsü açıkken durduğunda, odak sizin için döndürülmez ve oyuncu yeniden bağlanana kadar takılı kalır.

Sayfadan Kapanış: RegisterNUICallback ve fetch

Bir kapanış düğmesi veya sayfa içindeki tuş basması JavaScript'te çalışır. JavaScript native çağıramaz, bu nedenle bunu işleyen Lua tarafına bir istek gönderir:

lua
RegisterNUICallback('close', function(data, cb)
    closeMenu()
    cb('ok')
end)

Sayfanızda, https://<resource name>/close'a fetch ile bir istek gönderin. GetParentResourceName() size bir NUI sayfası içinde kaynak adını verir:

js
function closeMenu() {
  fetch(`https://${GetParentResourceName()}/close`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json; charset=UTF-8' },
    body: JSON.stringify({}),
  })
}

document.getElementById('close-button').addEventListener('click', closeMenu)

Geri aramanın cb çağırması gerekir. Hiçbir zaman cevap vermez, sayfadaki istek açık kalır ve bazı kütüphaneler beklemeyi durdurur. Her zaman cb('ok') veya başka bir cevap ile geri aramayı sonlandırın.

ESC ve JavaScript'te diğer tuşlar

NUI odak alırken, oyun klavyeyi görmez, bu nedenle ESC tuşu asla Lua kodunuza ulaşmaz. Sayfa onu dinlemek zorundadır:

js
window.addEventListener('keydown', (event) => {
  if (event.key === 'Escape') {
    closeMenu()
  }
})

Menüyü kapatması gereken diğer herhangi bir tuş için aynı kontrolü ekleyin. Sayfanın bir giriş kutusu varsa, tuşun orada ne yaptığını düşünün: metin alanında ESC menüyü hala kapatmalı, ancak bir harf kapatmamalıdır.

Dikkat: Sadece bir kapanış düğmesine güvenmeyin. Bir oyuncu ESC tuşuna basarsa ve sayfada dinleyici yoksa, duraklatma menüsü açılabilir ve menü onu kapatmanın hiçbir yolu olmadan ekranda kalır.

Bir HUD'i küçük bir panel veya telefon gibi bazı arayüzler oyuncunun hareket etmeye devam etmesini sağlamalıdır. Bunun için SetNuiFocusKeepInput kullanın:

lua
SetNuiFocus(true, true)
SetNuiFocusKeepInput(true)

Giriş ile, NUI odak alırken oyun hala klavyeyi alır. Açarsanız, menü kapandığında kapatın, çünkü kapatana kadar açık kalır:

lua
local function closeMenu()
    SetNuiFocusKeepInput(false)
    SetNuiFocus(false, false)
end

Kalan SetNuiFocusKeepInput(true) garip belirtiler verir: imleç gitti ancak bazı tuşlar tuhaf davranır veya hiçbir şey yapmaz.

Odağı tutan kaynağı bulma

Genellikle takılı menü senin değildir. Hangi kaynağın odağı aldığını bilmediğinizde, bunu eleme ile bulun:

  1. Sorunu yeniden üretin: menüyü açın, kapayın ve imleç takılı olduğunu görün.
  2. Sunucu konsolunda (veya txAdmin Canlı Konsolu'nda), menüsü olan bir kaynak için restart resource_name yazın: telefon, envanter, dükkan, radyal menü veya kıyafet menüsü.
  3. İmlecin ve kontrollerin geri gelip gelmediğini veya sorunun artık meydana gelip gelmediğini kontrol edin.
  4. Davranış değişene kadar sonraki kaynak için yineleyin.

Yeniden başlatma odağı geri verdiğinde, bu betik onu tutar. Kodunda bir kapanış yolunu arayın: SetNuiFocus(false, false) çağrılmayan bir hata çizgisi, sadece HTML'i kapatan bir ölüm veya iş değişikliği veya cevap vermeyen bir geri arama. Hatanın zamanında konsolda bir hata güçlü bir ipucudur: FiveM betik hatasını nasıl okuyacağınız bölümüne bakın.

Satın aldığınız bir betik ise, yazarına tam adımları ve bulduğunuz kaynak adını gönderin.

Kontrol Listesi

Belirti Çözüm
İmleç kapandıktan sonra kalır Kapanış işlevinde SetNuiFocus(false, false) çağırın
Kapanış düğmesi hiçbir şey yapmaz RegisterNUICallback('close', ...) ve https://<resource>/close'a fetch ekleyin
ESC menüyü kapatmaz JavaScript'te Escape'i dinleyin ve kapanış geri aramasını çağırın
Kaynak yeniden başladıktan sonra takılı onResourceStop'ta odağı serbest bırakın
Karakter kapandıktan sonra hareket edemez Kapatırken SetNuiFocusKeepInput(false) kapatın
Hangi betiğin yaptığını bilmiyor Imleç dönene kadar kaynakları birer birer yeniden başlatın
Geri arama asılı kalır Her zaman cb('ok') ile cevap verin

Kısa yanıtlar

Menüyü kapadıktan sonra imleçim ekranda neden kalır?

Menü HTML'ini gizledi, ancak hiçbir şey oyuna odağı geri vermesi söylenmedi. Betik menü kapandığında SetNuiFocus(false, false) çağırmalıdır.

SetNuiFocusKeepInput ne yapar?

SetNuiFocusKeepInput(true) bir NUI odak alırken oyunun klavye girişini almasını sağlar, böylece oyuncu hala yürüyebilir. Menü kapandığında tekrar kapatılmalıdır.

Hangi kaynağın odağı tuttuğunu nasıl bulabilirim?

Kaynakları birer birer yeniden başlatın ve her birinden sonra imleç ve kontrollerin geri gelip gelmediğini kontrol edin. Yeniden başlatması sorunu çözen, odağı tutan olandır.

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 →Clothing DesignerFiveM içinde kıyafet tasarlayın — fırça, katmanlar, görsel içe aktarma ve yapay zekâ — sonra giyin.Scripti gör →

Okumaya devam edin