给骨骼添加部件
开发者可以通过给节点添加绑点,绑定模型来实现给骨骼添加部件的效果。
一、开发者可以通过 studio 直接添加绑点节点,然后修改绑点的骨骼属性的 modelid 来实现
BoneName |
表示部位 |
应用场景 |
100 |
左手 |
武器/道具 |
101 |
右手 |
武器/道具 |
102 |
左脚 |
鞋子 |
103 |
右脚 |
鞋子 |
105 |
胸口 |
胸甲 |
106 |
头部 |
头盔 |
107 |
帽子 |
帽子 |
109 |
脚下 |
脚踩道具 |
在 场景管理器 窗口中,创建一个 Model 对象。
将鼠标悬停在该对象上并单击圆圈 ⊕ 按钮。
在弹出菜单中找到 BindAttachment 并选择它,这将在这个Model对象上创建一个绑点对象。
选中BindAttachment对象,重命名为RightHand
修改RightHand的 BoneName 属性和 ModelId 属性
BoneName 属性设置为 101(系统模型默认值指向右手,也可以自定义)
BoneName = 101 (右手)
BoneName = 106(头部)
ModelId 属性修改为手持模型(钻石)
二、开发者也可以通过代码创建模型对象的绑点对象,通过修改绑点对象的子节点模型来实现
给玩家添加部件,代码示例
获取当前玩家的 Character
local myCharacter = game:GetService("Players").LocalPlayer.Character;
创建Actor模型,指定参数(模型id,父节点)
function CreatedActor(modeid,parent)
local actor = SandboxNode.new('Actor', parent)
actor.ModelId = modeid;
local pos = myCharacter.Position
local offsetX = math.random(-2000, 2000)
local offsetZ = math.random(-2000, 2000)
actor.Position = Vector3.new(pos.x + offsetX, pos.y+200, pos.z + offsetZ);
actor.Health = 100
actor.MaxHealth = 200;
actor.Movespeed = 10;
return actor;
end
给玩家绑定模型部件,指定参数(模型id,骨骼key)
function ActorBindBone(modeid,boneName)
--给模型设置绑点
local attachment= SandboxNode.new('BindAttachment', myCharacter)
attachment.BoneName = boneName
attachment.Name = "rightHand"
attachment.LocalPosition = Vector3.new(0, 0, 0)
attachment.LocalScale = Vector3.new(1, 1, 1)
local ModelId = string.format("sandboxSysId://entity/%d/body.omod",modeid);
local actor = CreatedActor(ModelId,attachment)
actor.LocalEuler = Vector3.New(90, 90, 0)
actor.LocalPosition = Vector3.new(-80.00, 0, 120.00)
end
运行结果
BoneName = 101 (右手)
BoneName = 106(头部)
移除指定部件
移除对象可以通过设置它的Parent=nil来移除。如果这个对象具有多个子部件,要移除其中某一个,可以通过获取该模型对象的所有子节点(包括绑定的子节点),遍历该节点(创建时定义的绑点名)找到需要移除的指定节点。
代码示例:移除绑定的rightHand绑点对象
function RemoveBone()
for i, v in ipairs(myCharacter.Children) do
if v.Name == "rightHand" then
v.Parent = nil
end
endend
写一个键盘事件用来测试移除
local inputService = game:GetService("UserInputService");
function UserInputBegan(inputObj)
if inputObj.UserInputType == Enum.UserInputType.Keyboard.Value then
local nKey = inputObj.KeyCode
if(nKey==103)then --G
RemoveBone()
end
endend
inputService.InputBegan:Connect( UserInputBegan )