动作

  • 类型:Animation

简介

作用

动作是控制角色在满足特定条件下播放什么动画的对象。

创建和使用

玩家可以在工作区或角色对象下创建动作对象。
通常情况下,动作对象放在相应的角色对象下即可被该角色调用。
动作对象也可放在角色子级的动作文件夹、 角色配件 或者 工具 下。
动作与角色状态分开,只记录玩家在动作编辑器中编辑动作的骨骼,未编辑动作的骨骼不会记录关键帧信息。
动作的优先级由低到高是:待机(Idle);运动(Movement);姿势(Pose);动作(Action)。高优先级的动作会覆盖低优先级的相同骨骼的动作,如果高优先级的动作中没有编辑某些骨骼的动作,则播放高优先级动作时,未编辑骨骼的动作仍表现为低优先级动作。
如果想要替换动作对象中的动作资源,玩家可以利用编辑器自带的动作编辑器编辑动作并上传到素材箱,也可以点击动作资源ID后面的“+”标志,选择素材箱中的动作或导入.RW格式的动作文件,新导入的动作文件会直接替换现有的动作资源。
除了传统的动作编辑功能,动作编辑器还提供利用动作捕捉制作动作的功能。

特点和注意事项

动作的优先级与权重系统相互搭配实现了更加全面的功能。动作的每次播放都涉及权重的变化,动作播放时在过渡时间内由当前权重线性变为目标权重。权重决定了动作的播放程度。
所以多动作融合和动作之间过渡的原理就是通过控制动作权重的变化来实现融合。多动作同时播放时的权重计算涉及到动作播放的先后顺序。以A,B,C三个动作依次播放为例:
C的播放程度为:C.CurrentWeight
B的播放程度为:B.CurrentWeight * (1-C.CurrentWeight)
A的播放程度为:A.CurrentWeight * (1-C.CurrentWeight-B.CurrentWeight * (1-C.CurrentWeight))

其他相关

角色动作
动作捕捉功能

相关链接

  • 教学视频

属性

    ClipId     动作资源ID   PathObject   
    动作文件的唯一标识

    AnimationPriority     优先级   enum   
    动作的优先级

    Speed     播放速度   float   
    动画播放的速度

    TransitionTime     过渡时间   string   
    动作权重变化的时间

    TargetWeight     目标权重   int   
    动作权重将要变成的目标值

    Loop     动作循环   bool   
    控制动作是否循环播放

    CurrentWeight     当前权重   int    [只读]
    动作权重的当前值

    IsAnimationPlaying     是否正在播放   bool    [只读]
    当前动画是否正在播放

    AnimationLength     动画长度   float    [只读]
    动画长度,单位秒

    AnimationTimePosition     播放时间点   float    [只读]
    当前动画播放到的时间点

继承自RWObject

    Name     名称   string   
    该对象的自定义名称

    ClassName     类型   string   
    该对象对应的对象类型名称

    Parent     父级   RWObject   
    该对象的父级对象

    Cloneable     能否克隆   bool   
    该对象是否可以通过Clone函数克隆

函数

    AdjustSpeed(Speed)
    修改动作的播放速度

    AdjustPriority(AnimationPriority)
    修改动作的优先级

    AdjustWeight(TargetWeight,TransitionTime)
    修改动作的权重

    AdjustPlayAnimation(TransitionTime,TargetWeight,Speed,Loop,AnimationPriority)
    逆向同步播放当前动画

    AdjustStopAnimation(TransitionTime)
    逆向停止播放当前动画

    PlayAnimation()
    播放当前动画

    StopAnimation()
    停止播放当前动画

    GetAnimationEvent(eventName)
    获取动作中事件

继承自RWObject

    DelAllChild()
    删除所有子对象

    Available()
    检查对象是否可用

    Clone(parent)
    复制自身,若有参数则以参数为父级

    Destroy()
    删除自身

    GetAncestorByName(Name)
    通过对象名字寻找父级对象

    GetAncestorByClassName(className)
    通过对象类型寻找父级对象

    GetChildByName(Name,recursive)
    通过对象名字寻找子级对象

    GetChildByClassName(className,recursive)
    通过对象类型寻找子级对象

    GetAllChild()
    寻找自身所有子级对象,并作为一个列表返回

    GetAllDescendant()
    递归寻找自身所有后代,并作为一个列表返回

    IsAncestor(TarObj)
    判断自身是否为目标对象的祖先

    IsDescendant(TarObj)
    判断自身是否为目标对象的后代

    WaitForChild(childName,timeout)
    寻找自身的子对象。如果没有子对象,在没有填写timeout参数时,会暂停进程直到找到子对象;如果填写了timeout参数,会根据参数时间暂停进程,超出参数时间后,进程照常进行

    Child(childName)
    根据给定的名字寻找自身的子对象

    Equals(TarObj)
    判断自身是否为目标对象,结果为真返回True,结果为假返回False;注意克隆、新建同类型、同名对象,equal结果均为假

    IsClass(className)
    判断自身是否为给定的对象类型

事件

    AnimationLoop()
    动画循环播放完毕,下一次循环开始前,触发此事件

    AnimationComplete()
    动画播放完毕后,触发此事件

    onAvatarAnimationPlayed()
    角色动画播放时,触发此事件

    LoadComplete()
    目标对象所使用的资源加载完成时触发该事件

继承自RWObject

    Destroyed()
    删除自身时触发

    ChildAdded(childobject)
    添加子对象时触发

    ChildRemoved(childobject)
    移除子对象时触发

    DescendantAdded(descendantobject)
    添加后代时触发

    DescendantRemoved(descendantobject)
    移除后代时触发

    AncestryChanged(AncestryChanged)
    祖先变更时触发

文档更新时间: 2021-01-14 20:05   作者:刘征