如何在Garry的模组中将多个模型附加到一个实体上?

我想要创建一个脚本实体,它看起来像图片左边一样,将几个模型组合在一起:设备架、电脑屏幕、键盘、电池等。

我想要使用Lua脚本完成这个操作,而不是使用Blender将这些模型合并在一起。

我该如何做到这一点呢?

左图:几个Half-Life 2模型组合在一起,创建一个更复杂的对象。右图:单独的基础模型。

点赞
用户9068464
用户9068464

如果你有两个不同的模型:

  • models/machine/machime.mdl
  • models/rack/rack.mdl

你可以创建两个实体:

  1. 机器实体

    1.1 lua/entities/machine/init.lua

    AddCSLuaFile( "cl_init.lua" )
    AddCSLuaFile( "shared.lua" )
    
    include('shared.lua')
    
    function ENT:Initialize()
        self:SetModel("models/machime/machime.mdl")
        self:PhysicsInit(SOLID_VPHYSICS)
        self:SetMoveType(MOVETYPE_VPHYSICS)
        self:SetSolid(SOLID_VPHYSICS)
    
        local phys = self:GetPhysicsObject()
    
        if phys:IsValid() then
           phys:Wake()
        end
    end
    

    1.2 lua/entities/machine/cl_init.lua

    include('shared.lua')
    
    function ENT:Draw()
       self:DrawModel()
    end
    

    1.3 lua/entities/machine/shared.lua

    ENT.Type = "anim"
    ENT.Base = "base_gmodentity"
    
    ENT.AdminOnly   = false
    ENT.Spawnable   = true
    ENT.PrintName   = "My machine"
    ENT.Purpose     = "This is a really good machine"
    
  2. 机架实体

    2.1 lua/entities/rack/init.lua

    AddCSLuaFile( "cl_init.lua" )
    AddCSLuaFile( "shared.lua" )
    
    include('shared.lua')
    
    function ENT:Initialize()
        self:SetModel("models/rack/rack.mdl")
        self:PhysicsInit(SOLID_VPHYSICS)
        self:SetMoveType(MOVETYPE_VPHYSICS)
        self:SetSolid(SOLID_VPHYSICS)
    
        local phys = self:GetPhysicsObject()
    
        if phys:IsValid() then
           phys:Wake()
        end
    end
    

    2.2 lua/entities/rack/cl_init.lua

    include('shared.lua')
    
    function ENT:Draw()
       self:DrawModel()
    end
    

    2.3 lua/entities/rack/shared.lua

    ENT.Type = "anim"
    ENT.Base = "base_gmodentity"
    
    ENT.AdminOnly   = false
    ENT.Spawnable   = true
    ENT.PrintName   = "My rack"
    ENT.Purpose     = "To rack them all"
    

最后,想把机架放进机器里,可以使用 ENT:SetParent

local machine = ents.Create("machine") -- 创建一个新机器实体
machine:SetPos(THE_POSITION) -- 更改生成位置
machine:Spawn() -- 生成它

local rack = ents.Create("rack") -- 创建一个机架实体
rack:SetParent(machine) -- 将父项设置为机器
rack:SetLocalPos(THE_LOCAL_POS) -- 机架相对于机器的位置
rack:Spawn() -- 生成它

注:在最后一个部分的例子中,生成并将机架放入机器中。也可以使用ShouldCollide 钩子,在它们即将碰撞时将机架放入机器中!

2021-09-09 18:15:08