You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
191 lines
8.8 KiB
Plaintext
191 lines
8.8 KiB
Plaintext
Availability:Public
|
||
Title: 动画节点技术指南
|
||
Crumbs: %ROOT%, Engine, Engine/Animation
|
||
Description: 关于创建在Vim蓝图的图表中应用的节点的指南。
|
||
|
||
[REGION:banner]
|
||
(convert:false)
|
||
[/REGION]
|
||
|
||
[TOC(start:2)]
|
||
|
||
动画节点用于在[_Vim 蓝图_](Engine/Animation/AnimBlueprints)中执行
|
||
操作,比如混合姿势或直接操作骨骼。虽然仅提供了几个动画节点,
|
||
但是您可以创建自定义节点来满足任何游戏的需要。
|
||
|
||
## 动画节点剖析
|
||
|
||
动画节点由两部分组成:
|
||
|
||
* 一个运行时结构体,它执行真正的操作来生成输出姿势。
|
||
* 一个编辑器中使用的容器类,用于在图表中处理节点的显示效果和功能,
|
||
比如,节点标题和关联菜单。
|
||
|
||
|
||
要想添加一个新动画节点,就必须创建这两个部分内容。
|
||
|
||
### 节点层次结构
|
||
|
||
尽管可以创建节点的层次结构,但任何在编辑器中使用的非抽象类都应该正确地包含
|
||
一个运行时节点(当进行继承时不要添加任何额外的节点,除非父类是抽象类且没有包含任何节点)。
|
||
请参照 `UAnimGraphNode_BlendListBase` 获得示例。
|
||
|
||
## 运行时节点
|
||
|
||
运行时结构体继承于 `FAnimNode_Base` ,负责初始化、更新及操作一个或多个
|
||
输入姿势来生成期望的输出姿势。它还声明了节点执行期望操作所需的
|
||
任何输入姿势连接和属性。
|
||
|
||
### 姿势输入
|
||
|
||
在运行时节点中,通过创建 `FPoseLink` 或 `FComponentSpacePoseLink` 类型的属性来暴露姿势输入
|
||
。当在本地空间中应用姿势时使用 `FPoseLink`,比如
|
||
混合动画。当在组件空间中应用姿势时使用 `FComponentSpacePoseLink` 。
|
||
比如,应用骨架控制器。
|
||
|
||
一个节点可以具有一个单独的姿势输入:
|
||
|
||
**本地空间**
|
||
|
||
UPROPERTY(Category=Links)
|
||
FPoseLink BasePose;
|
||
|
||

|
||
|
||
**组件空间**
|
||
|
||
UPROPERTY(Category=Links)
|
||
FComponentSpacePoseLink ComponentPose;
|
||
|
||

|
||
[REGION:caption]
|
||
组件空间姿势引脚是蓝色的。
|
||
[/REGION]
|
||
|
||
或者,节点也可以具有多个输入,用于混合多个动画:
|
||
|
||
UPROPERTY(Category=Links)
|
||
FPoseLink Base;
|
||
|
||
UPROPERTY(Category=Links)
|
||
FPoseLink Additive;
|
||
|
||

|
||
|
||
每个这样的属性都会导致显示一个姿势连接。这种类型的属性总是暴露为
|
||
输入引脚。这些引脚不能进行选择性地隐藏或仅用作 **详细信息** 面板中
|
||
的可编辑属性。
|
||
|
||
### 属性和数据输入
|
||
|
||
动画节点可以有多个属性(比如一个alpha 或 变换数据),用于执行节点的操作
|
||
。这些属性的声明方式和其他属性一样,使用
|
||
`UPROPERTY()` 宏进行声明。
|
||
|
||
UPROPERTY(Category=Settings, meta(PinShownByDefault))
|
||
mutable float Alpha;
|
||
|
||

|
||
|
||
通过使用特殊的元数据关键字,可以将动画节点的属性暴露为数据输入,从而可以向该
|
||
节点传入值。这允许节点的属性使用在节点之外计算的值。
|
||
以下是可用的元数据关键字:
|
||
|
||
| 元数据| 描述|
|
||
| -------- | ----------- |
|
||
| `NeverAsPin` | 该属性不会暴露为数据引脚,其仅可以在角色编辑器的详细信息面板中进行编辑。|
|
||
| `PinHiddenByDefault` | 该属性可以暴露为数据引脚,但默认情况下是隐藏的 (请参照下面的[可选引脚](#OptionalPins)部分)。|
|
||
| `PinShownByDefault` | 该属性可以暴露为数据引脚,且默认情况下是可见的 (请参照下面的[可选引脚](#OptionalPins) 部分)。|
|
||
| `AlwaysAsPin` | 该属性总是暴露为数据引脚。|
|
||
|
||
(#OptionalPins)
|
||
[REGION:note]
|
||
**可选引脚**
|
||
[REGION:none]
|
||
对于使用 `PinHiddenByDefault` 或 `PinShownByDefault` 定义的属性,在详细面板中的属性的旁边将
|
||
会显示一个复选框,以供您选择显示或隐藏它。
|
||
[/REGION]
|
||
[REGION:none]
|
||

|
||
[/REGION]
|
||
|
||
[/REGION]
|
||
|
||
## 编辑器节点
|
||
|
||
编辑器类继承于 `UAnimGraphNode_Base` ,负责类似于显示节点标题或
|
||
添加关联菜单动作这样的事情。
|
||
|
||
在编辑器中使用的类应该包含一个您的运行时节点的实例,且该实例暴露为可编辑状态。
|
||
|
||
UPROPERTY(Category=Settings)
|
||
FAnimNode_ApplyAdditive Node;
|
||
|
||
### 标题
|
||
|
||

|
||
|
||
在角色编辑器内的 _动画蓝图_ 的图表中显示的动画节点的背景颜色和标题文本,
|
||
是通过重载 `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");
|
||
}
|
||
|
||
### 工具提示信息
|
||
|
||

|
||
|
||
在角色编辑器中,当鼠标悬停到节点上时显示的工具提示信息,该信息是通过重载 `GetTooltip()` 函数定义的。
|
||
|
||
FString UAnimGraphNode_ApplyAdditive::GetTooltip() const
|
||
{
|
||
return TEXT("Apply additive animation to normal pose");
|
||
}
|
||
|
||
### 关联菜单
|
||
|
||
每个动画节点可以添加节点相关的选项到关联菜单中,当您右击角色编辑器中的图表中的节点时会显示该
|
||
关联菜单。这些选项是通过 `GetContextMenuActions()` 函数添加的,该函数
|
||
是所有蓝图节点的成员函数。
|
||
|
||

|
||
|
||
比如, `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();
|
||
}
|
||
}
|
||
}
|