2
0
Эх сурвалжийг харах

Expose NavigationObstacle2D/3D get_rid() and add config warning

Exposes get_rid() function for scripting.
Adds configuration warning when obstacle is used with not intended static body parent.

(cherry picked from commit 001d89223f1377717d2b3d5ec453ff8dd3604182)
smix8 3 жил өмнө
parent
commit
b11708c50d

+ 6 - 0
doc/classes/NavigationObstacle.xml

@@ -15,6 +15,12 @@
 				Returns the [Navigation] node that the obstacle is using for its navigation system.
 			</description>
 		</method>
+		<method name="get_rid" qualifiers="const">
+			<return type="RID" />
+			<description>
+				Returns the [RID] of this obstacle on the [NavigationServer].
+			</description>
+		</method>
 		<method name="set_navigation">
 			<return type="void" />
 			<argument index="0" name="navigation" type="Node" />

+ 6 - 0
doc/classes/NavigationObstacle2D.xml

@@ -15,6 +15,12 @@
 				Returns the [Navigation2D] node that the obstacle is using for its navigation system.
 			</description>
 		</method>
+		<method name="get_rid" qualifiers="const">
+			<return type="RID" />
+			<description>
+				Returns the [RID] of this obstacle on the [Navigation2DServer].
+			</description>
+		</method>
 		<method name="set_navigation">
 			<return type="void" />
 			<argument index="0" name="navigation" type="Node" />

+ 8 - 0
scene/2d/navigation_obstacle_2d.cpp

@@ -36,8 +36,11 @@
 #include "servers/navigation_2d_server.h"
 
 void NavigationObstacle2D::_bind_methods() {
+	ClassDB::bind_method(D_METHOD("get_rid"), &NavigationObstacle2D::get_rid);
+
 	ClassDB::bind_method(D_METHOD("set_navigation", "navigation"), &NavigationObstacle2D::set_navigation_node);
 	ClassDB::bind_method(D_METHOD("get_navigation"), &NavigationObstacle2D::get_navigation_node);
+
 	ClassDB::bind_method(D_METHOD("set_estimate_radius", "estimate_radius"), &NavigationObstacle2D::set_estimate_radius);
 	ClassDB::bind_method(D_METHOD("is_radius_estimated"), &NavigationObstacle2D::is_radius_estimated);
 	ClassDB::bind_method(D_METHOD("set_radius", "radius"), &NavigationObstacle2D::set_radius);
@@ -136,6 +139,11 @@ String NavigationObstacle2D::get_configuration_warning() const {
 		return TTR("The NavigationObstacle2D only serves to provide collision avoidance to a Node2D object.");
 	}
 
+	if (Object::cast_to<StaticBody2D>(get_parent())) {
+		return TTR("The NavigationObstacle2D is intended for constantly moving bodies like KinematicBody2D or RigidBody2D as it creates only an RVO avoidance radius and does not follow scene geometry exactly."
+				   "\nNot constantly moving or complete static objects should be captured with a refreshed NavigationPolygon so agents can not only avoid them but also move along those objects outline at high detail");
+	}
+
 	return String();
 }
 

+ 8 - 1
scene/3d/navigation_obstacle.cpp

@@ -36,6 +36,8 @@
 #include "servers/navigation_server.h"
 
 void NavigationObstacle::_bind_methods() {
+	ClassDB::bind_method(D_METHOD("get_rid"), &NavigationObstacle::get_rid);
+
 	ClassDB::bind_method(D_METHOD("set_navigation", "navigation"), &NavigationObstacle::set_navigation_node);
 	ClassDB::bind_method(D_METHOD("get_navigation"), &NavigationObstacle::get_navigation_node);
 	ClassDB::bind_method(D_METHOD("is_radius_estimated"), &NavigationObstacle::is_radius_estimated);
@@ -140,7 +142,12 @@ Node *NavigationObstacle::get_navigation_node() const {
 
 String NavigationObstacle::get_configuration_warning() const {
 	if (!Object::cast_to<Spatial>(get_parent())) {
-		return TTR("The NavigationObstacle only serves to provide collision avoidance to a spatial object.");
+		return TTR("The NavigationObstacle only serves to provide collision avoidance to a Spatial inheriting parent object.");
+	}
+
+	if (Object::cast_to<StaticBody>(get_parent())) {
+		return TTR("The NavigationObstacle is intended for constantly moving bodies like KinematicBody3D or RigidBody3D as it creates only an RVO avoidance radius and does not follow scene geometry exactly."
+				   "\nNot constantly moving or complete static objects should be (re)baked to a NavigationMesh so agents can not only avoid them but also move along those objects outline at high detail");
 	}
 
 	return String();