Files
UnrealEngineUWP/Engine/Documentation/Source/Programming/Animation/AnimNodes/CreatingAnimNodes.CHN.udn
Ben Marsh 49831a5631 Include documentation source in repository.
[CL 2489162 by Ben Marsh in Main branch]
2015-03-24 08:35:52 -04:00

191 lines
8.8 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Availability:Public
Title: 动画节点技术指南
Crumbs: %ROOT%, Engine, Engine/Animation
Description: 关于创建在Vim蓝图的图表中应用的节点的指南。
[REGION:banner]
![Anim Nodes](animnodes_banner.png)(convert:false)
[/REGION]
[TOC(start:2)]
动画节点用于在[_Vim 蓝图_](Engine/Animation/AnimBlueprints)中执行
操作,比如混合姿势或直接操作骨骼。虽然仅提供了几个动画节点,
但是您可以创建自定义节点来满足任何游戏的需要。
## 动画节点剖析
动画节点由两部分组成:
* 一个运行时结构体,它执行真正的操作来生成输出姿势。
* 一个编辑器中使用的容器类,用于在图表中处理节点的显示效果和功能,
比如,节点标题和关联菜单。
要想添加一个新动画节点,就必须创建这两个部分内容。
### 节点层次结构
尽管可以创建节点的层次结构,但任何在编辑器中使用的非抽象类都应该正确地包含
一个运行时节点(当进行继承时不要添加任何额外的节点,除非父类是抽象类且没有包含任何节点)。
请参照 `UAnimGraphNode_BlendListBase` 获得示例。
## 运行时节点
运行时结构体继承于 `FAnimNode_Base` ,负责初始化、更新及操作一个或多个
输入姿势来生成期望的输出姿势。它还声明了节点执行期望操作所需的
任何输入姿势连接和属性。
### 姿势输入
在运行时节点中,通过创建 `FPoseLink` 或 `FComponentSpacePoseLink` 类型的属性来暴露姿势输入
。当在本地空间中应用姿势时使用 `FPoseLink`,比如
混合动画。当在组件空间中应用姿势时使用 `FComponentSpacePoseLink` 。
比如,应用骨架控制器。
一个节点可以具有一个单独的姿势输入:
**本地空间**
UPROPERTY(Category=Links)
FPoseLink BasePose;
![Pose Input Pin](node_posepin.png)
**组件空间**
UPROPERTY(Category=Links)
FComponentSpacePoseLink ComponentPose;
![Pose Input Pins](node_posepin_component.png)
[REGION:caption]
组件空间姿势引脚是蓝色的。
[/REGION]
或者,节点也可以具有多个输入,用于混合多个动画:
UPROPERTY(Category=Links)
FPoseLink Base;
UPROPERTY(Category=Links)
FPoseLink Additive;
![Pose Input Pins](node_posepin_multiple.png)
每个这样的属性都会导致显示一个姿势连接。这种类型的属性总是暴露为
输入引脚。这些引脚不能进行选择性地隐藏或仅用作 **详细信息** 面板中
的可编辑属性。
### 属性和数据输入
动画节点可以有多个属性比如一个alpha 或 变换数据),用于执行节点的操作
。这些属性的声明方式和其他属性一样,使用
`UPROPERTY()` 宏进行声明。
UPROPERTY(Category=Settings, meta(PinShownByDefault))
mutable float Alpha;
![Property Pin](node_propertypin.png)
通过使用特殊的元数据关键字,可以将动画节点的属性暴露为数据输入,从而可以向该
节点传入值。这允许节点的属性使用在节点之外计算的值。
以下是可用的元数据关键字:
| 元数据| 描述|
| -------- | ----------- |
| `NeverAsPin` | 该属性不会暴露为数据引脚,其仅可以在角色编辑器的详细信息面板中进行编辑。|
| `PinHiddenByDefault` | 该属性可以暴露为数据引脚,但默认情况下是隐藏的 (请参照下面的[可选引脚](#OptionalPins)部分)。|
| `PinShownByDefault` | 该属性可以暴露为数据引脚,且默认情况下是可见的 (请参照下面的[可选引脚](#OptionalPins) 部分)。|
| `AlwaysAsPin` | 该属性总是暴露为数据引脚。|
(#OptionalPins)
[REGION:note]
**可选引脚**
[REGION:none]
对于使用 `PinHiddenByDefault` 或 `PinShownByDefault` 定义的属性,在详细面板中的属性的旁边将
会显示一个复选框,以供您选择显示或隐藏它。
[/REGION]
[REGION:none]
![Property Details](node_property_details.png)
[/REGION]
[/REGION]
## 编辑器节点
编辑器类继承于 `UAnimGraphNode_Base` ,负责类似于显示节点标题或
添加关联菜单动作这样的事情。
在编辑器中使用的类应该包含一个您的运行时节点的实例,且该实例暴露为可编辑状态。
UPROPERTY(Category=Settings)
FAnimNode_ApplyAdditive Node;
### 标题
![Node Title](node_title.png)
在角色编辑器内的 _动画蓝图_ 的图表中显示的动画节点的背景颜色和标题文本,
是通过重载 `GetNodeTitle()` 和 `GetNodeTitleColor()` 函数定义的。
比如, `UAnimGraphNode_ApplyAdditive` 节点使用灰色背景,且显示 "Apply Additive":
FLinearColor UAnimGraphNode_ApplyAdditive::GetNodeTitleColor() const
{
return FLinearColor(0.75f, 0.75f, 0.75f);
}
FString UAnimGraphNode_ApplyAdditive::GetNodeTitle(ENodeTitleType::Type TitleType) const
{
return TEXT("Apply Additive");
}
### 工具提示信息
![Node Tooltip](node_tooltip.png)
在角色编辑器中,当鼠标悬停到节点上时显示的工具提示信息,该信息是通过重载 `GetTooltip()` 函数定义的。
FString UAnimGraphNode_ApplyAdditive::GetTooltip() const
{
return TEXT("Apply additive animation to normal pose");
}
### 关联菜单
每个动画节点可以添加节点相关的选项到关联菜单中,当您右击角色编辑器中的图表中的节点时会显示该
关联菜单。这些选项是通过 `GetContextMenuActions()` 函数添加的,该函数
是所有蓝图节点的成员函数。
![Node Context Menu Entry](node_menu.png)
比如, `UAnimGraphNode_LayeredBoneBlend` 节点添加菜单项,用于添加新的输入或删除现有输入:
void UAnimGraphNode_LayeredBoneBlend::GetContextMenuActions(const FGraphNodeContextMenuBuilder& Context) const
{
if (!Context.bIsDebugging)
{
if (Context.Pin != NULL)
{
// we only do this for normal BlendList/BlendList by enum, BlendList by Bool doesn't support add/remove pins
if (Context.Pin->Direction == EGPD_Input)
{
//@TODO: Only offer this option on arrayed pins
Context.MenuBuilder->BeginSection("AnimNodesLayeredBoneBlend", NSLOCTEXT("A3Nodes", "LayeredBoneBlend", "Layered Bone Blend").ToString());
{
Context.MenuBuilder->AddMenuEntry(FGraphEditorCommands::Get().RemoveBlendListPin);
}
Context.MenuBuilder->EndSection();
}
}
else
{
Context.MenuBuilder->BeginSection("AnimNodesLayeredBoneBlend", NSLOCTEXT("A3Nodes", "LayeredBoneBlend", "Layered Bone Blend").ToString());
{
Context.MenuBuilder->AddMenuEntry(FGraphEditorCommands::Get().AddBlendListPin);
}
Context.MenuBuilder->EndSection();
}
}
}