如何给骨骼添加部件或移除指定部件

给骨骼添加部件

开发者可以通过给节点添加绑点,绑定模型来实现给骨骼添加部件的效果。

一、开发者可以通过 studio 直接添加绑点节点,然后修改绑点的骨骼属性的 modelid 来实现
  1. 在 场景管理器 窗口中,创建一个 Model 对象。

  2. 将鼠标悬停在该对象上并单击圆圈 按钮。

  3. 在弹出菜单中找到 BindAttachment 并选择它,这将在这个Model对象上创建一个绑点对象。

    workspace_add_bind

  4. 选中BindAttachment对象,重命名为RightHand

  5. 修改RightHandBoneName 属性和 ModelId 属性

    • BoneName 属性设置为 101(系统模型默认值指向右手,也可以自定义)

      • BoneName = 101 (右手)

        bind_bone_name_101

      • BoneName = 106(头部)

        bind_bone_name_106

    • ModelId 属性修改为手持模型(独眼萌宠)

      bind_bone_modelid

二、开发者也可以通过代码创建模型对象的绑点对象,通过修改绑点对象的子节点模型来实现

给玩家添加部件,代码示例

  1. 获取当前玩家的 Character

    local myCharacter = game:GetService("Players").LocalPlayer.Character;
    
  2. 创建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
    
  3. 给玩家绑定模型部件,指定参数(模型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
    
  4. 运行结果

    • BoneName = 101 (右手)

      bind_script_hand_101

    • BoneName = 106(头部)

      bind_script_head_106

移除指定部件

移除对象可以通过设置它的Parent=nil来移除。如果这个对象具有多个子部件,要移除其中某一个,可以通过获取该模型对象的所有子节点(包括绑定的子节点),遍历该节点(创建时定义的绑点名)找到需要移除的指定节点。

代码示例:移除绑定的rightHand绑点对象

function RemoveBone()
    for i, v in ipairs(myCharacter.Children) do
       if v.Name == "rightHand" then
          v.Parent = nil
       end
    end
end

写一个键盘事件用来测试移除

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

inputService.InputBegan:Connect( UserInputBegan )
Last Updated: