查看: 268|回复: 0

[引擎的各个功能] 动画节点技术指南

[复制链接]

1

主题

342

帖子

7万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
75866
发表于 2017-4-8 07:06:42 | 显示全部楼层 |阅读模式

动画节点技术指南



       
     
     
     
       
     
         



       
动画节点技术指南




   
    本页面的内容:
   

   
                                                            
        动画节点剖析
                       
       
        节点层次结构

                                                        
        运行时节点
                       
       
        姿势输入
               
        属性和数据输入

                                                        
        编辑器节点
                       
       
        标题
               
        工具提示信息
               
        关联菜单

                                            


动画节点用于在Vim 蓝图
中执行
操作,比如混合姿势或直接操作骨骼。虽然仅提供了几个动画节点,
但是您可以创建自定义节点来满足任何游戏的需要。

动画节点剖析


动画节点由两部分组成:


一个运行时结构体,它执行真正的操作来生成输出姿势。


一个编辑器中使用的容器类,用于在图表中处理节点的显示效果和功能,
比如,节点标题和关联菜单。


要想添加一个新动画节点,就必须创建这两个部分内容。

节点层次结构


尽管可以创建节点的层次结构,但任何在编辑器中使用的非抽象类都应该正确地包含
一个运行时节点(当进行继承时不要添加任何额外的节点,除非父类是抽象类且没有包含任何节点)。
请参照
  1. UAnimGraphNode_BlendListBase
复制代码
获得示例。

运行时节点


运行时结构体继承于
  1. FAnimNode_Base
复制代码
,负责初始化、更新及操作一个或多个
输入姿势来生成期望的输出姿势。它还声明了节点执行期望操作所需的
任何输入姿势连接和属性。

姿势输入


在运行时节点中,通过创建
  1. FPoseLink
复制代码
  1. FComponentSpacePoseLink
复制代码
类型的属性来暴露姿势输入
。当在本地空间中应用姿势时使用
  1. FPoseLink
复制代码
,比如
混合动画。当在组件空间中应用姿势时使用
  1. FComponentSpacePoseLink
复制代码

比如,应用骨架控制器。


一个节点可以具有一个单独的姿势输入:


本地空间

  1. UPROPERTY(Category=Links)
  2. FPoseLink BasePose;
复制代码

动画节点技术指南



组件空间

  1. UPROPERTY(Category=Links)
  2. FComponentSpacePoseLink ComponentPose;
复制代码

动画节点技术指南



       
组件空间姿势引脚是蓝色的。



或者,节点也可以具有多个输入,用于混合多个动画:

  1. UPROPERTY(Category=Links)
  2. FPoseLink Base;
  3. UPROPERTY(Category=Links)
  4. FPoseLink Additive;
复制代码

动画节点技术指南



每个这样的属性都会导致显示一个姿势连接。这种类型的属性总是暴露为
输入引脚。这些引脚不能进行选择性地隐藏或仅用作 详细信息 面板中
的可编辑属性。

属性和数据输入


动画节点可以有多个属性(比如一个alpha 或 变换数据),用于执行节点的操作
。这些属性的声明方式和其他属性一样,使用
  1. UPROPERTY()
复制代码
宏进行声明。

  1. UPROPERTY(Category=Settings, meta(PinShownByDefault))
  2. mutable float Alpha;
复制代码

动画节点技术指南



通过使用特殊的元数据关键字,可以将动画节点的属性暴露为数据输入,从而可以向该
节点传入值。这允许节点的属性使用在节点之外计算的值。
以下是可用的元数据关键字:


       


       
       
  1. NeverAsPin
复制代码

               
               
                该属性不会暴露为数据引脚,其仅可以在角色编辑器的详细信息面板中进行编辑。
               
       

       
       
  1. PinHiddenByDefault
复制代码

               
               
                该属性可以暴露为数据引脚,但默认情况下是隐藏的 (请参照下面的可选引脚
部分)。
               
       

       
       
  1. PinShownByDefault
复制代码

               
               
                该属性可以暴露为数据引脚,且默认情况下是可见的 (请参照下面的可选引脚
部分)。
               
       

       
       
  1. AlwaysAsPin
复制代码

               
               
                该属性总是暴露为数据引脚。
               
       



       
可选引脚


       
对于使用
  1. PinHiddenByDefault
复制代码
  或
  1. PinShownByDefault
复制代码
定义的属性,在详细面板中的属性的旁边将
会显示一个复选框,以供您选择显示或隐藏它。



       
动画节点技术指南




编辑器节点


编辑器类继承于
  1. UAnimGraphNode_Base
复制代码
,负责类似于显示节点标题或
添加关联菜单动作这样的事情。


在编辑器中使用的类应该包含一个您的运行时节点的实例,且该实例暴露为可编辑状态。

  1. UPROPERTY(Category=Settings)
  2. FAnimNode_ApplyAdditive Node;
复制代码
标题


动画节点技术指南



在角色编辑器内的 动画蓝图 的图表中显示的动画节点的背景颜色和标题文本,
是通过重载
  1. GetNodeTitle()
复制代码
  1. GetNodeTitleColor()
复制代码
  函数定义的。


比如,
  1. UAnimGraphNode_ApplyAdditive
复制代码
节点使用灰色背景,且显示 "Apply Additive":

  1. FLinearColor UAnimGraphNode_ApplyAdditive::GetNodeTitleColor() const
  2. {
  3.     return FLinearColor(0.75f, 0.75f, 0.75f);
  4. }
  5. FString UAnimGraphNode_ApplyAdditive::GetNodeTitle(ENodeTitleType::Type TitleType) const
  6. {
  7.     return TEXT("Apply Additive");
  8. }
复制代码
工具提示信息


动画节点技术指南



在角色编辑器中,当鼠标悬停到节点上时显示的工具提示信息,该信息是通过重载
  1. GetTooltip()
复制代码
函数定义的。

  1. FString UAnimGraphNode_ApplyAdditive::GetTooltip() const
  2. {
  3.     return TEXT("Apply additive animation to normal pose");
  4. }
复制代码
关联菜单


每个动画节点可以添加节点相关的选项到关联菜单中,当您右击角色编辑器中的图表中的节点时会显示该
关联菜单。这些选项是通过
  1. GetContextMenuActions()
复制代码
函数添加的,该函数
是所有蓝图节点的成员函数。


动画节点技术指南



比如,
  1. UAnimGraphNode_LayeredBoneBlend
复制代码
节点添加菜单项,用于添加新的输入或删除现有输入:

  1. void UAnimGraphNode_LayeredBoneBlend::GetContextMenuActions(const FGraphNodeContextMenuBuilder& Context) const
  2. {
  3.     if (!Context.bIsDebugging)
  4.     {
  5.         if (Context.Pin != NULL)
  6.         {
  7.             // we only do this for normal BlendList/BlendList by enum, BlendList by Bool doesn't support add/remove pins
  8.             if (Context.Pin-Direction == EGPD_Input)
  9.             {
  10. //@TODO: Only offer this option on arrayed pins
  11. Context.MenuBuilder-BeginSection("AnimNodesLayeredBoneBlend", NSLOCTEXT("A3Nodes", "LayeredBoneBlend", "Layered Bone Blend").ToString());
  12. {
  13.     Context.MenuBuilder-AddMenuEntry(FGraphEditorCommands::Get().RemoveBlendListPin);
  14. }
  15. Context.MenuBuilder-EndSection();
  16.             }
  17.         }
  18.         else
  19.         {
  20.             Context.MenuBuilder-BeginSection("AnimNodesLayeredBoneBlend", NSLOCTEXT("A3Nodes", "LayeredBoneBlend", "Layered Bone Blend").ToString());
  21.             {
  22. Context.MenuBuilder-AddMenuEntry(FGraphEditorCommands::Get().AddBlendListPin);
  23.             }
  24.             Context.MenuBuilder-EndSection();
  25.         }
  26.     }
  27. }
复制代码





                                       
                                       
完整内容索引
                                       
                               
                       
                       
            

            
            

     2004-2017, Epic Games, Inc. 版权所有。Unreal 及相关的商标是 Epic 在美国和其他国家的注册商标。


    使用条款 | 隐私政策

            
        
               
       
   
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | enginedx注册

本版积分规则

 
 



邮件留言:


 
返回顶部