Add Delay node to BT
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
|
||||
|
||||
#include "BehaviorTreeNodes.h"
|
||||
#include "Behavior.h"
|
||||
#include "BehaviorKnowledge.h"
|
||||
#include "Engine/Core/Random.h"
|
||||
#include "Engine/Serialization/Serialization.h"
|
||||
|
||||
BehaviorUpdateResult BehaviorTreeNode::InvokeUpdate(const BehaviorUpdateContext& context)
|
||||
@@ -96,3 +98,23 @@ BehaviorUpdateResult BehaviorTreeSequenceNode::Update(BehaviorUpdateContext cont
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
int32 BehaviorTreeDelayNode::GetStateSize() const
|
||||
{
|
||||
return sizeof(State);
|
||||
}
|
||||
|
||||
void BehaviorTreeDelayNode::InitState(Behavior* behavior, void* memory)
|
||||
{
|
||||
auto state = GetState<State>(memory);
|
||||
if (!WaitTimeSelector.TryGet(behavior->GetKnowledge(), state->TimeLeft))
|
||||
state->TimeLeft = WaitTime;
|
||||
state->TimeLeft = Random::RandRange(Math::Max(WaitTime - RandomDeviation, 0.0f), WaitTime + RandomDeviation);
|
||||
}
|
||||
|
||||
BehaviorUpdateResult BehaviorTreeDelayNode::Update(BehaviorUpdateContext context)
|
||||
{
|
||||
auto state = GetState<State>(context.Memory);
|
||||
state->TimeLeft -= context.DeltaTime;
|
||||
return state->TimeLeft <= 0.0f ? BehaviorUpdateResult::Success : BehaviorUpdateResult::Running;
|
||||
}
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "BehaviorKnowledge.h"
|
||||
#include "BehaviorTreeNode.h"
|
||||
#include "BehaviorKnowledgeSelector.h"
|
||||
#include "Engine/Core/Collections/Array.h"
|
||||
|
||||
/// <summary>
|
||||
@@ -59,3 +61,36 @@ API_CLASS(Sealed) class FLAXENGINE_API BehaviorTreeRootNode : public BehaviorTre
|
||||
API_FIELD(Attributes="EditorOrder(10)")
|
||||
float UpdateFPS = 10.0f;
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Delay node that waits a specific amount of time while executed.
|
||||
/// </summary>
|
||||
API_CLASS(Sealed) class FLAXENGINE_API BehaviorTreeDelayNode : public BehaviorTreeNode
|
||||
{
|
||||
DECLARE_SCRIPTING_TYPE_WITH_CONSTRUCTOR_IMPL(BehaviorTreeDelayNode, BehaviorTreeNode);
|
||||
API_AUTO_SERIALIZATION();
|
||||
|
||||
// Time in seconds to wait when node gets activated. Unused if WaitTimeSelector is used.
|
||||
API_FIELD(Attributes="EditorOrder(10), Limit(0)")
|
||||
float WaitTime = 3.0f;
|
||||
|
||||
// Wait time randomization range to deviate original value.
|
||||
API_FIELD(Attributes="EditorOrder(20), Limit(0)")
|
||||
float RandomDeviation = 0.0f;
|
||||
|
||||
// Wait time from behavior's knowledge (blackboard, goal or sensor). If set, overrides WaitTime but still uses RandomDeviation.
|
||||
API_FIELD(Attributes="EditorOrder(30)")
|
||||
BehaviorKnowledgeSelector<float> WaitTimeSelector;
|
||||
|
||||
public:
|
||||
// [BehaviorTreeNode]
|
||||
int32 GetStateSize() const override;
|
||||
void InitState(Behavior* behavior, void* memory) override;
|
||||
BehaviorUpdateResult Update(BehaviorUpdateContext context) override;
|
||||
|
||||
private:
|
||||
struct State
|
||||
{
|
||||
float TimeLeft;
|
||||
};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user