BehaviorTree: New signal for when BB plan changes

Utilize `plan_changed` signal in `BTPlayer` and `BTState`.
This commit is contained in:
Serhii Snitsaruk 2024-04-01 16:34:36 +02:00
parent 302de87e32
commit 3918272227
No known key found for this signature in database
GPG Key ID: A965EF8799FFEC2D
7 changed files with 45 additions and 17 deletions

View File

@ -48,7 +48,7 @@ void BehaviorTree::set_blackboard_plan(const Ref<BlackboardPlan> &p_plan) {
blackboard_plan->connect(LW_NAME(changed), callable_mp(this, &BehaviorTree::_plan_changed)); blackboard_plan->connect(LW_NAME(changed), callable_mp(this, &BehaviorTree::_plan_changed));
} }
emit_changed(); _plan_changed();
} }
void BehaviorTree::set_root_task(const Ref<BTTask> &p_value) { void BehaviorTree::set_root_task(const Ref<BTTask> &p_value) {
@ -79,6 +79,7 @@ Ref<BTTask> BehaviorTree::instantiate(Node *p_agent, const Ref<Blackboard> &p_bl
} }
void BehaviorTree::_plan_changed() { void BehaviorTree::_plan_changed() {
emit_signal(LW_NAME(plan_changed));
emit_changed(); emit_changed();
} }
@ -96,6 +97,8 @@ void BehaviorTree::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::STRING, "description", PROPERTY_HINT_MULTILINE_TEXT), "set_description", "get_description"); ADD_PROPERTY(PropertyInfo(Variant::STRING, "description", PROPERTY_HINT_MULTILINE_TEXT), "set_description", "get_description");
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "blackboard_plan", PROPERTY_HINT_RESOURCE_TYPE, "BlackboardPlan", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT), "set_blackboard_plan", "get_blackboard_plan"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "blackboard_plan", PROPERTY_HINT_RESOURCE_TYPE, "BlackboardPlan", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT), "set_blackboard_plan", "get_blackboard_plan");
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "root_task", PROPERTY_HINT_RESOURCE_TYPE, "BTTask", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_INTERNAL), "set_root_task", "get_root_task"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "root_task", PROPERTY_HINT_RESOURCE_TYPE, "BTTask", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_INTERNAL), "set_root_task", "get_root_task");
ADD_SIGNAL(MethodInfo("plan_changed"));
} }
BehaviorTree::BehaviorTree() { BehaviorTree::BehaviorTree() {

View File

@ -63,17 +63,21 @@ void BTPlayer::_load_tree() {
void BTPlayer::_update_blackboard_plan() { void BTPlayer::_update_blackboard_plan() {
if (blackboard_plan.is_null()) { if (blackboard_plan.is_null()) {
blackboard_plan = Ref<BlackboardPlan>(memnew(BlackboardPlan)); blackboard_plan = Ref<BlackboardPlan>(memnew(BlackboardPlan));
} else if (!RESOURCE_IS_BUILT_IN(blackboard_plan)) {
WARN_PRINT_ED("BTPlayer: Using external resource for derived blackboard plan is not supported. Converted to built-in resource.");
blackboard_plan = blackboard_plan->duplicate();
} }
blackboard_plan->set_base_plan(behavior_tree.is_valid() ? behavior_tree->get_blackboard_plan() : nullptr); blackboard_plan->set_base_plan(behavior_tree.is_valid() ? behavior_tree->get_blackboard_plan() : nullptr);
} }
void BTPlayer::set_behavior_tree(const Ref<BehaviorTree> &p_tree) { void BTPlayer::set_behavior_tree(const Ref<BehaviorTree> &p_tree) {
if (Engine::get_singleton()->is_editor_hint()) { if (Engine::get_singleton()->is_editor_hint()) {
if (behavior_tree.is_valid() && behavior_tree->is_connected(LW_NAME(changed), callable_mp(this, &BTPlayer::_update_blackboard_plan))) { if (behavior_tree.is_valid() && behavior_tree->is_connected(LW_NAME(plan_changed), callable_mp(this, &BTPlayer::_update_blackboard_plan))) {
behavior_tree->disconnect(LW_NAME(changed), callable_mp(this, &BTPlayer::_update_blackboard_plan)); behavior_tree->disconnect(LW_NAME(plan_changed), callable_mp(this, &BTPlayer::_update_blackboard_plan));
} }
if (p_tree.is_valid()) { if (p_tree.is_valid()) {
p_tree->connect(LW_NAME(changed), callable_mp(this, &BTPlayer::_update_blackboard_plan)); p_tree->connect(LW_NAME(plan_changed), callable_mp(this, &BTPlayer::_update_blackboard_plan));
} }
behavior_tree = p_tree; behavior_tree = p_tree;
_update_blackboard_plan(); _update_blackboard_plan();
@ -86,12 +90,7 @@ void BTPlayer::set_behavior_tree(const Ref<BehaviorTree> &p_tree) {
} }
void BTPlayer::set_blackboard_plan(const Ref<BlackboardPlan> &p_plan) { void BTPlayer::set_blackboard_plan(const Ref<BlackboardPlan> &p_plan) {
if (p_plan.is_valid() && !RESOURCE_IS_BUILT_IN(p_plan)) { blackboard_plan = p_plan;
WARN_PRINT_ED("BTPlayer: Using external resource for derived blackboard plan is not supported. Converted to built-in resource.");
blackboard_plan = p_plan->duplicate();
} else {
blackboard_plan = p_plan;
}
_update_blackboard_plan(); _update_blackboard_plan();
} }
@ -217,8 +216,8 @@ void BTPlayer::_notification(int p_notification) {
#endif // DEBUG_ENABLED #endif // DEBUG_ENABLED
if (Engine::get_singleton()->is_editor_hint()) { if (Engine::get_singleton()->is_editor_hint()) {
if (behavior_tree.is_valid() && behavior_tree->is_connected(LW_NAME(changed), callable_mp(this, &BTPlayer::_update_blackboard_plan))) { if (behavior_tree.is_valid() && behavior_tree->is_connected(LW_NAME(plan_changed), callable_mp(this, &BTPlayer::_update_blackboard_plan))) {
behavior_tree->disconnect(LW_NAME(changed), callable_mp(this, &BTPlayer::_update_blackboard_plan)); behavior_tree->disconnect(LW_NAME(plan_changed), callable_mp(this, &BTPlayer::_update_blackboard_plan));
} }
} }

View File

@ -25,11 +25,11 @@
void BTState::set_behavior_tree(const Ref<BehaviorTree> &p_tree) { void BTState::set_behavior_tree(const Ref<BehaviorTree> &p_tree) {
if (Engine::get_singleton()->is_editor_hint()) { if (Engine::get_singleton()->is_editor_hint()) {
if (behavior_tree.is_valid() && behavior_tree->is_connected(LW_NAME(changed), callable_mp(this, &BTState::_update_blackboard_plan))) { if (behavior_tree.is_valid() && behavior_tree->is_connected(LW_NAME(plan_changed), callable_mp(this, &BTState::_update_blackboard_plan))) {
behavior_tree->disconnect(LW_NAME(changed), callable_mp(this, &BTState::_update_blackboard_plan)); behavior_tree->disconnect(LW_NAME(plan_changed), callable_mp(this, &BTState::_update_blackboard_plan));
} }
if (p_tree.is_valid()) { if (p_tree.is_valid()) {
p_tree->connect(LW_NAME(changed), callable_mp(this, &BTState::_update_blackboard_plan)); p_tree->connect(LW_NAME(plan_changed), callable_mp(this, &BTState::_update_blackboard_plan));
} }
behavior_tree = p_tree; behavior_tree = p_tree;
_update_blackboard_plan(); _update_blackboard_plan();
@ -97,8 +97,8 @@ void BTState::_notification(int p_notification) {
#endif // DEBUG_ENABLED #endif // DEBUG_ENABLED
if (Engine::get_singleton()->is_editor_hint()) { if (Engine::get_singleton()->is_editor_hint()) {
if (behavior_tree.is_valid() && behavior_tree->is_connected(LW_NAME(changed), callable_mp(this, &BTState::_update_blackboard_plan))) { if (behavior_tree.is_valid() && behavior_tree->is_connected(LW_NAME(plan_changed), callable_mp(this, &BTState::_update_blackboard_plan))) {
behavior_tree->disconnect(LW_NAME(changed), callable_mp(this, &BTState::_update_blackboard_plan)); behavior_tree->disconnect(LW_NAME(plan_changed), callable_mp(this, &BTState::_update_blackboard_plan));
} }
} }
} break; } break;

View File

@ -73,6 +73,23 @@ Methods
.. rst-class:: classref-descriptions-group .. rst-class:: classref-descriptions-group
Signals
-------
.. _class_BehaviorTree_signal_plan_changed:
.. rst-class:: classref-signal
**plan_changed** **(** **)**
Emitted when the :ref:`BlackboardPlan<class_BlackboardPlan>` changes.
.. rst-class:: classref-section-separator
----
.. rst-class:: classref-descriptions-group
Property Descriptions Property Descriptions
--------------------- ---------------------

View File

@ -58,4 +58,11 @@
User-provided description of the BehaviorTree. User-provided description of the BehaviorTree.
</member> </member>
</members> </members>
<signals>
<signal name="plan_changed">
<description>
Emitted when the [BlackboardPlan] changes.
</description>
</signal>
</signals>
</class> </class>

View File

@ -122,6 +122,7 @@ LimboStringNames::LimboStringNames() {
NonFavorite = SN("NonFavorite"); NonFavorite = SN("NonFavorite");
normal = SN("normal"); normal = SN("normal");
panel = SN("panel"); panel = SN("panel");
plan_changed = SN("plan_changed");
popup_hide = SN("popup_hide"); popup_hide = SN("popup_hide");
pressed = SN("pressed"); pressed = SN("pressed");
probability_clicked = SN("probability_clicked"); probability_clicked = SN("probability_clicked");

View File

@ -137,6 +137,7 @@ public:
StringName NonFavorite; StringName NonFavorite;
StringName normal; StringName normal;
StringName panel; StringName panel;
StringName plan_changed;
StringName popup_hide; StringName popup_hide;
StringName pressed; StringName pressed;
StringName probability_clicked; StringName probability_clicked;