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:
the mouse cursor stays on screen
the character will not move or look around
the keyboard does nothing until you reconnectKonsola 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:
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:
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' })
endMenü diğer kodlar tarafından da kapatılabilirse aynısını yapın: oyuncu ölür, bir araca girer veya kaynak durduğunda.
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:
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:
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:
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.
Menü açıkken yürüme
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:
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:
local function closeMenu()
SetNuiFocusKeepInput(false)
SetNuiFocus(false, false)
endKalan 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:
- Sorunu yeniden üretin: menüyü açın, kapayın ve imleç takılı olduğunu görün.
- Sunucu konsolunda (veya txAdmin Canlı Konsolu'nda), menüsü olan bir kaynak için
restart resource_nameyazın: telefon, envanter, dükkan, radyal menü veya kıyafet menüsü. - İmlecin ve kontrollerin geri gelip gelmediğini veya sorunun artık meydana gelip gelmediğini kontrol edin.
- 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 →