FiveM Props คืออะไร และใช้งานอย่างไร ทั้ง Object Props และ Ped Props
คำว่า FiveM Props สามารถหมายถึงได้มากกว่าหนึ่งอย่าง และนี่เป็นสาเหตุที่ผู้เริ่มต้นมักสับสน
ในบริบทของ FiveM คำว่า Prop มักหมายถึง Object Model ที่ถูกสร้างหรือวางไว้ในโลกเกม เช่น โต๊ะ เก้าอี้ กล่อง กระเป๋า ขวด โทรศัพท์ หรืออุปกรณ์ประกอบฉาก โดย Native CREATE_OBJECT ของ FiveM อธิบายตรง ๆ ว่าใช้สร้าง Object หรือ Prop จาก Model ที่กำหนด ณตำแหน่งที่ระบุ.
แต่ในระบบเสื้อผ้า GTA V/FiveM ยังมีคำว่า Ped Props ซึ่งหมายถึง Prop Variations ที่ติดกับ Ped เช่นหมวกหรือแว่น และถูกควบคุมด้วย Native อย่าง SET_PED_PROP_INDEX แยกจาก World Object Props.
บทความนี้จาก comsiam จะอธิบายทั้งสองความหมาย พร้อมวิธีสร้าง Object Prop, Attach กับ Ped, ลบ Object, ทำ Networked Prop และแยก Ped Props ออกจาก Clothing Components อย่างถูกต้อง
① FiveM Props คืออะไร
ถ้าพูดถึง Object ในโลกเกม Prop สามารถเป็นสิ่งของ เช่น
โต๊ะ
เก้าอี้
ขวด
กล่อง
กระเป๋า
โทรศัพท์
กรวยจราจร
ป้าย
อาหาร
อุปกรณ์งานช่าง
ของตกแต่ง
FiveM มี CREATE_OBJECT สำหรับสร้าง Object/Prop จาก Model ที่กำหนดโดยตรง.
② Prop กับ Object เหมือนกันไหม
ในงาน FiveM สองคำนี้มักถูกใช้ใกล้เคียงกันมาก
Native ของ Cfx.re ใช้ชนิด Entity ว่า
Object
และคำอธิบายของ CREATE_OBJECT เรียกสิ่งที่สร้างว่า
object (prop)
ดังนั้นเวลา Developer พูดถึง Prop ที่ Spawn ในโลกเกม ส่วนใหญ่กำลังพูดถึง Object Entity.
③ Object Prop ต่างจาก Ped Prop อย่างไร
จำแบบนี้
Object Prop
=
Object Entity ในโลกเกม
Ped Prop
=
เครื่องแต่งกาย/Accessory Variation ของ Ped
ตัวอย่าง
กล่องบนพื้น
→ Object Prop
หมวกบนหัวผู้เล่น
→ Ped Prop
FiveM ใช้ CREATE_OBJECT สำหรับ Object ขณะที่ SET_PED_PROP_INDEX ใช้กำหนด Prop Variation ของ Ped.
④ Prop ต่างจาก Ped อย่างไร
Prop
→ Object Entity
Ped
→ Character Entity
OneSync ของ FiveM แยก Entity Types เช่น Peds, Vehicles และ Objects และรองรับการสร้าง Entity เหล่านี้ฝั่ง Server.
ดังนั้นหุ่นตกแต่งที่ไม่มี Character AI อาจเหมาะกับ Object มากกว่าการสร้าง Ped
⑤ Prop ต่างจาก Map Object อย่างไร
Map Object อาจเป็น Object ที่ถูกวางเป็นส่วนหนึ่งของ Map/YMAP ตั้งแต่ Resource โหลด
ส่วน Script Prop มักถูกสร้างระหว่าง Runtime เช่น
ผู้เล่นใช้ Item
↓
Create Object
↓
Attach เข้ามือ
↓
ใช้งานเสร็จ
↓
Delete Object
ทั้งสองอาจใช้ Model ที่หน้าตาเหมือนกัน แต่ Lifecycle ต่างกัน
⑥ CreateObject คืออะไร
FiveM มี Native
CreateObject(
modelHash,
x,
y,
z,
isNetwork,
netMissionEntity,
doorFlag
)
สำหรับสร้าง Object/Prop ที่ตำแหน่งที่กำหนด และ Documentation ระบุว่า Model ควรถูกโหลดไว้ก่อนใช้งาน.
⑦ ก่อนสร้าง Prop ต้องโหลด Model ไหม
ควร
หลักเหมือนกับการสร้าง Ped หรือ Vehicle คือ Model Asset ควรพร้อมก่อนนำไปสร้าง Entity
Workflow คือ
Model
↓
RequestModel
↓
รอ Model โหลด
↓
CreateObject
CREATE_OBJECT ของ Cfx.re ระบุว่า Model ควรถูก Loaded อยู่แล้วก่อนสร้าง Object.
⑧ ตัวอย่างสร้าง Prop พื้นฐาน
ตัวอย่างแนวคิดใน Lua
local model = `prop_box_wood02a_pu`
RequestModel(model)
while not HasModelLoaded(model) do
Wait(0)
end
local obj = CreateObject(
model,
100.0,
200.0,
30.0,
false,
false,
false
)
SetModelAsNoLongerNeeded(model)
จุดสำคัญคือ Load Model ก่อน แล้วจึง Create Object.
⑨ CreateObject ทำไม Z อาจดูไม่ตรง
เอกสาร CREATE_OBJECT ระบุว่าตำแหน่ง Z ของ Object จะถูก Offset ด้วย Radius ของ Model.
ดังนั้นถ้าต้องการให้ตำแหน่งของ Model อยู่ตรงพิกัดที่ระบุแบบ Center มากกว่า สามารถพิจารณา CREATE_OBJECT_NO_OFFSET
⑩ CreateObjectNoOffset คืออะไร
FiveM มี
CREATE_OBJECT_NO_OFFSET
ซึ่งสร้าง Object โดย Center ของ Model อยู่ที่ตำแหน่งที่กำหนด แทนพฤติกรรม Z-offset ของ CREATE_OBJECT.
มีประโยชน์เมื่อ Placement ต้องแม่น เช่น
Furniture
Interior Object
Attached Object
Custom Interaction Prop
⑪ CreateObject กับ CreateObjectNoOffset ใช้อันไหนดี
ใช้ตามงาน
CreateObject
เหมาะกับการ Spawn Prop ทั่วไปที่ต้องการ Behavior ตาม Native ปกติ
CreateObjectNoOffset
เหมาะเมื่อคุณต้องควบคุม Center Position ให้ตรงกับ Coordinates ที่กำหนดมากขึ้น.
อย่าเปลี่ยนจากตัวหนึ่งเป็นอีกตัวเพียงเพื่อแก้ตำแหน่ง โดยไม่เข้าใจความแตกต่างเรื่อง Offset
⑫ Prop Spawn แล้วจมพื้น
ตรวจ
Z Coordinate
Model Origin
CreateObject vs CreateObjectNoOffset
Collision
ก่อน
เพราะ CREATE_OBJECT มีพฤติกรรม Z-offset ตาม Model Radius ขณะที่ CREATE_OBJECT_NO_OFFSET ใช้ Center Position โดยตรง.
⑬ Prop ลอยเหนือพื้น
สาเหตุที่ควรตรวจเหมือนกัน ได้แก่
Z สูงเกิน
Model Origin
Object Radius
Collision
Placement Method
อย่าปรับ Z แบบสุ่มหลายเมตรก่อนรู้ว่าใช้ Native ตัวใดอยู่
⑭ Prop หมุนได้ไหม
Object เป็น Entity จึงสามารถใช้ Entity Transform Natives กับมันได้ เช่นการกำหนด Position/Rotation ตามระบบ Entity ของ GTA/FiveM
เวลา Spawn Furniture หรือ Decoration ควรเก็บ
Position
Rotation
ไว้ด้วย ไม่ใช่เฉพาะ X/Y/Z
⑮ Heading อย่างเดียวพอสำหรับ Prop ไหม
ขึ้นกับ Object
Object ธรรมดาที่หมุนเพียงแกน Z อาจใช้ Heading ได้
แต่ Props ที่ต้องเอียงหรือวางในท่าพิเศษ เช่น
ป้ายเอียง
กระเป๋าวางบนโต๊ะ
อุปกรณ์ติดตัวผู้เล่น
มักต้องควบคุม Rotation มากกว่าแกนเดียว
⑯ Prop มี Collision ได้ไหม
ได้
Object Entity สามารถมี Collision และ FiveM มี Native
SET_ENTITY_COLLISION
สำหรับเปิดหรือปิด Collision ของ Entity.
จึงต้องเลือกให้เหมาะกับ Gameplay
⑰ Prop แบบไหนควรมี Collision
ตัวอย่าง
Barrier
โต๊ะ
กล่องใหญ่
สิ่งกีดขวาง
อาจต้องมี Collision
แต่ Prop Cosmetic เช่นของเล็กที่ Attach กับ Character อาจไม่ต้องการ Collision ระหว่าง Prop กับ Ped
ขึ้นอยู่กับ Gameplay Design
⑱ ปิด Collision ของ Prop ได้ไหม
ใช้
SetEntityCollision(object, false, false)
ตาม Behavior ที่ต้องการ
SET_ENTITY_COLLISION รับ Entity, Toggle และ keepPhysics เพื่อควบคุม Collision State.
ควรทดสอบ Physics หลังเปลี่ยนค่า
⑲ Prop Attach กับ Player ได้ไหม
ได้
FiveM มี Native
ATTACH_ENTITY_TO_ENTITY
สำหรับ Attach Entity หนึ่งเข้ากับอีก Entity และรองรับ Bone Index, Position Offset และ Rotation Offset.
นี่เป็นพื้นฐานของ Props เช่น
โทรศัพท์ในมือ
กระเป๋า
กล่อง
อาหาร
เครื่องมือ
ร่ม
⑳ AttachEntityToEntity ทำงานอย่างไร
โครงสร้างแนวคิดคือ
Object Prop
↓
Attach
↓
Ped
↓
Bone
↓
Offset + Rotation
ATTACH_ENTITY_TO_ENTITY รับ Entity ที่ต้องการ Attach, Target Entity, Bone Index และค่าตำแหน่ง/Rotation Offset.
㉑ Bone คืออะไร
Skeleton ของ Ped มี Bones หลายตำแหน่ง เช่นมือ แขน ศีรษะ และส่วนอื่นของตัวละคร
เมื่อต้อง Attach Prop จะต้องเลือก Bone ที่เหมาะสม
FiveM มี
GET_PED_BONE_INDEX
สำหรับหา Bone Index จาก Ped และ Bone ID.
㉒ Bone ID กับ Bone Index เหมือนกันไหม
ไม่ควรถือว่าเป็นสิ่งเดียวกัน
Cfx.re Documentation ที่เกี่ยวข้องกับ Bone Attachment ระบุให้ใช้ GET_PED_BONE_INDEX เพื่อแปลง Bone ID ไปเป็น Index ที่ใช้กับ Attachment.
ดังนั้นอย่าใส่ Bone ID ทุกค่าเข้า ATTACH_ENTITY_TO_ENTITY โดยตรงโดยไม่ตรวจ
㉓ ตัวอย่าง Attach Prop เข้ามือ
แนวคิด
local ped = PlayerPedId()
local bone = GetPedBoneIndex(ped, 57005)
AttachEntityToEntity(
object,
ped,
bone,
0.10,
0.02,
0.00,
0.0,
90.0,
180.0,
true,
true,
false,
true,
1,
true
)
ค่าตำแหน่งและ Rotation ต้องปรับตาม Model จริง เพราะ ATTACH_ENTITY_TO_ENTITY รองรับทั้ง Bone Index และ Offsets.
㉔ ทำไม Prop อยู่ผิดตำแหน่งบนมือ
ตรวจ
Bone
X Offset
Y Offset
Z Offset
Rotation X
Rotation Y
Rotation Z
ก่อนเปลี่ยน Model
หาก Prop ติดกับมือแล้วแต่ลอยห่างออกไป แสดงว่า Attachment ทำงานอยู่ เพียง Offset ยังไม่เหมาะ
㉕ Prop กลับด้านแก้อย่างไร
ปรับ Rotation Offset
เช่น
rotX
rotY
rotZ
ใน ATTACH_ENTITY_TO_ENTITY.
Model แต่ละตัวมี Origin/Orientation ต่างกัน จึงไม่มี Rotation ชุดเดียวที่ใช้ได้กับ Props ทุกชิ้น
㉖ Prop ติดผิด Bone มีอาการอย่างไร
เช่น
โทรศัพท์ติดหัว
กล่องติดขา
กระเป๋าติดมือผิดข้าง
ให้ตรวจ Bone Index ก่อน Offset
เพราะการปรับ Offset ไม่สามารถแก้ Attachment ที่เลือก Skeleton Bone ผิดตำแหน่งตั้งแต่ต้น
㉗ ใช้ GetPedBoneCoords ช่วย Debug ได้ไหม
ได้
FiveM มี GET_PED_BONE_COORDS สำหรับอ่านตำแหน่งของ Bone บน Ped.
มีประโยชน์เมื่อกำลังสร้าง Tool สำหรับดูจุด Attachment หรือ Debug Bone Placement
㉘ Prop Attach แล้วทะลุตัวผู้เล่น
ตรวจ
Position Offset
Rotation
Model Size
Collision
Animation
โดยเฉพาะ Prop ขนาดใหญ่
อาจดูปกติเมื่อยืน แต่ทะลุ Body ตอนเดินหรือเล่น Animation
จึงต้องทดสอบขณะเคลื่อนไหวด้วย
㉙ Prop กับ Animation ควรทำงานร่วมกัน
ตัวอย่าง
Animation ถือกาแฟ
+
Coffee Cup Prop
หรือ
Animation ใช้โทรศัพท์
+
Phone Prop
หาก Animation และ Attachment Offset ไม่สัมพันธ์กัน Prop จะดูเหมือนลอยหรือทะลุมือ
จึงควรออกแบบ Prop และ Animation เป็น Pair
㉚ Attach Prop แล้วต้องลบเมื่อ Animation จบไหม
ถ้า Prop ถูกสร้างมาเพื่อ Animation ชั่วคราว ควรมี Cleanup
แนวคิด
Create Prop
↓
Attach
↓
Play Animation
↓
Animation End
↓
Delete Prop
FiveM มี DELETE_OBJECT สำหรับลบ Object และ DELETE_ENTITY สำหรับลบ Entity พร้อมทำให้ Handle ที่ส่งเข้าไปไม่สามารถใช้แบบเดิมต่อได้.
㉛ DeleteObject ใช้ทำอะไร
DELETE_OBJECT
ใช้ลบ Object ที่ระบุออกจาก Game World.
จึงเหมาะกับ Prop ที่ Script สร้างขึ้นแล้วไม่ต้องการใช้อีก
㉜ DeleteEntity ใช้แทนได้ไหม
DELETE_ENTITY เป็น Native ระดับ Entity ที่สามารถลบ Entity และทำให้ Handle ที่ถูกส่งเข้าไป Invalid.
สำหรับ Object สามารถเลือก Cleanup Approach ให้สอดคล้องกับ Resource Architecture และ Ownership ของ Entity
㉝ SetEntityAsNoLongerNeeded ต่างจาก Delete อย่างไร
FiveM มี
SET_ENTITY_AS_NO_LONGER_NEEDED
ซึ่ง Mark Entity ว่า Script ไม่ต้องการใช้อีก และ Engine สามารถลบ Entity เมื่อเห็นว่าเหมาะสม.
ต่างจากการสั่ง Delete โดยตรง
㉞ Prop ชั่วคราวควรใช้แบบไหน
ถ้าต้องการให้ Object หายทันทีหลังจบ Interaction
DeleteObject / DeleteEntity
อาจเหมาะกว่า
แต่ถ้าต้องการปล่อย Ownership/Management คืนให้ Engine สามารถพิจารณา SET_ENTITY_AS_NO_LONGER_NEEDED.
㉟ Prop หายไม่หมดหลัง Resource Restart
ตรวจ Cleanup Logic
เช่น
onResourceStop
↓
วน Object Handles
↓
Delete Entity
FiveM มี Resource Lifecycle Events และ Object/Entity Delete Natives จึงควรวาง Creation/Cleanup เป็นคู่กัน ไม่ใช่สร้างอย่างเดียว.
㊱ Prop ซ้ำหลัง Restart Resource
Pattern เช่น
Start Resource
→ Create 20 Props
Restart
→ Create อีก 20
แต่ Props เดิมไม่ได้ Cleanup
จะกลายเป็น Object ซ้อนกัน
ควรเก็บ Handles หรือ Logical Object IDs และ Cleanup เมื่อ Resource Stop
㊲ Prop จำนวนมากทำให้ FPS ตกได้ไหม
Object จำนวนมากเพิ่ม Entity และ Rendering Work ใน Scene และ FiveM/OneSync ต้องจัดการ Entity State ตาม Architecture ของ Server
เอกสาร OneSync ยังเตือนว่าเมื่อมี Entities ใน Range มากกว่าที่ Client/Game รองรับได้ อาจทำให้เกิด Overload หรือ Timeout ใน Server ขนาดใหญ่มาก.
ดังนั้นไม่ควร Spawn Props จำนวนมากโดยไม่มีเหตุผลหรือการวัดผล
㊳ Decoration เล็กทุกชิ้นควรเป็น Script Prop ไหม
ไม่เสมอ
ถ้า Object เป็น Decoration ถาวรของ Map เช่น
โต๊ะ
เก้าอี้
ต้นไม้
ป้าย
จำนวนมาก อาจเหมาะกับ Map Asset/YMAP Pipeline มากกว่า Runtime Script ที่ Create Objects ทีละตัว
แต่ถ้า Object เปลี่ยนตาม Gameplay เช่นผู้เล่นวาง Barrier จึงเหมาะกับ Runtime Prop
㊴ Props แบบไหนเหมาะกับ Script
ตัวอย่าง
ตำรวจวางกรวย
ผู้เล่นถืออาหาร
เปิดกล่อง
วางกระเป๋า
Object Mission
เครื่องมือระหว่างทำงาน
Props สำหรับ Emote
เพราะต้องมี Lifecycle ตาม Gameplay
㊵ Static Props ควร Freeze หรือไม่
Object ที่ต้องอยู่ตำแหน่งเดิมอาจต้องกำหนด Physics/Entity State ให้เหมาะสมตาม Gameplay
แต่ไม่ควร Freeze Props ทุกตัวแบบเหมารวม
เช่น
Barrier
→ อาจต้องอยู่นิ่ง
ลูกบอล
→ ต้องเคลื่อนที่
ต้องออกแบบตามพฤติกรรมของ Object
㊶ Prop Networked คืออะไร
CREATE_OBJECT มี Parameter ที่เกี่ยวข้องกับ Network Object Creation ทำให้สามารถสร้าง Object สำหรับ Networking ได้ตามรูปแบบ Native.
ถ้า Prop ต้องให้ผู้เล่นหลายคนเห็น Object ตัวเดียวกัน ต้องออกแบบ Networked Entity แทน Local Visual Object
㊷ Local Prop กับ Networked Prop ต่างกันอย่างไร
Local Prop
ผู้เล่น A สร้าง
→ ใช้เฉพาะ Client A
เหมาะกับ Visual Effect บางประเภท
Networked Prop
Entity เดียว
→ ผู้เล่นหลายคนเห็นร่วมกัน
เหมาะกับ
Barrier
Mission Object
Shared Item
World Interaction
Network ID ใช้สำหรับอ้าง Entity ข้าม Machines.
㊸ Entity Handle ส่งให้ Client อื่นได้ไหม
ไม่ควร
Cfx.re ระบุว่า Entity Handle เป็นค่า Local ต่อ Client และ Entity เดียวกันสามารถมี Handle คนละค่าบนคนละเครื่องได้.
ถ้าต้องอ้าง Object ข้าม Clients หรือ Server ให้ใช้
Network ID
แทน
㊹ Network ID คืออะไรสำหรับ Prop
Network ID คือ Identifier ของ Networked Entity ที่ใช้ระหว่าง Machines และ Cfx.re ระบุว่าควรใช้ Network ID เมื่อจำเป็นต้องอ้าง Entity ระหว่าง Client หรือ Server.
แนวคิด
Object Handle
↓
Network ID
↓
ส่งผ่าน Network
↓
Client ปลายทาง
↓
แปลงกลับเป็น Local Handle
㊺ Network ID อยู่ตลอดไปไหม
ไม่
Cfx.re ระบุว่า Network ID เป็นค่าที่สามารถถูก Reuse ได้หลัง Entity เดิมหมด Lifetime แม้ในช่วงที่ Entity ยังมีชีวิต Network ID จะไม่เปลี่ยน.
ดังนั้นไม่ควรใช้ Network ID เป็น Permanent Database ID ของ Prop
㊻ Prop ถาวรควรเก็บอะไรใน Database
ควรเก็บ Logical Data เช่น
prop_id = police_barrier_001
model
x
y
z
rotation
owner
state
แล้วสร้าง Runtime Entity และ Network ID ใหม่เมื่อ Server ต้องการ
ไม่ควรเก็บ Local Entity Handle เป็น Identifier ถาวร เพราะ Handle เป็น Local Context.
㊼ OneSync สร้าง Object ฝั่ง Server ได้ไหม
ได้
Cfx.re OneSync Documentation ระบุว่าสามารถสร้าง Entities ฝั่ง Server ได้ รวมถึง
Peds
Vehicles
Objects
จึงสามารถออกแบบ Shared Props ให้ Server เป็นผู้ควบคุม Entity Creation ได้
㊽ Server-created Prop เหมาะกับอะไร
ตัวอย่างเช่น
Shared Barrier
Mission Object
Persistent Gameplay Object
Server-controlled World Item
โดยเฉพาะเมื่อ Object State ต้องเป็นแหล่งข้อมูลเดียวสำหรับผู้เล่นหลายคน
แต่ต้องออกแบบ Persistence/Ownership ให้ถูก ไม่ใช่แค่ย้าย CreateObject จาก Client ไป Server
㊾ Entity Persistence ใน OneSync ต้องคิดอะไร
Cfx.re แนะนำ SET_ENTITY_ORPHAN_MODE สำหรับ Server-created Entity ที่ต้องการป้องกันไม่ให้ Server ลบ Entity นั้นโดยอัตโนมัติในบางสถานการณ์.
ดังนั้น Shared Persistent Object ควรออกแบบ Lifecycle ชัดเจน
Create
↓
Persist
↓
Update State
↓
Delete เมื่อหมดอายุ
㊿ Prop อยู่คนละ Instance ทำไมมองไม่เห็น
ถ้า Server ใช้ Routing Buckets หรือ Instance System Object อาจไม่ได้อยู่ใน Game State เดียวกับผู้เล่น
จึงควรตรวจ Instance Architecture เพิ่มเมื่อ
Player A เห็น Prop
Player B ไม่เห็น
หลังพิสูจน์แล้วว่า Prop เป็น Networked Entity
51. Ped Prop คืออะไร
กลับมาที่ความหมายอีกแบบของคำว่า Props
FiveM มี
SET_PED_PROP_INDEX
สำหรับกำหนด Prop Variation ของ Ped โดยรับ
Ped
Prop Index
Drawable ID
Texture ID
Attach
และ Cfx.re ระบุว่า IDs เหล่านี้สัมพันธ์กับ Ped Model.
52. ตัวอย่าง Ped Props มีอะไร
โดยการใช้งาน Clothing System มักพบ Accessories เช่น
หมวก
แว่น
นาฬิกา
กำไล
ตาม Prop Slots ที่ Ped Model รองรับ
FiveM แยก Ped Props ออกจาก Drawable Components และมี Collection-based APIs สำหรับทั้งสองประเภท.
53. Ped Prop ต่างจาก Attach Object อย่างไร
นี่สำคัญมาก
Ped Prop
SET_PED_PROP_INDEX
เป็น Variation ที่มีอยู่ใน Clothing/Prop System ของ Ped
Attach Object
CREATE_OBJECT
+
ATTACH_ENTITY_TO_ENTITY
เป็นการสร้าง Object Entity จริงแล้ว Attach เข้ากับ Ped.
ตัวอย่าง
หมวก Clothing
→ Ped Prop
กล่องที่ผู้เล่นถือ
→ Attached Object Prop
54. โทรศัพท์ควรเป็น Ped Prop หรือ Attached Object
ถ้าโทรศัพท์เป็นอุปกรณ์ที่แสดงตอน Animation และต้องสร้าง/ลบตาม Interaction มักเหมาะกับ
Create Object
↓
Attach to Hand
มากกว่าการทำเป็น Clothing Prop Variation
เพราะ Lifecycle เป็น Gameplay Object ไม่ใช่ Outfit
55. หมวกควรใช้ AttachEntityToEntity ไหม
หากหมวกนั้นเป็น Clothing Prop ที่ Ped Model รองรับ ควรพิจารณา Ped Prop System ก่อน
FiveM มี SET_PED_PROP_INDEX โดยตรงสำหรับ Ped Prop Variations.
การ Create Object แล้ว Attach เป็นอีกเทคนิคหนึ่ง แต่จะมี Object Entity และ Cleanup/Networking เพิ่มเข้ามา
56. ClearPedProp คืออะไร
FiveM มี
CLEAR_PED_PROP
สำหรับ Clear Prop Slot ที่ระบุออกจาก Ped.
ตัวอย่างใช้เมื่อผู้เล่นถอด
หมวก
แว่น
Ped Prop
จาก Slot นั้น
57. Ped Props มี Collections ไหม
มี
Cfx.re ระบุว่า Ped Drawable Components และ Props ถูกจัดเก็บใน Named Collections และ Collection-based Indexes ถูกออกแบบให้คงที่หลัง GTA Title Updates.
นี่สำคัญกับ Custom Hats/Glasses เช่นเดียวกับ Custom Clothes
58. GTA Update ทำให้ Custom Ped Props เพี้ยนได้ไหม
ถ้าระบบใช้ Global Index ของ Custom Props เป็น Persistent ID ปัญหาสามารถเกิดได้
Cfx.re ระบุว่า Global Index ของ Custom Drawable Components และ Props เปลี่ยนได้หลัง Title Update ขณะที่ Collection-relative Index ยังคง Stable.
จึงควรพิจารณา Collection-based Props สำหรับระบบ Clothing ระยะยาว
59. SetPedCollectionPropIndex คืออะไร
FiveM มี
SET_PED_COLLECTION_PROP_INDEX
เป็นทางเลือกของ SET_PED_PROP_INDEX ที่ใช้ Local Collection Index แทน Global Index.
เหมาะกับ Custom Ped Props ที่ต้องการความเสถียรหลัง GTA Title Updates
60. Prop หายหลัง Animation จบเกิดจากอะไร
ต้องตรวจว่า Script ตั้งใจ
DeleteObject
Detach
ClearPedProp
หลัง Animation หรือไม่
ถ้าเป็น Attached Object อาจถูก Delete
แต่ถ้าเป็น Ped Prop อาจถูก Clear ด้วย Ped Prop API
แยกสองระบบให้ถูกก่อน Debug.
61. Prop ไม่หายหลัง Animation จบ
นี่เป็นอาการ Cleanup ไม่ครบ
ตัวอย่าง
Animation Stop
แต่ Object Handle ยังอยู่
และยัง Attach กับ Ped
ควร
Detach/Delete
ตาม Architecture
ไม่ควรปล่อย Object เก่าค้างและ Create ตัวใหม่ทุกครั้งที่เล่น Emote
62. Emote Prop ซ้ำหลายชิ้นเกิดจากอะไร
เช่นเล่น Animation 5 ครั้งแล้วได้แก้ว 5 ใบติดมือ
Root Cause มักเป็น
Create ทุกครั้ง
แต่ไม่ Cleanup ของเดิม
ควรเก็บ Object Handle ของ Active Prop และตรวจ/ลบก่อนสร้างตัวใหม่
63. Prop หายเมื่อผู้เล่นตายควรทำอย่างไร
ระบบ Emote/Inventory ควรมี Cleanup Hooks สำหรับเหตุการณ์ที่ทำให้ Interaction จบ เช่น
Death
Respawn
Character Change
Resource Stop
Cancel Emote
เพื่อไม่ให้ Attached Object ค้าง
64. Prop ค้างหลัง Disconnect
ถ้าเป็น Networked Object ที่ Server/Resource เป็นผู้ดูแล ต้องมี Lifecycle Cleanup เมื่อเจ้าของหรือ Gameplay State หาย
นี่เป็นอีกเหตุผลที่ควรแยก
Visual Local Prop
ออกจาก
Persistent Shared Prop
ตั้งแต่ Design Phase
65. Props จำนวนมากควร Optimize อย่างไร
เริ่มจาก
ลดจำนวน Objects ที่ไม่จำเป็น
หลีกเลี่ยง Duplicate Props
ใช้ Model ที่เหมาะกับระยะ
ไม่ Spawn ทุก Object ของเมืองผ่าน Script
Cleanup Entity ที่หมดอายุ
จำกัด Shared Props ตาม Gameplay
และหาก Server มี Entity Density สูง ควรวัดผลจริง ไม่ควรดูแค่จำนวน Resource Folders
66. Props ใน Map กับ Runtime Props อะไรเบากว่า
ไม่มีคำตอบเดียว
แต่ Static Decoration จำนวนมากมักเหมาะกับ Map Asset Pipeline มากกว่าการสร้างผ่าน Runtime Script ทีละ Object
ส่วน Object ที่เกิดจาก Gameplay เช่น
Barrier ที่ตำรวจวาง
กล่องที่ผู้เล่นยก
Mission Object
จำเป็นต้องมี Runtime State จึงเหมาะกับ Script Prop มากกว่า
67. ตารางสรุป FiveM Props
| สิ่งที่ต้องการ | วิธีที่ควรพิจารณา |
|---|---|
| โต๊ะถาวรใน MLO | Map/Object Asset |
| กรวยที่ตำรวจวาง | Runtime Object Prop |
| กล่องที่ผู้เล่นถือ | Create + Attach Object |
| โทรศัพท์ใน Animation | Attached Object |
| หมวก Character | Ped Prop |
| แว่น | Ped Prop |
| Object ผู้เล่นทุกคนต้องเห็น | Networked Object |
| Decoration เฉพาะ Client | Local Object |
| Persistent Shared Object | OneSync/Server Entity Design |
| ลบ Object ทันที | DELETE_OBJECT / DELETE_ENTITY |
| ปล่อย Engine ดูแลภายหลัง | SET_ENTITY_AS_NO_LONGER_NEEDED |
Native และ Networking ที่เกี่ยวข้องเป็นส่วนหนึ่งของ Object/Entity APIs ของ FiveM.
68. Checklist Runtime Object Prop
☐ Model ถูก
☐ Model Loaded
☐ CreateObject สำเร็จ
☐ Position ถูก
☐ Rotation ถูก
☐ Collision ถูก
☐ Local/Networked ถูก
☐ Bone ถูกถ้า Attach
☐ Offset ถูก
☐ Rotation Offset ถูก
☐ มี Cleanup
☐ ไม่มี Duplicate Object
☐ Resource Stop แล้วลบครบ
69. Checklist Ped Prop
☐ Ped Model ถูก
☐ Prop Slot ถูก
☐ Drawable ถูก
☐ Texture ถูก
☐ Collection ถูกถ้าใช้ Custom Collection
☐ Global/Local Index ไม่ปนกัน
☐ Clear Prop ได้
☐ Saved Outfit เก็บข้อมูลถูก
FiveM แยก Ped Prop Variations จาก World Objects และ Collection-based Props สามารถใช้ Local Collection Index ได้.
70. วิธี Debug Prop ไม่ขึ้นแบบเร็วที่สุด
ใช้ลำดับนี้
ขั้นที่ 1 — แยกประเภทก่อน
World Object?
หรือ
Ped Prop?
ขั้นที่ 2 — ถ้าเป็น World Object
ตรวจ Model → Load → CREATE_OBJECT.
ขั้นที่ 3 — ตรวจ Object Handle
ดูว่า Entity ถูกสร้างหรือไม่
ขั้นที่ 4 — ตรวจ Position
โดยเฉพาะ Z และความต่างระหว่าง CREATE_OBJECT กับ CREATE_OBJECT_NO_OFFSET.
ขั้นที่ 5 — ถ้า Attach กับ Player
ตรวจ GET_PED_BONE_INDEX และ ATTACH_ENTITY_TO_ENTITY.
ขั้นที่ 6 — ถ้าคนอื่นไม่เห็น
ตรวจ Local/Networked Entity และ Network ID.
ขั้นที่ 7 — ถ้า Prop ซ้ำ
ตรวจ Creation/Cleanup
ขั้นที่ 8 — ถ้าเป็น Ped Prop
ตรวจ SET_PED_PROP_INDEX.
ขั้นที่ 9 — ถ้า Custom Ped Prop เพี้ยนหลัง Update
ตรวจ Collection/Global Index.
ขั้นที่ 10 — Cleanup ให้ครบ
ใช้ Delete/Clear ตามประเภทของ Prop.
สิ่งที่ไม่ควรทำกับ FiveM Props
หลีกเลี่ยง
CreateObject ทุก Frame
ไม่เก็บ Object Handle
ไม่ลบ Prop หลังใช้งาน
ให้ทุก Client สร้าง Shared Prop ซ้ำกัน
ส่ง Local Entity Handle ไป Client อื่น
เก็บ Network ID เป็น Database ID ถาวร
Attach ทุก Prop กับ Bone เดียวกัน
ใช้ Ped Prop กับ Object Prop ปนกัน
Merge Props จำนวนมากโดยไม่ทดสอบ
Spawn Decoration ทั้งเมืองด้วย Script โดยไม่จำเป็น
โดยเฉพาะ Entity Handle และ Network ID ต้องแยกให้ชัด เพราะ Cfx.re ระบุว่า Handle เป็น Local ต่อ Client ส่วน Network ID ใช้สำหรับการอ้าง Networked Entity ข้าม Machines.
สูตรจำง่ายสำหรับ FiveM Props
ถ้าเป็นของที่อยู่ในโลกเกม
→ Object Prop
ถ้าเป็นของที่ผู้เล่นถือ
→ Object + Attach
ถ้าเป็นหมวก/แว่นใน Clothing System
→ Ped Prop
ถ้าทุกคนต้องเห็น Object เดียวกัน
→ Networked Prop
ถ้าเป็น Decoration ถาวรจำนวนมาก
→ พิจารณา Map Asset
สรุป FiveM Props คืออะไร และใช้งานอย่างไร
FiveM Props มี 2 ความหมายหลักที่ต้องแยกให้ออก
ความหมายแรกคือ Object Props ซึ่งเป็น Object Entities เช่นโต๊ะ กล่อง โทรศัพท์ ขวด หรืออุปกรณ์ประกอบ Gameplay โดยสร้างได้ด้วย
CREATE_OBJECT
หรือ
CREATE_OBJECT_NO_OFFSET
โดย CREATE_OBJECT มีพฤติกรรม Offset ตำแหน่ง Z ตาม Radius ของ Model ขณะที่ CREATE_OBJECT_NO_OFFSET วาง Center ของ Object ตรงตำแหน่งที่ระบุ.
ถ้าต้องการให้ผู้เล่นถือ Object สามารถใช้
GET_PED_BONE_INDEX
↓
ATTACH_ENTITY_TO_ENTITY
เพื่อ Attach Object เข้ากับ Bone ของ Ped พร้อมกำหนด Position และ Rotation Offsets.
เมื่อใช้งานเสร็จควร Cleanup ด้วย DELETE_OBJECT, DELETE_ENTITY หรือปล่อย Entity ด้วย SET_ENTITY_AS_NO_LONGER_NEEDED ตาม Lifecycle ที่ต้องการ.
ความหมายที่สองคือ Ped Props เช่นหมวกและ Accessories ในระบบ Character ซึ่งใช้
SET_PED_PROP_INDEX
และสามารถลบออกด้วย
CLEAR_PED_PROP
โดย Ped Prop IDs จะสัมพันธ์กับ Ped Model.
สำหรับ Custom Ped Props FiveM ยังมี Collection-based APIs และ SET_PED_COLLECTION_PROP_INDEX ซึ่งใช้ Local Collection Index แทน Global Index โดย Cfx.re ระบุว่า Collection-relative indexes มีความเสถียรหลัง GTA Title Updates มากกว่า Global Custom Index.
ถ้า Prop ผู้เล่นถืออยู่ผิดตำแหน่ง ให้ตรวจ Bone และ Offset
ถ้า Prop กลับด้าน ให้แก้ Rotation Offset
ถ้า Prop ซ้ำทุกครั้งที่เล่น Emote ให้ตรวจ Cleanup
ถ้า ผู้เล่นคนอื่นไม่เห็น Object ให้ตรวจ Local/Networked Entity และ Network ID
ถ้า หมวกหรือแว่น Custom เปลี่ยนตัวหลัง GTA Update ให้ตรวจ Global Index/Collection
และถ้า มี Decoration จำนวนมากที่ไม่เคยเปลี่ยนตาม Gameplay ควรพิจารณาว่าสิ่งเหล่านั้นควรอยู่ใน Map Asset Pipeline มากกว่าถูกสร้างเป็น Runtime Objects ทีละชิ้น
แนวทางของ comsiam คือแยก Props เป็น World Object, Attached Object และ Ped Prop ตั้งแต่เริ่มออกแบบ เพราะทั้งสามแบบอาจดูเหมือน “ของประกอบตัวละครหรือฉาก” เหมือนกัน แต่ใช้ Native, Networking และ Cleanup คนละวิธี การเลือกประเภทให้ถูกตั้งแต่ต้นจะลดทั้ง Object ซ้ำ ปัญหา Sync และ Entity ที่ค้างอยู่ใน Server ได้มาก
Comments
Post a Comment