Godot4 实现自动寻路 2D C#版
1.添加节点:
NavigationRegion2D(2D导航地图)
Sprite2D(要移动的元素,图片替代)
Line2D(显示路径用)
2.代码正文:
float speed = 400;//移动速度
NavigationRegion2D navmesh;
Rid map;
bool isAc = false;
public Vector2 dhzb = new Vector2(0, 0);//要导航的终点坐标
Line2D line;
List<Vector2> path;
Vector2 start_position;//起点
Sprite2D spdh;//开始点
// Called when the node enters the scene tree for the first time.
public override void _Ready()
{
CallDeferred("setup_navserver");
line = GetNode<Line2D>("Line2D");
start_position = GetNode<Sprite2D>("SPDMD").Position;
spdh = GetNode<Sprite2D>("SPDH");
navmesh = GetNode<NavigationRegion2D>("Navmesh");
}
// Called every frame. 'delta' is the elapsed time since the previous frame.
public override void _Process(double delta)
{
if (isAc)
{
var walk_distance = speed *(float)delta;
move_along_path(walk_distance);
}
}
//开始导航
public void SetDaoHang(Vector2 dhzb)
{
//start_position = start_position - pianyi;
spdh.Position = start_position;
line.ClearPoints();
path = NavigationServer2D.MapGetPath(map, spdh.Position, dhzb, true).ToList();
for (int i = 0; i < path.Count; i++)
{
line.AddPoint(path[i]);
}
path.RemoveAt(0);
isAc = true;
}
#region 导航函数
//初始化
private void setup_navserver()
{
map = NavigationServer2D.MapCreate();
NavigationServer2D.MapSetActive(map, true);
//create a new navigation region and add it to the map
var region = NavigationServer2D.RegionCreate();//
NavigationServer2D.RegionSetTransform(region, Transform2D.Identity);//
NavigationServer2D.RegionSetMap(region, map);//
//sets navigation mesh for the region
NavigationServer2D.RegionSetNavigationPolygon(region, navmesh.NavigationPolygon);
// wait for Navigation2DServer sync to adapt to made changes
}
//移动函数
private void move_along_path(float distance)
{
var last_point = spdh.Position;
for (int i = 0; i < path.Count; i++)
{
float distance_between_points = last_point.DistanceTo(path[0]);
if (distance <= distance_between_points)
{
//The position to move to falls between two points.
spdh.Position = last_point.Lerp(path[0], distance / distance_between_points);
//isAc = false;
return;
}
distance -= distance_between_points;
last_point = path[0];
//line.AddPoint(last_point);
path.RemoveAt(0);
}
spdh.Position = last_point;
if (path.Count == 0)
{
isAc = false;
}
}
#endregion
//外部调用函数
public void ZBSetDH(string szb)
{
SetDaoHang(GetNode<Sprite2D>(szb).Position);
}