欢迎光临散文网 会员登陆 & 注册

Godot4 实现自动寻路 2D C#版

2023-05-17 14:20 作者:CG游戏  | 我要投稿

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);

}


Godot4 实现自动寻路 2D C#版的评论 (共 条)

分享到微博请遵守国家法律