2021-09-28 13:33:17 -04:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
#include "StateTree.h"
|
|
|
|
|
#include "StateTreeEvaluatorBase.h"
|
2021-10-27 06:10:12 -04:00
|
|
|
#include "StateTreeTaskBase.h"
|
2021-09-28 13:33:17 -04:00
|
|
|
#include "CoreMinimal.h"
|
2021-11-12 05:48:11 -05:00
|
|
|
#include "StateTreeConditionBase.h"
|
2021-09-28 13:33:17 -04:00
|
|
|
#include "StateTreeDelegates.h"
|
|
|
|
|
|
2022-02-24 08:19:23 -05:00
|
|
|
bool UStateTree::IsReadyToRun() const
|
2021-09-28 13:33:17 -04:00
|
|
|
{
|
2022-02-24 08:19:23 -05:00
|
|
|
// Valid tree must have at least one state and valid instance data.
|
|
|
|
|
return States.Num() > 0 && InstanceDataDefaultValue.IsValid();
|
2021-09-28 13:33:17 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if WITH_EDITOR
|
|
|
|
|
void UStateTree::ResetBaked()
|
|
|
|
|
{
|
|
|
|
|
States.Reset();
|
|
|
|
|
Transitions.Reset();
|
|
|
|
|
|
2022-02-24 08:19:23 -05:00
|
|
|
Nodes.Reset();
|
2021-11-12 05:48:11 -05:00
|
|
|
Instances.Reset();
|
2021-11-24 04:26:12 -05:00
|
|
|
InstanceObjects.Reset();
|
2021-11-12 05:48:11 -05:00
|
|
|
ExternalDataDescs.Reset();
|
2021-09-28 13:33:17 -04:00
|
|
|
PropertyBindings.Reset();
|
2021-11-03 07:01:08 -04:00
|
|
|
|
2021-11-12 05:48:11 -05:00
|
|
|
NumDataViews = 0;
|
|
|
|
|
ExternalDataBaseIndex = 0;
|
2022-02-24 08:19:23 -05:00
|
|
|
|
|
|
|
|
InstanceDataDefaultValue.Reset();
|
2021-09-28 13:33:17 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void UStateTree::PostEditChangeProperty(struct FPropertyChangedEvent& PropertyChangedEvent)
|
|
|
|
|
{
|
|
|
|
|
if (PropertyChangedEvent.MemberProperty && PropertyChangedEvent.Property)
|
|
|
|
|
{
|
|
|
|
|
if (PropertyChangedEvent.MemberProperty->GetFName() == GET_MEMBER_NAME_CHECKED(UStateTree, Schema))
|
|
|
|
|
{
|
2021-10-21 04:08:20 -04:00
|
|
|
UE::StateTree::Delegates::OnSchemaChanged.Broadcast(*this);
|
2021-09-28 13:33:17 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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();
|
2021-10-27 06:10:12 -04:00
|
|
|
Link();
|
2021-09-28 13:33:17 -04:00
|
|
|
}
|
|
|
|
|
|
2022-03-23 08:06:00 -04:00
|
|
|
void UStateTree::Serialize(FStructuredArchiveRecord Record)
|
|
|
|
|
{
|
|
|
|
|
Super::Serialize(Record);
|
|
|
|
|
|
|
|
|
|
// We need to link and rebind property bindings each time a BP is compiled,
|
|
|
|
|
// because property bindings may get invalid, and instance data potentially needs refreshed.
|
|
|
|
|
if (Record.GetUnderlyingArchive().IsModifyingWeakAndStrongReferences())
|
|
|
|
|
{
|
|
|
|
|
Link();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2021-10-27 06:10:12 -04:00
|
|
|
void UStateTree::Link()
|
|
|
|
|
{
|
|
|
|
|
FStateTreeLinker Linker;
|
|
|
|
|
|
2021-11-12 05:48:11 -05:00
|
|
|
ExternalDataBaseIndex = PropertyBindings.GetSourceStructNum();
|
|
|
|
|
Linker.SetExternalDataBaseIndex(ExternalDataBaseIndex);
|
2021-11-03 07:01:08 -04:00
|
|
|
|
2022-02-24 08:19:23 -05:00
|
|
|
for (FInstancedStruct& Node : Nodes)
|
2021-10-27 06:10:12 -04:00
|
|
|
{
|
2022-02-24 08:19:23 -05:00
|
|
|
if (FStateTreeNodeBase* NodePtr = Node.GetMutablePtr<FStateTreeNodeBase>())
|
2021-10-27 06:10:12 -04:00
|
|
|
{
|
2022-02-24 08:19:23 -05:00
|
|
|
Linker.SetCurrentInstanceDataType(NodePtr->GetInstanceDataType(), NodePtr->DataViewIndex);
|
|
|
|
|
NodePtr->Link(Linker);
|
2021-11-12 05:48:11 -05:00
|
|
|
}
|
2021-10-27 06:10:12 -04:00
|
|
|
}
|
|
|
|
|
|
2021-11-12 05:48:11 -05:00
|
|
|
ExternalDataDescs = Linker.GetExternalDataDescs();
|
2021-11-03 07:01:08 -04:00
|
|
|
|
2021-11-12 05:48:11 -05:00
|
|
|
NumDataViews = ExternalDataBaseIndex + ExternalDataDescs.Num();
|
2022-02-24 08:19:23 -05:00
|
|
|
|
|
|
|
|
// 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)
|
2022-03-10 21:51:53 -05:00
|
|
|
{
|
2022-03-23 08:06:00 -04:00
|
|
|
InstanceDataDefaultValue.Initialize(*this, Instances, InstanceObjects);
|
2021-09-28 13:33:17 -04:00
|
|
|
}
|
|
|
|
|
|
2022-03-23 08:06:00 -04:00
|
|
|
PropertyBindings.ResolvePaths();
|
2021-09-28 13:33:17 -04:00
|
|
|
}
|