/// <summary> /// 获取该地形的通过费用 /// </summary> /// <param name="terrain"></param> /// <returns></returns> public static int GetCost(this Terrain terrain) { if (CostDict.TryGetValue(terrain, out int result) == false) { Debug.LogError($"存在未配置的地形类型:{terrain}"); throw new ArgumentException($"存在未配置的地形类型:{terrain}"); } return(result); }
/// <summary> /// 获取起始点至终点的导航点参数 /// </summary> /// <param name="map">游戏地图</param> /// <param name="startCost">其实费用</param> /// <param name="start">起始点</param> /// <param name="end">终点</param> /// <param name="args">角色通过性参数</param> /// <returns></returns> private NavigatePointArgs GetNavigatePointArgs(GameMap map, int startCost, Vector2Int start, Vector2Int end, RolePassabilityArgs args) { Terrain neighborTerrain = map[start.x, start.y].Terrain; int cost = PassabilityTest(args, neighborTerrain) == true ? int.MaxValue : neighborTerrain.GetCost(); return(new NavigatePointArgs() { ActualCost = cost + startCost, ExpectCoset = this.GetExpectCoset(start, end), Position = start, }); }
/// <summary> /// 通过性测试 /// </summary> /// <param name="args"></param> /// <param name="neighborTerrain"></param> /// <returns></returns> private static bool PassabilityTest(RolePassabilityArgs args, Terrain neighborTerrain) { return((args.CanPassMountain == false && neighborTerrain == Terrain.Mountain) || (args.CanPassWater == false && neighborTerrain == Terrain.Ocean)); }