# Aggregate - **功能描述:** 指定FRigUnit里的属性引脚为可扩展连续二元运算符的运算数。 - **使用位置:** UPROPERTY - **引擎模块:** RigVMStruct - **元数据类型:** bool - **限制类型:** FRigUnit下的属性 - **常用程度:** ★★★ 指定FRigUnit里的属性引脚为可扩展连续二元运算符的运算数。 记得在Input和Output上都加上Aggregate。 ## 测试代码: ```cpp USTRUCT(meta = (DisplayName = "MyRigAggregate")) struct INSIDER_API FRigUnit_MyRigAggregate : public FRigUnit { GENERATED_BODY() RIGVM_METHOD() virtual void Execute() override; public: UPROPERTY(meta = (Input,Aggregate)) float A = 0.f; UPROPERTY(meta = (Input,Aggregate)) float B= 0.f; UPROPERTY(meta = (Output,Aggregate)) float Result = 0.f; }; ``` ## 测试效果: 可见加了Aggregate之后,在蓝图节点上就可以继续动态AddPin。在左侧的Graph上也会创建中间MyRigAggregate节点。点开后,可以看见,其实就是继续组装原始的二元运算来达成继续AddPin的效果。 ![Untitled](Untitled.png) ## 原理: 识别该Meta然后然后把引脚加到AggregateInputs和AggregateOutputs里。 ```cpp TArray URigVMUnitNode::GetAggregateInputs() const { TArray AggregateInputs; #if UE_RIGVM_AGGREGATE_NODES_ENABLED if (const UScriptStruct* Struct = GetScriptStruct()) { for (URigVMPin* Pin : GetPins()) { if (Pin->GetDirection() == ERigVMPinDirection::Input) { if (const FProperty* Property = Struct->FindPropertyByName(Pin->GetFName())) { if (Property->HasMetaData(FRigVMStruct::AggregateMetaName)) { AggregateInputs.Add(Pin); } } } } } else { return Super::GetAggregateInputs(); } #endif return AggregateInputs; } ```