NextAnim是一个根据配置生成AnimBlueprint的插件
使用
- 使用UNextAnimConfigStrategy.Build方法,传入配置信息来生成ABP,这是入口方法
auto Strategy = NewObject<UNextAnimConfigStrategy>();
Strategy->Build(Row);
数据结构
FNextAnimRow
- 生成一个ABP所需的数据
struct FNextAnimRow : public FTableRowBase
{
GENERATED_USTRUCT_BODY()
public:
FString Name;
FString TargetPath;
TSoftObjectPtr<USkeleton> Skeleton;
TSubclassOf<UAnimInstance> ParentClass;
TArray<FNextAnimState> States;
TArray<FNextAnimStateRelation> StateRelations;
}
FNextAnimState
- 状态节点
struct FNextAnimState
{
FString Name;
TArray<FNextAnimGraphNode> AnimGraphNodes;
TArray<FNextAnimGraphNodeRelation> AnimGraphNodesRelations;
FVector2D Position = FVector2D(1, 0);
};
流程
- 将传入的FNextAnimRow进行数据验证,并保存在UNextAnimConfigStrategy中
- UNextAnimConfigStrategy.Build
- 创建ABP asset
- UNextAnimConfigStrategy.CreateAnimBlueprint
- 根据数据生成ABP 各个节点,插件的核心方法
- UNextAnimConfigStrategy.CreateAnimBlueprintNode
- 保存ABP到硬盘
- UNextAnimConfigStrategy.SaveAnimBlueprint
- 编译ABP
- UNextAnimConfigStrategy.CompileBlueprint
UNextAnimConfigStrategy.CreateAnimBlueprintNode
- 根据FNextAnimRow中的数据,逐层生成ABP各个节点
- 主要分为3层
- 第一层:StateMachine-DefaultSlot-Result
- 第二层:各个State的节点、State节点之间的关系和State节点之间关系的条件
- 第三层:各个State中执行的节点,主要有Property节点,SequencePlayer节点等
第一层:StateMachine-DefaultSlot-Result
- 使用 FEdGraphSchemaAction_NewStateNode 分别创建创建 UAnimGraphNode_Slot, UAnimGraphNode_StateMachine
- 并将StateMachine-DefaultSlot-Result三个节点使用TryLinkStateNode连接
- 创建state生成器UNextAnimConfigStateGenerator,并传入并将StateMachine,在此StateMachine中生成State节点
第二层:创建State并建立关系
创建State节点
UNextAnimConfigStateGenerator::CreateStateNode(UAnimGraphNode_StateMachine* StateMachineNode)
连接State节点
bool UNextAnimConfigStateGenerator::LinkStateNode(UAnimGraphNode_StateMachine* StateMachineNode)
添加连接之间的关系
bool UNextAnimConfigStateGenerator::AddStateCondition(UAnimGraphNode_StateMachine* StateMachineNode)
a. 创建条件节点 CreateConditionNode
TMap<FString, UEdGraphNode*> UNextAnimConfigStateGenerator::CreateConditionNode(UAnimStateTransitionNode* OutTransition, TArray<FNextAnimStateRelationConditionNode> ConditionNodes) const
创建条件节点有两种情况
创建条件
条件节点有很多,为了方便扩展,使用了工厂模式,每一个节点对应一个工厂类
使用一个静态工具方法(GetFactoryFromNextAnimStateRelationConditionNode)来通过不同的Node类型创建不同的工厂方法
所有的工厂方法继承自UEdGraphNodeFactory_Base
UEdGraphNodeFactory_Base 继承自IUEdGraphNodeFactory接口
//获取工厂方法 auto Factory = UNextAnimEdGraphNodeFactoryUtility::GetFactoryFromNextAnimStateRelationConditionNode(NodeCondition); if (Factory) { //调用工厂方法生成节点 UEdGraphNode* GraphNode = Factory->Generate(Graph, NodeCondition.Value, FVector2D(Index, 0), ParentClass); GraphNodeForNameMap.Add(NodeCondition.Name, GraphNode); }
修改条件的属性
- 属性也有很多
- 使用工具方法(UpdateOutTransitionFromNextAnimStateRelationConditionNode)对不同配置的属性进行解析并设置
b. 连接条件节点 LinkConditionNodeUNextAnimEdGraphNodeFactoryUtility::UpdateOutTransitionFromNextAnimStateRelationConditionNode(NodeCondition, OutTransition);
void UNextAnimConfigStateGenerator::LinkConditionNode(TMap<FString, UEdGraphNode*> GraphNodeForNameMap, TArray<FNextAnimStateRelationConditionRelation> ConditionRelations)
第三层:创建State中的节点并建立关系
- 和State创建节点类似,创建State使用NextAnimConfigStateGenerator,而创建State里的Node节点使用和State创建节点类似,创建State使用NextAnimConfigNodeGenerator
总结
创建过程分别有
a. 创建AnimBlueprint Asset
b. 设置AnimBlueprint Asset 中节点
c. 保存 AnimBlueprint Asset
d. 编译 AnimBlueprint Asset设置节点的过程中,主要分为三层
a. StateMachine层,使用 NextAnimConfigRootGenerator
b. State层, 使用 NextAnimConfigStateGenerator
c. GraphNode层, 使用 NextAnimConfigNodeGenerator