Merge pull request #56601 from Scony/fix-navigation-obstacle-errors

This commit is contained in:
Rémi Verschelde 2022-01-28 23:25:55 +01:00 committed by GitHub
commit 1c6f0aa3a0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 6 deletions

View File

@ -53,9 +53,9 @@ void NavigationObstacle2D::_validate_property(PropertyInfo &p_property) const {
void NavigationObstacle2D::_notification(int p_what) { void NavigationObstacle2D::_notification(int p_what) {
switch (p_what) { switch (p_what) {
case NOTIFICATION_READY: { case NOTIFICATION_ENTER_TREE: {
initialize_agent();
parent_node2d = Object::cast_to<Node2D>(get_parent()); parent_node2d = Object::cast_to<Node2D>(get_parent());
reevaluate_agent_radius();
if (parent_node2d != nullptr) { if (parent_node2d != nullptr) {
// place agent on navigation map first or else the RVO agent callback creation fails silently later // place agent on navigation map first or else the RVO agent callback creation fails silently later
NavigationServer2D::get_singleton()->agent_set_map(get_rid(), parent_node2d->get_world_2d()->get_navigation_map()); NavigationServer2D::get_singleton()->agent_set_map(get_rid(), parent_node2d->get_world_2d()->get_navigation_map());
@ -83,6 +83,7 @@ void NavigationObstacle2D::_notification(int p_what) {
NavigationObstacle2D::NavigationObstacle2D() { NavigationObstacle2D::NavigationObstacle2D() {
agent = NavigationServer2D::get_singleton()->agent_create(); agent = NavigationServer2D::get_singleton()->agent_create();
initialize_agent();
} }
NavigationObstacle2D::~NavigationObstacle2D() { NavigationObstacle2D::~NavigationObstacle2D() {
@ -110,7 +111,7 @@ void NavigationObstacle2D::initialize_agent() {
void NavigationObstacle2D::reevaluate_agent_radius() { void NavigationObstacle2D::reevaluate_agent_radius() {
if (!estimate_radius) { if (!estimate_radius) {
NavigationServer2D::get_singleton()->agent_set_radius(agent, radius); NavigationServer2D::get_singleton()->agent_set_radius(agent, radius);
} else if (parent_node2d) { } else if (parent_node2d && parent_node2d->is_inside_tree()) {
NavigationServer2D::get_singleton()->agent_set_radius(agent, estimate_agent_radius()); NavigationServer2D::get_singleton()->agent_set_radius(agent, estimate_agent_radius());
} }
} }

View File

@ -54,9 +54,9 @@ void NavigationObstacle3D::_validate_property(PropertyInfo &p_property) const {
void NavigationObstacle3D::_notification(int p_what) { void NavigationObstacle3D::_notification(int p_what) {
switch (p_what) { switch (p_what) {
case NOTIFICATION_READY: { case NOTIFICATION_ENTER_TREE: {
initialize_agent();
parent_node3d = Object::cast_to<Node3D>(get_parent()); parent_node3d = Object::cast_to<Node3D>(get_parent());
reevaluate_agent_radius();
if (parent_node3d != nullptr) { if (parent_node3d != nullptr) {
// place agent on navigation map first or else the RVO agent callback creation fails silently later // place agent on navigation map first or else the RVO agent callback creation fails silently later
NavigationServer3D::get_singleton()->agent_set_map(get_rid(), parent_node3d->get_world_3d()->get_navigation_map()); NavigationServer3D::get_singleton()->agent_set_map(get_rid(), parent_node3d->get_world_3d()->get_navigation_map());
@ -91,6 +91,7 @@ void NavigationObstacle3D::_notification(int p_what) {
NavigationObstacle3D::NavigationObstacle3D() { NavigationObstacle3D::NavigationObstacle3D() {
agent = NavigationServer3D::get_singleton()->agent_create(); agent = NavigationServer3D::get_singleton()->agent_create();
initialize_agent();
} }
NavigationObstacle3D::~NavigationObstacle3D() { NavigationObstacle3D::~NavigationObstacle3D() {
@ -118,7 +119,7 @@ void NavigationObstacle3D::initialize_agent() {
void NavigationObstacle3D::reevaluate_agent_radius() { void NavigationObstacle3D::reevaluate_agent_radius() {
if (!estimate_radius) { if (!estimate_radius) {
NavigationServer3D::get_singleton()->agent_set_radius(agent, radius); NavigationServer3D::get_singleton()->agent_set_radius(agent, radius);
} else if (parent_node3d) { } else if (parent_node3d && parent_node3d->is_inside_tree()) {
NavigationServer3D::get_singleton()->agent_set_radius(agent, estimate_agent_radius()); NavigationServer3D::get_singleton()->agent_set_radius(agent, estimate_agent_radius());
} }
} }