FiveM'de DrawMarker, yardım metni ve lib.showTextUI gecikme olmadan
FiveM'de ağır döngü olmadan işaretçiler ve 'E tuşuna bas' istemi gösterin: sadece yakında DrawMarker, yardım metni yerleşikleri, lib.showTextUI ve bölgeler için ox_lib noktaları.
İşaretçi çizersiniz, ona doğru yürüyorsünüz ve titrer veya hiç gösterilmez veya betiğiniz resmon da 0.30 ms'de hiçbir şey yapmadan oturur. İşaretçiler ve "E tuşuna bas" istemi basit görünür, ancak ağır döngülerin klasik kaynağıdırlar. Bu makale işaretçiyi doğru şekilde nasıl çizeceğini, istem nasıl gösterileceğini ve oyuncu uzak olduğunda bunu nasıl durduracağını gösterir.
DrawMarker her kareyi çalıştırmalıdır
İşaretçi, DrawMarker çağırdığınız her seferinde bir kare için çizilir. Ekranda tutmak için her kareyi tekrar çağırırsınız, Wait(0) ile döngüde:
local coords = vec3(441.2, -981.9, 30.7)
CreateThread(function()
while true do
DrawMarker(
1, -- type: cylinder
coords.x, coords.y, coords.z - 1.0, -- position (on the ground)
0.0, 0.0, 0.0, -- direction
0.0, 0.0, 0.0, -- rotation
1.5, 1.5, 0.5, -- scale
50, 150, 255, 120, -- red, green, blue, alpha
false, false, 2, false, nil, nil, false
)
Wait(0)
end
end)Bu çalışır, ancak tüm oturum için her kare çalışır, oyuncu harita genelinde bile. Sonraki bunu düzeltin.
Sadece oyuncu yakında iken çizin
Mesafeyi ölçün ve oyuncu uzak olduğunda daha uzun uyudu. Sadece yakın durum Wait(0) gerekir:
local coords = vec3(441.2, -981.9, 30.7)
CreateThread(function()
while true do
local sleep = 1000
local pedCoords = GetEntityCoords(PlayerPedId())
local distance = #(pedCoords - coords)
if distance < 15.0 then
sleep = 0
DrawMarker(1, coords.x, coords.y, coords.z - 1.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.5, 1.5, 0.5,
50, 150, 255, 120, false, false, 2, false, nil, nil, false)
if distance < 1.5 then
-- show the prompt here (next section)
end
end
Wait(sleep)
end
end)Uzakta, döngü saniyede bir kez uyanır ve bir çıkarma yapar. İşaretçiye yakında sadece ihtiyacı olduğunda kare başına çalışır. Bunun neden önemli olduğu ve resmon'da nasıl okunacağı resmon yüksek ms: nasıl optimize edilir içindedir.
İpucu:
#(a - b)vektör farkının uzunluğu, mesafedir.vec3değerlere ihtiyacı olur,GetEntityCoordszaten döndürür.
İşaretçi türleri
İlk argüman işaretçi türüdür, sayı. Sunucuların çok kullanması gereken birkaç:
| Tür | Gibi görünür |
|---|---|
1 |
Silindir |
2 |
Şevron oku (zeminde aşağı işaret etmek için X'te 180 derece döndürün) |
23 |
Zeminde düz halka |
25 |
Zeminde düz halka, daha ince |
Türlerin tam listesi FiveM belgeleme sitesinde, oyun referanslarında, işaretçilerde. Ölçek argümanları boyutu değiştirir ve son renk değeri alfa (şeffaflık). Yer işaretçisini z - 1.0 da yerleştirin, böylece oyuncunun belinde yüzmez zeminde oturur.
Yardım metni: yerleşik istem
Oyunun ekranın sol üstünde bir yardım mesajı vardır. Bir etiketi tanımlar ve oyuncu aralıkta olduğu sürece her kare gösterir:
AddTextEntry('MY_SCRIPT_HELP', 'Press ~INPUT_CONTEXT~ to open the garage')
local function showHelp()
BeginTextCommandDisplayHelp('MY_SCRIPT_HELP')
EndTextCommandDisplayHelp(0, false, true, -1)
end~INPUT_CONTEXT~ oyuncunun bağlam eylemi için kullandığı anahtar ile değiştirilir; varsayılan olarak E. showHelp() distance < 1.5 dalında çağırın, sonra anahtarı kontrol edin:
if distance < 1.5 then
showHelp()
if IsControlJustReleased(0, 38) then
print('opened')
end
endEtiketi dosyanın üstünde bir kez kaydedin, döngü içinde değil.
lib.showTextUI ve lib.hideTextUI
ox_lib ile stillendirilmiş istem gösterebilirsiniz ve bir kez oyuncu girişte çağırırsınız, her kare değil:
lib.showTextUI('[E] Open the garage', {
position = 'right-center',
icon = 'warehouse',
})
-- when the player leaves:
lib.hideTextUI()lib.isTextUIOpen() bir tane zaten ekranda olup olmadığını söyler. Manifestinizde shared_script '@ox_lib/init.lua' gerekir (bkz. ox_lib menü kılavuzu). Metin anahtara bağlı değil: anahtarı kendiniz hala kontrol edersiniz veya keybind kullanırsınız.
ox_lib noktaları: hiç mesafe döngüsü
Her bölge için mesafe döngüsü el ile yazma ekler. lib.points sizin için yapar: ox_lib oyuncunun mesafesini tüm noktalara birlikte kontrol eder ve sadece onların yakınında kodunuzu çalıştırır:
local point = lib.points.new({
coords = vec3(441.2, -981.9, 30.7),
distance = 15.0,
})
function point:onEnter()
lib.showTextUI('[E] Open the garage')
end
function point:onExit()
lib.hideTextUI()
end
function point:nearby()
DrawMarker(1, self.coords.x, self.coords.y, self.coords.z - 1.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.5, 1.5, 0.5,
50, 150, 255, 120, false, false, 2, false, nil, nil, false)
if self.currentDistance < 1.5 and IsControlJustReleased(0, 38) then
print('opened')
end
endNasıl çalışır:
onEnteroyuncudistanceiçine geldiğinde bir kez çalışır.onExitayrıldıklarında bir kez çalışır.nearbyonlardistanceiçindeyken her kare çalışır ve aksi halde hiç. İşaretçi'nin bulunduğu yer burasıdır.self.currentDistancenoktaya olan mevcut mesafedir.
Yüzlerce nokta oluşturabilirsiniz ve sadece oyuncunun yakınında olanlar maliyeti alır. point:remove() ile artık ihtiyacı olmayan noktayı kaldırın.
Hangi kullanılacak
- Bir veya iki bölge: mesafe döngüsü uyudutlı iyi.
- Çok bölge veya config'den bölge oluşturan betik:
lib.pointskullanın. - Nesneler ve peds'de etkileşimler: hedef işaretçi'den daha iyidir. Bkz. ox_target: hedefler nasıl eklenir.
Kontrol Listesi
| Semptom | Çözüm |
|---|---|
| İşaretçi titrer veya bir kare gösterir | Wait(0) döngüde DrawMarker her kareyi çağırın |
| Betik boştayken resmon zamanı maliyeti | Uzak olduğunda 500 ila 1000 ms, yakında sadece Wait(0) uyutun |
| İşaretçi havada yüzüyor | z - 1.0 da çizin |
| İstem metni hiç gösterilmez | AddTextEntry ile tanımlayın, sonra her kare gösterin |
lib.showTextUI ekranda kalır |
Çıkışta lib.hideTextUI() çağırın |
| Çok bölge yavaş | onEnter, onExit ve nearby ile lib.points.new kullanın |
Kısa yanıtlar
Neden işaretçim bir kareden sonra kaybolur?
DrawMarker Wait(0) ile döngüde her kare çağrılmalıdır. Bir kez çağırın ve tek bir kareyi gösterir.
Betik neden resmon'da bu kadar fazla zaman harcıyor?
Merkez'e olan mesafeyi ölçen Wait(0) döngüsü her kare çalışıyor. Oyuncu uzak olduğunda daha uzun uyudu veya loop sadece bölgenin yakında çalışması için ox_lib noktasını kullanın.
Hangisi daha iyi, yardım metni veya lib.showTextUI?
Yardım metni oyuna yerleşiktir ve kaynağa ihtiyaç duymaz. lib.showTextUI ox_lib'den stillendirilmiş bir istemidir ve koddan göstermek ve gizlemek kolaydır. Bir stil seçin ve tüm sunucunuz için tutun.
Bu sorunu yaşatmayan scriptler
Advanced BoostingTabletten araç boosting: D’den S+ sınıfına kontratlar, ekipler ve canlı sıra.Scripti gör →
Shop CreatorBir dakikadan kısa sürede dükkân kurun — sahipler, çalışanlar, kasalar ve soygunlar dahil.Scripti gör →
Quest CreatorGörevler ve NPC diyalogları için oyun içinde düğüm düğüm kurulan görsel editör.Scripti gör →