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);
};

流程

  1. 将传入的FNextAnimRow进行数据验证,并保存在UNextAnimConfigStrategy中
    • UNextAnimConfigStrategy.Build
  2. 创建ABP asset
    • UNextAnimConfigStrategy.CreateAnimBlueprint
  3. 根据数据生成ABP 各个节点,插件的核心方法
    • UNextAnimConfigStrategy.CreateAnimBlueprintNode
  4. 保存ABP到硬盘
    • UNextAnimConfigStrategy.SaveAnimBlueprint
  5. 编译ABP
    • UNextAnimConfigStrategy.CompileBlueprint

UNextAnimConfigStrategy.CreateAnimBlueprintNode

  • 根据FNextAnimRow中的数据,逐层生成ABP各个节点
  • 主要分为3层
    1. 第一层:StateMachine-DefaultSlot-Result
    2. 第二层:各个State的节点、State节点之间的关系和State节点之间关系的条件
    3. 第三层:各个State中执行的节点,主要有Property节点,SequencePlayer节点等

第一层:StateMachine-DefaultSlot-Result

  1. 使用 FEdGraphSchemaAction_NewStateNode 分别创建创建 UAnimGraphNode_Slot, UAnimGraphNode_StateMachine
  2. 并将StateMachine-DefaultSlot-Result三个节点使用TryLinkStateNode连接
  3. 创建state生成器UNextAnimConfigStateGenerator,并传入并将StateMachine,在此StateMachine中生成State节点

第二层:创建State并建立关系

  1. 创建State节点

    UNextAnimConfigStateGenerator::CreateStateNode(UAnimGraphNode_StateMachine* StateMachineNode)
  2. 连接State节点

    bool UNextAnimConfigStateGenerator::LinkStateNode(UAnimGraphNode_StateMachine* StateMachineNode)
  3. 添加连接之间的关系

    bool UNextAnimConfigStateGenerator::AddStateCondition(UAnimGraphNode_StateMachine* StateMachineNode)

    a. 创建条件节点 CreateConditionNode

    TMap<FString, UEdGraphNode*> UNextAnimConfigStateGenerator::CreateConditionNode(UAnimStateTransitionNode* OutTransition,
                                                                       TArray<FNextAnimStateRelationConditionNode> ConditionNodes) const

    创建条件节点有两种情况

    1. 创建条件

      • 条件节点有很多,为了方便扩展,使用了工厂模式,每一个节点对应一个工厂类

      • 使用一个静态工具方法(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);
        }
    2. 修改条件的属性

      • 属性也有很多
      • 使用工具方法(UpdateOutTransitionFromNextAnimStateRelationConditionNode)对不同配置的属性进行解析并设置
        UNextAnimEdGraphNodeFactoryUtility::UpdateOutTransitionFromNextAnimStateRelationConditionNode(NodeCondition, OutTransition);
        b. 连接条件节点 LinkConditionNode
        void UNextAnimConfigStateGenerator::LinkConditionNode(TMap<FString, UEdGraphNode*> GraphNodeForNameMap,
                                                 TArray<FNextAnimStateRelationConditionRelation> ConditionRelations)

        第三层:创建State中的节点并建立关系

  • 和State创建节点类似,创建State使用NextAnimConfigStateGenerator,而创建State里的Node节点使用和State创建节点类似,创建State使用NextAnimConfigNodeGenerator

总结

  1. 创建过程分别有
    a. 创建AnimBlueprint Asset
    b. 设置AnimBlueprint Asset 中节点
    c. 保存 AnimBlueprint Asset
    d. 编译 AnimBlueprint Asset

  2. 设置节点的过程中,主要分为三层
    a. StateMachine层,使用 NextAnimConfigRootGenerator
    b. State层, 使用 NextAnimConfigStateGenerator
    c. GraphNode层, 使用 NextAnimConfigNodeGenerator