Godot4 實現(xiàn)自動尋路 2D C#版
1.添加節(jié)點:
????NavigationRegion2D(2D導(dǎo)航地圖)
????Sprite2D(要移動的元素,圖片替代)
????Line2D(顯示路徑用)
2.代碼正文:
????float speed = 400;//移動速度
???? NavigationRegion2D navmesh;
???? Rid map;
???? bool isAc = false;
???? public Vector2 dhzb = new Vector2(0, 0);//要導(dǎo)航的終點坐標(biāo)
???? 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);
???? }
}
//開始導(dǎo)航
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? 導(dǎo)航函數(shù)
//初始化
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
}
//移動函數(shù)
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
//外部調(diào)用函數(shù)
public void ZBSetDH(string szb)
{
????SetDaoHang(GetNode<Sprite2D>(szb).Position);
}