ExampleComponents/NavigationQueryTest.cs
public sealed class NavigationQueryTest : Component
{
[Property] public bool ClosestPoint { get; set; }
[Property] public bool ClosestEdge { get; set; }
[Property, ToggleGroup( "Path" )] public bool Path { get; set; }
[Property, ToggleGroup( "Path" )] public GameObject Target { get; set; }
[Property, ToggleGroup( "RandomPoint" )] public bool RandomPoint { get; set; }
[Property, ToggleGroup( "RandomPoint" )] public float RandomRadius { get; set; } = 100.0f;
[Property] public bool AttractAgents { get; set; }
RealTimeSince timeSinceUpdate = 0;
protected override void OnUpdate()
{
if ( AttractAgents && timeSinceUpdate > 1 )
{
timeSinceUpdate = 0;
foreach ( var agent in Scene.GetAllComponents<NavMeshAgent>() )
{
agent.MoveTo( WorldPosition );
}
}
}
protected override void DrawGizmos()
{
Gizmo.Transform = global::Transform.Zero;
if ( ClosestPoint )
{
var pos = Scene.NavMesh.GetClosestPoint( BBox.FromPositionAndSize( WorldPosition, 80000 ) );
if ( pos.HasValue )
{
Gizmo.Draw.Color = Color.Orange;
Gizmo.Draw.LineThickness = 5;
Gizmo.Draw.Arrow( WorldPosition, pos.Value );
}
}
if ( RandomPoint )
{
Gizmo.Draw.LineThickness = 2;
Gizmo.Draw.Color = Color.Black.WithAlpha( 0.3f );
Gizmo.Draw.LineSphere( WorldPosition, RandomRadius );
for ( int i = 0; i < 100; i++ )
{
var pos = Scene.NavMesh.GetRandomPoint( WorldPosition, RandomRadius );
if ( pos.HasValue )
{
Gizmo.Draw.Color = Color.Black;
Gizmo.Draw.SolidBox( BBox.FromPositionAndSize( pos.Value, 5 ) );
}
}
}
if ( ClosestEdge )
{
var wall = Scene.NavMesh.GetClosestEdge( WorldPosition );
if ( wall.HasValue )
{
Gizmo.Draw.Color = Color.Yellow;
Gizmo.Draw.LineThickness = 5;
Gizmo.Draw.Arrow( WorldPosition, wall.Value );
}
}
if ( Path && Target.IsValid() )
{
Gizmo.Draw.Color = Color.Red;
Gizmo.Draw.LineThickness = 1;
//DrawArrow( Transform.Position, Target.Transform.Position );
Gizmo.Draw.LineThickness = 8;
var triangles = Scene.NavMesh.GetSimplePath( WorldPosition, Target.WorldPosition );
var up = Vector3.Up * 32.0f;
for ( int i = 1; i < triangles.Count; i++ )
{
Gizmo.Draw.Arrow( up + triangles[i - 1], up + triangles[i] );
}
}
}
}