You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
- Added new struct to hold instance data - Removed on the fly created customs struct for storing the instance data - The Mass StateTree instance data is not a fragment anymore - Fixes crash when using StateTreeBrainComponent directly on actor - Moved StateTree activation processor settings to Mass Behavior settings #jira UE-133870 #rb Yoan.StAmant #preflight 62178318db60b6b592190db8 [CL 19112506 by mikko mononen in ue5-main branch]
104 lines
2.6 KiB
C++
104 lines
2.6 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "StateTree.h"
|
|
#include "StateTreeEvaluatorBase.h"
|
|
#include "StateTreeTaskBase.h"
|
|
#include "CoreMinimal.h"
|
|
#include "StateTreeConditionBase.h"
|
|
#include "StateTreeDelegates.h"
|
|
|
|
bool UStateTree::IsReadyToRun() const
|
|
{
|
|
// Valid tree must have at least one state and valid instance data.
|
|
return States.Num() > 0 && InstanceDataDefaultValue.IsValid();
|
|
}
|
|
|
|
#if WITH_EDITOR
|
|
void UStateTree::ResetBaked()
|
|
{
|
|
States.Reset();
|
|
Transitions.Reset();
|
|
|
|
Nodes.Reset();
|
|
Instances.Reset();
|
|
InstanceObjects.Reset();
|
|
ExternalDataDescs.Reset();
|
|
PropertyBindings.Reset();
|
|
|
|
NumDataViews = 0;
|
|
ExternalDataBaseIndex = 0;
|
|
|
|
InstanceDataDefaultValue.Reset();
|
|
}
|
|
|
|
void UStateTree::PostEditChangeProperty(struct FPropertyChangedEvent& PropertyChangedEvent)
|
|
{
|
|
if (PropertyChangedEvent.MemberProperty && PropertyChangedEvent.Property)
|
|
{
|
|
if (PropertyChangedEvent.MemberProperty->GetFName() == GET_MEMBER_NAME_CHECKED(UStateTree, Schema))
|
|
{
|
|
UE::StateTree::Delegates::OnSchemaChanged.Broadcast(*this);
|
|
}
|
|
}
|
|
}
|
|
|
|
void UStateTree::GetAssetRegistryTags(TArray<FAssetRegistryTag>& OutTags) const
|
|
{
|
|
static const FName SchemaTag(TEXT("Schema"));
|
|
|
|
const FString SchemaClassName = Schema ? Schema->GetClass()->GetName() : TEXT("");
|
|
OutTags.Add(FAssetRegistryTag(SchemaTag, SchemaClassName, FAssetRegistryTag::TT_Alphabetical));
|
|
|
|
Super::GetAssetRegistryTags(OutTags);
|
|
}
|
|
#endif // WITH_EDITOR
|
|
|
|
void UStateTree::PostLoad()
|
|
{
|
|
Super::PostLoad();
|
|
|
|
PropertyBindings.ResolvePaths();
|
|
|
|
Link();
|
|
}
|
|
|
|
void UStateTree::Link()
|
|
{
|
|
FStateTreeLinker Linker;
|
|
|
|
ExternalDataBaseIndex = PropertyBindings.GetSourceStructNum();
|
|
Linker.SetExternalDataBaseIndex(ExternalDataBaseIndex);
|
|
|
|
for (FInstancedStruct& Node : Nodes)
|
|
{
|
|
if (FStateTreeNodeBase* NodePtr = Node.GetMutablePtr<FStateTreeNodeBase>())
|
|
{
|
|
Linker.SetCurrentInstanceDataType(NodePtr->GetInstanceDataType(), NodePtr->DataViewIndex);
|
|
NodePtr->Link(Linker);
|
|
}
|
|
}
|
|
|
|
ExternalDataDescs = Linker.GetExternalDataDescs();
|
|
|
|
NumDataViews = ExternalDataBaseIndex + ExternalDataDescs.Num();
|
|
|
|
// Initialize the instance data default value.
|
|
// This data will be used to allocate runtime instance on all StateTree users.
|
|
InstanceDataDefaultValue.Reset();
|
|
if (Instances.Num() > 0)
|
|
{
|
|
InstanceDataDefaultValue.Initialize(Instances);
|
|
}
|
|
}
|
|
|
|
int32 UStateTree::GetInstanceDataSize() const
|
|
{
|
|
if (!InstanceDataDefaultValue.IsValid() || !InstanceDataDefaultValue.GetLayout().IsValid())
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
// TODO: this should count all allocated data (arrays, objects).
|
|
return InstanceDataDefaultValue.GetLayout()->GetLayoutInstanceSize();
|
|
}
|