void UBehaviorTreeGraph::UpdateBlackboardChange() { UBehaviorTree* BTAsset = Cast<UBehaviorTree>(GetOuter()); if (BTAsset == nullptr) { return; } for (int32 Index = 0; Index < Nodes.Num(); ++Index) { UBehaviorTreeGraphNode* MyNode = Cast<UBehaviorTreeGraphNode>(Nodes[Index]); if (MyNode) { UBTNode* MyNodeInstance = Cast<UBTNode>(MyNode->NodeInstance); if (MyNodeInstance) { MyNodeInstance->InitializeFromAsset(*BTAsset); } } for (int32 iDecorator = 0; iDecorator < MyNode->Decorators.Num(); iDecorator++) { UBTNode* MyNodeInstance = MyNode->Decorators[iDecorator] ? Cast<UBTNode>(MyNode->Decorators[iDecorator]->NodeInstance) : NULL; if (MyNodeInstance) { MyNodeInstance->InitializeFromAsset(*BTAsset); } UBehaviorTreeGraphNode_CompositeDecorator* CompDecoratorNode = Cast<UBehaviorTreeGraphNode_CompositeDecorator>(MyNode->Decorators[iDecorator]); if (CompDecoratorNode) { CompDecoratorNode->OnBlackboardUpdate(); } } for (int32 iService = 0; iService < MyNode->Services.Num(); iService++) { UBTNode* MyNodeInstance = MyNode->Services[iService] ? Cast<UBTNode>(MyNode->Services[iService]->NodeInstance) : NULL; if (MyNodeInstance) { MyNodeInstance->InitializeFromAsset(*BTAsset); } } } }
void UBehaviorTreeGraphNode::PostEditImport() { ResetNodeOwner(); if (NodeInstance) { UBehaviorTree* BT = Cast<UBehaviorTree>(GetBehaviorTreeGraph()->GetOuter()); if (BT) { UBTNode* BTNode = (UBTNode*)NodeInstance; BTNode->InitializeFromAsset(*BT); BTNode->InitializeNode(NULL, MAX_uint16, 0, 0); } } }
void UBehaviorTreeGraphNode_CompositeDecorator::OnBlackboardUpdate() { UBehaviorTreeDecoratorGraph* MyGraph = Cast<UBehaviorTreeDecoratorGraph>(BoundGraph); UBehaviorTree* BTAsset = Cast<UBehaviorTree>(GetOuter()->GetOuter()); if (MyGraph && BTAsset) { for (int32 i = 0; i < MyGraph->Nodes.Num(); i++) { UBehaviorTreeDecoratorGraphNode_Decorator* MyNode = Cast<UBehaviorTreeDecoratorGraphNode_Decorator>(MyGraph->Nodes[i]); UBTNode* MyNodeInstance = MyNode ? Cast<UBTNode>(MyNode->NodeInstance) : NULL; if (MyNodeInstance) { MyNodeInstance->InitializeFromAsset(*BTAsset); } } } }
void UBehaviorTreeGraphNode::PostPlacedNewNode() { UClass* NodeClass = ClassData.GetClass(true); if (NodeClass) { UBehaviorTree* BT = Cast<UBehaviorTree>(GetBehaviorTreeGraph()->GetOuter()); if (BT) { NodeInstance = ConstructObject<UBTNode>(NodeClass, BT); UBTNode* BTNode = (UBTNode*)NodeInstance; BTNode->SetFlags(RF_Transactional); BTNode->InitializeFromAsset(*BT); BTNode->InitializeNode(NULL, MAX_uint16, 0, 0); } } }
void UBTNode::InitializeInSubtree(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, int32& NextInstancedIndex, EBTMemoryInit::Type InitType) const { FBTInstancedNodeMemory* SpecialMemory = GetSpecialNodeMemory<FBTInstancedNodeMemory>(NodeMemory); if (SpecialMemory) { SpecialMemory->NodeIdx = INDEX_NONE; } if (bCreateNodeInstance) { // composite nodes can't be instanced! check(IsA(UBTCompositeNode::StaticClass()) == false); UBTNode* NodeInstance = OwnerComp.NodeInstances.IsValidIndex(NextInstancedIndex) ? OwnerComp.NodeInstances[NextInstancedIndex] : NULL; if (NodeInstance == NULL) { NodeInstance = (UBTNode*)StaticDuplicateObject(this, &OwnerComp); NodeInstance->InitializeNode(GetParentNode(), GetExecutionIndex(), GetMemoryOffset(), GetTreeDepth()); NodeInstance->bIsInstanced = true; OwnerComp.NodeInstances.Add(NodeInstance); } check(NodeInstance); check(SpecialMemory); SpecialMemory->NodeIdx = NextInstancedIndex; NodeInstance->SetOwner(OwnerComp.GetOwner()); NodeInstance->InitializeMemory(OwnerComp, NodeMemory, InitType); check(TreeAsset); NodeInstance->InitializeFromAsset(*TreeAsset); NodeInstance->OnInstanceCreated(OwnerComp); NextInstancedIndex++; } else { InitializeMemory(OwnerComp, NodeMemory, InitType); } }