动画特征(骨骼动画)模型组件(AnimationModelComponent)

动画特征模型组件或者叫骨骼动画模型组件,是对模型组件的扩展。模型组件所支持的功能它都支持。

在模型组件的基础上,它支持骨骼动画文件(*.seq)的播放。您可在编辑器或代码中添加该组件或更改该组件的属性,包括变换属性、组件是否隐藏、组件的材质、加载骨骼动画/蒙太奇动画/融合动画和物理信息等。

1. 属性

对于其它基础属性,请参见模型组件

  • 变换与Actor常规设置详见EmptyActor

  • 动画模型:与静态模型组件一样,可以在这里指定一个[.mdl | .dressup]文件。

  • 动画:与静态模型组件不同的是这个动画属性。AnimationModelComponent支持播放骨骼动画,所以我们可以为该组件指定骨骼动画文件:

    预览动画

    • 自动播放:是否自动播放动画。勾选该选项后,在进入游戏场景时,动画会自动播放。

    • 列表循环:是否循环播放动画。勾选该选项后,在动画播放完成后,会自动从头进行播放。

    • 效果预览:这个是编辑器的预览按钮,不会影响到场景的编辑。点击按钮来预览动画效果。

    • 播放模式:在指定了多个动画时,效果预览的播放顺序(按顺序播放或随机播放)

  • 换装: 可以给Actor添加, 删除和修改皮肤.
    如果模型资源是.dressup文件, 是支持换装功能的. alt
    • Skin文件: 可是给模型指定皮肤(指定不合适的皮肤时, 是无法设置成功的).
    • 皮肤列表: 可以设置皮肤是否激活.

2. 在代码中获取

在获取到Actor之后我们可以设置Actor变换属性, 通过Actor我们可以获取到AnimatableModelComponent.

---创建一个Actor
---@type XEAnimationMeshActor
local pActor = pWorld:CreateActor(XEAnimationMeshActor.ACTOR_TYPENAME)
---获取Actor的组件
---@type XEAnimatableModelComponent
local pComponent = pActor:GetRootComponent()

AnimatableModelComponent中最重要的功能就是播放动画, 并且可以播放两种类型的动画, 普通的骨骼动画和蒙太奇动画.
AnimatableModelComponent播放动画有两种方式, 一种是播放AnimationPlayList中的动画, 另一种用XEAnimController播放动画, 代码如下:

---播放动画的两种方式: 
---1. 使用AnimationList播放 这里需要在场景中或者代码中想AnimPlayList中添加动画资源
pComponent:GetAnimPlayList():AddAnimWrapper(szSeqPath)
---1.1 播放
pComponent:GetAnimPlayList():Play()
---1.2 停止
pComponent:GetAnimPlayList():Stop()

---2. 使用XEAnimController播放动画 需要在代码中加载动画资源
---2.1 加载AnimController
XEAnimController:LoadAnimation(szAnimAsset, pComponent)
---2.2 获取AnimController
local pAnimController = pComponent:GetAnimController()
---2.3开始播放
pAnimController:Play()
---设置是否循环
pAnimController:SetLoop(false)
---设置播放速率
pAnimController:SetPlayRate(1)

---停止播放
pAnimController:Stop()

上边我们知道了动画如何播放和停止, 很多时候我们不仅需要简单的播放动画, 还需要在动画播放完或者开始播放的时候做一些事情, 所以我们引擎提供了动画播放监听器, 具体的使用方法如下:

---添加监听器
local listener = xe.AnimationPlayListener:Create()
---第一个参数为监听回调函数 第二个参数为监听类型
        listener:RegisterHandler(function()
            print("走到回调了!")
            ---在回调中删除监听器
            self.pAnimComponent:GetAnimController():RemoveListener(listener)
        end, xe.Handler.XEANIMATIONPLAY_ONETIMEFINISHED_CALLNACK)
---给控制器添加监听器
pAnimController:AddListener(listener)

如果我们的游戏需要模型换衣服的话, 可以使用模型的换装功能, 值得注意的是: 我们需要给模型加载.dressup文件之后才能启用换装功能. 加载.dressup文件和加载.mdl文件是一样的.

---换装
---想要换装的话需要给模型加载dressup文件, mdl文件是不支持换装的. 
pComponent:LoadAsset("XXX.dressup")

当我们给模型加载好.dressup文件之后, 需要获取到模型的IXEDressup对象, 通过IXEDressup对象进行换装, 以及获取装扮信息等操作.

local pDressUp = pComponent:GetDressUp()

获取到IXEDressup之后, 我们就可以对模型进行添加皮肤和删除皮肤等操作等处理.

---调用调用XEAnimatableModelComponent:GetDressup():AddSkin()方法给模型添加皮肤
pDressUp:AddSkin("XXX.ski")
---调用XEAnimatableModelComponent:GetDressup():RemoveSkin()方法给模型删除皮肤
pDressUp:Remove("XXX.ski)

仅仅添加皮肤和删除皮肤是不够的, 我们有时也需要知道模型身上有哪些皮肤, 我们可以获取到模型皮肤的数量, 可以通过索引获取到模型身上的皮肤对象, 再通过皮肤对象对皮肤对象进行操作.

---获取皮肤数量 通过GetSkinModel方法获取到换装的模型 可以获取皮肤数量
local nSkinNum = pDressUp:GetSkinModel():GetSkinNum()
---根据索引获取皮肤对象
local pSkin = pDressUp:GetSkinModel():GetSkin(index)
---获取皮肤资源路径
local szSkinAsset = pSkin:GetSkinFile()

对于换装操作, 我们可以删除一件皮肤, 然后再添加一件皮肤, 也可以直接使用ReplaceSkin的方法实现换装.

---换装
pDressUp:ReplaceSkin(szSkinAsset, szNewAsset)

只有换装和播放动作是不够的, 我们有时也需要判断在点击屏幕时是否点击到了模型, XEActor:RayPick(vScreenPoint, pViewPort)可以判断有没有点击到Actor

local hr = pActor:RayPick(vTouchPos, pWorld:GetAttachedViewport())
if hr.bBlockingHit == 1 then
    ---点击到了!
    ---hr.pActor 是当前点击到的Actor
end

2.1. 添加挂点

有些时候我们可能需要用到将一个Actor挂到另一个Actor身上的某个部位,例如将相机Actor挂到一个动画模型的手上,让他变成真正的相机师傅。或者实现一个小人手里捧着手枪摇身变成军人。这些都需要将相机Actor或者StaticActor或者AnimationModelActor绑定到另一个AnimationMeshActor的某个位置上,从而实现小人拿着一个模型的效果。
我们引擎支持编辑挂点文件,(详情请查看:挂点编辑器)给Actor加载挂点文件后,通过获取Actor的挂点信息,信息中记录了所有的挂点名,以及挂点对应的骨骼,以及便宜位置,朝向,缩放等。然后将其他Actor挂到对应的挂点上。
alt
下边我们用代码来演示一下如何获取挂点, 以及将Actor挂到挂点上。

    ---第一步: 加载挂点文件
    ---第一个参数是挂点文件路径
    ---第二个参数是是否重新加载挂点文件
    pComponent:AttachMounterAsset(szMounterPath, bReloadAsset)
    ---第二步: 获取Actor的骨架
    local pSkeletonIns = pComponent:GetXESkeletonInstance()
    ---第三步: 通过挂点名找到挂点对象
    local pBindSocketIns = pSkeletonIns:GetBindSocketIns();
    ---第四步: 将模型挂到模型组件上
    ---第一个参数: 加载的模型资源
    ---第二个参数: 加载的模型组件类型
    ---第三个参数: 加载的模型默认动画
    pBindSockerIns:UpdateAttachComponent("*.mdl", XEStaticMeshComponent.Component_TYPENAME, nil);
    ---可以获取到挂在骨骼上的组件指针
    pBindSocketIns:GetAttachComponent()
@Copyright © cosmos 2019 all right reserved,powered by Gitbook修订时间: 2021-04-12 18:28:14

results matching ""

    No results matching ""