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:

lua
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:

lua
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. vec3 değerlere ihtiyacı olur, GetEntityCoords zaten 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:

lua
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:

lua
if distance < 1.5 then
    showHelp()
    if IsControlJustReleased(0, 38) then
        print('opened')
    end
end

Etiketi 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:

lua
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:

lua
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
end

Nasıl çalışır:

  • onEnter oyuncu distance içine geldiğinde bir kez çalışır.
  • onExit ayrıldıklarında bir kez çalışır.
  • nearby onlar distance içindeyken her kare çalışır ve aksi halde hiç. İşaretçi'nin bulunduğu yer burasıdır.
  • self.currentDistance noktaya 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.points kullanı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 →

Okumaya devam edin