FiveM animasyonları ve sahne öğeleri: TaskPlayAnim bayrakları, kemik takma, silme
FiveM Lua'da animasyonları oynat ve sahne öğelerini ekle: RequestAnimDict, TaskPlayAnim bayrakları 1, 16, 32 ve 49, ClearPedTasks, AttachEntityToEntity bir kemike, senaryolar ve temizlik.
Oyuncu kahve içmek, telefon tutmak veya bir aracı kullanmak istiyorsunuz: bir animasyon, çoğu zaman eldeki bir sahne öğesiyle. Yanlış yapılırsa, animasyon hiçbir şey yapmaz, sahne öğesi oyuncunun ayaklarının dibinde yüzer veya dünyada sonsuza kadar kalır. Bu rehber çalışan sırayı ve temizliği gösterir.
Yükle, oynat, temizle
Bir animasyon bir sözlük içinde yaşar. Ondan oynatmadan önce sözlük yüklenmeli:
local function playAnim(ped, dict, anim, flag, duration)
RequestAnimDict(dict)
while not HasAnimDictLoaded(dict) do
Wait(0)
end
TaskPlayAnim(ped, dict, anim, 8.0, -8.0, duration or -1, flag or 0, 0.0, false, false, false)
endHasAnimDictLoaded hiçbir zaman true değilse, sözlük adı yanlıştır ve bu döngü asılı kalır, bu nedenle ad yapılandırmadan gelirse bir zaman aşımı ekleyin. ox_lib ile, bir satır döngüyü değiştirir:
lib.requestAnimDict('mp_player_inteat@burger')TaskPlayAnim ped, sözlük, animasyon, karışım içinde, karışım çıkış, milisaniye cinsinden süre (-1 = durdurulana kadar), bayrak ve oynatma hızını alır. RemoveAnimDict(dict) ile bitirdiğinizde sözlüğü serbest bırakın.
Animasyon bayrakları
Bayrak bir bitmask olduğundan değerler toplanır. Kullanacağınız olanlar:
| Bayrak | Etki |
|---|---|
| 0 | Bir kez oynat, oyuncu hareket edemez |
| 1 | Döngü |
| 16 | Yalnızca üst gövde, bacaklar yürümeye devam ediyor |
| 32 | Oyuncu kontrol ediyor |
| 49 | 1 + 16 + 32: döngü, üst gövde, kontrol edilebilir |
Elde tutulan animasyon (telefon, içecek, sigara) için, 49 genellikle tercih edilen seçimdir: döngü yapar, sadece üst gövde animasyonludur ve oyuncu yine de yürüyebilir. Oyuncunun hareketsiz kalması gereken bir kez gerçekleşen eylem için, döngü yapması gerekirse 0 veya 1 kullanın.
Animasyonu durdurma
local ped = PlayerPedId()
ClearPedTasks(ped) -- stop and let the ped blend out
-- or, if it is stuck:
ClearPedTasksImmediately(ped) -- cut instantly, can look abrupt
StopAnimTask(ped, dict, anim, 1.0) -- stop only that animationPed'de birkaç şey çalışırken StopAnimTask kullanın, çünkü ClearPedTasks yürümeyi veya altındaki senaryoyu da iptal eder. ClearPedTasksImmediately sıkışmış bir ped'i düzeltir ama ayrıca araçlardan çıkartır, bu nedenle kurtarma için saklayın.
Eldeki sahne öğesi
Sahne öğesi, oluşturduğunuz ve ped'in kemiğine takıdığınız bir nesnedir. Sıra: modeli yükle, nesneyi oluştur, takı, animasyonu oynat.
local prop
local function attachProp(ped, model, bone, x, y, z, rx, ry, rz)
local hash = joaat(model)
RequestModel(hash)
while not HasModelLoaded(hash) do Wait(0) end
local coords = GetEntityCoords(ped)
prop = CreateObject(hash, coords.x, coords.y, coords.z + 0.2, true, true, false)
AttachEntityToEntity(
prop, ped, GetPedBoneIndex(ped, bone),
x, y, z, rx, ry, rz,
true, true, false, true, 1, true
)
SetModelAsNoLongerNeeded(hash)
return prop
endParçalar:
CreateObject(model, x, y, z, isNetwork, netMissionEntity, doorFlag):isNetwork = truegeçirin eğer diğer oyuncular sahne öğesini görmeli ise, bu genellikle elde bir şey için istenen şeydir.GetPedBoneIndex(ped, boneId)kemik kimliğini28422(sağ el yerleştirmesi) veya18905(sol el) gibi bir indekse dönüştürür. Diğerleri için kemik kimliği listesine bakın.x, y, zverx, ry, rzkemik göreceli ofsetler ve rotasyondur. Bunlar sahne öğe başına ayarlamaya ihtiyaç duyar; kısayol yoktur, bu nedenle bir değeri değiştirin ve test edin.- Boolean'lar rotasyondan sonra yumuşak sabitleme, çarpışma ve benzer bayraklardır. Çarpışma
falsesahne öğesinin ped'i etrafında itmesini engeller.
Parçaları bir araya koyun
local function eatBurger()
local ped = PlayerPedId()
attachProp(ped, 'prop_cs_burger_01', 28422, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)
lib.requestAnimDict('mp_player_inteat@burger')
TaskPlayAnim(ped, 'mp_player_inteat@burger', 'mp_player_int_eat_burger', 8.0, -8.0, 3000, 49, 0.0, false, false, false)
Wait(3000)
ClearPedTasks(ped)
deleteProp()
endSahne öğesi elinde yanlış görünüyorsa, önce ofsetleri, ardından kemiği düzeltin. Diğer animasyon adı bir sözlükte yoksa, TaskPlayAnim sessizce hiçbir şey yapmaz, bu nedenle çifti iki kez kontrol edin (tam sözlük ve animasyon adları, yazıldığı gibi küçük harf).
Sahne öğesini sil
Her zaman temizleyin. Silinmeyen sahne öğesi dünyada kalır, onu artık tutmayan ped'e takılı olarak:
function deleteProp()
if prop and DoesEntityExist(prop) then
DetachEntity(prop, true, true)
DeleteEntity(prop)
end
prop = nil
end
AddEventHandler('onResourceStop', function(resource)
if resource ~= GetCurrentResourceName() then return end
deleteProp()
ClearPedTasks(PlayerPedId())
end)Ayrıca animasyondan çıktığında ve oyuncu ayrıldığında sahne öğesini silin, sadece mutlu yolda değil. Sızan sahne öğeleri "her yerde nesneler" ve yavaş sunucunun klasik kaynağıdır; bkz. resmon yüksek ms.
Senaryolar
Kendi sahne öğelerini içeren, eğilme, sigara içme veya pano yazma gibi duran animasyonlar için, bunun yerine senaryo kullanın:
local ped = PlayerPedId()
TaskStartScenarioInPlace(ped, 'WORLD_HUMAN_CLIPBOARD', 0, true)
-- later
ClearPedTasks(ped)Argümanlar ped, senaryo adı, milisaniye cinsinden gecikme (hiçbiri için 0) ve giriş animasyonunu oynatıp oynatmama olur. Senaryolar sahne öğesini sizin için ekle ve temizler, ve animasyon yürürken tutulması gerekmediğinde en kolay seçimdir.
Animasyon artı sahne öğesi artı ilerleme çubuğunun hazır yapılmış sürümü için, ox_lib'in lib.progressBar anim ve prop seçeneklerini kabul eder; bkz. bildirimler ve ilerleme çubukları ve Bekle ve iş parçacıkları yukarıdaki döngülerin arkasındaki bekleme alışkanlıkları için.
Kontrol Listesi
| Belirtisi | Düzeltme |
|---|---|
| Animasyon hiçbir şey yapmıyor | Sözlüğü isteyin ve HasAnimDictLoaded bekleyin |
| Döngü yüklemede asılı kalıyor | Sözlük adı yanlış; zaman aşımı ekleyin |
| Oyuncu yerde donmuş | Bayrak 0 veya 1 hareketi engeller; kontrol tutmak için 49 kullanın |
| Sahne öğesi ayakta, ele değil | Yanlış kemik veya AttachEntityToEntity yok; GetPedBoneIndex kontrol edin |
| Sahne öğesi elde çarpık | x, y, z ve rotasyon ofsetlerini ayarlayın |
| Dünyada bırakılan sahne öğeleri | Sonunda DeleteEntity(prop), ölüm ve kaynak durması |
| Ped bir pozda sıkışmış | ClearPedTasks veya son çare olarak ClearPedTasksImmediately |
Kısa yanıtlar
Animasyonum neden oynatılmıyor?
Animasyon sözlüğü henüz yüklenmedi. RequestAnimDict çağırın, HasAnimDictLoaded true olana kadar bekleyin ve ancak o zaman TaskPlayAnim çağırın. ox_lib ile, lib.requestAnimDict(dict) bunu sizin için yapar.
Hangi TaskPlayAnim bayrağını kullanmalıyım?
Döngü yapmak için 1, yalnızca üst gövde için 16, oyuncunun kontrol tutmasını sağlamak için 32 ve döngü artı üst gövde artı kontrol edilebilir için 49 kullanın. Bunlar yürürken tuttuğunuz animasyonlar için ortak kombinasyonlardır.
Animasyondan sonra sahne öğesini nasıl kaldırırım?
Animasyon bittiğinde veya betik durduğunda DeleteEntity(prop) çağırın ve modeli SetModelAsNoLongerNeeded ile serbest bırakın. Geride bırakılan sahne öğeleri dünyada yığılır.
Bu sorunu yaşatmayan scriptler
Hookah SystemYerleştirilebilir nargileler ve lounge mobilyaları; 50+ aroma ve efekt.Scripti gör →
Vape SystemAroma, duman ve efektleriyle 50+ vape — mangodan süper hıza.Scripti gör →
Super Leaf BlowerOyuncuları, araçları, NPC’leri ve propları iten bir yaprak üfleyici. Her framework’te çalışır.Scripti gör →