Пример #1
0
    public TerrainNode[] FindPath(Vector3 start_position, Transform target_transform)
    {
        TerrainNode start_node  = terrain_nodes_list.FindClosestTerrainNodeToPoint(start_position);
        TerrainNode target_node = terrain_nodes_list.FindTerrainNodeFromTransform(target_transform);
        //print (target_node.transform.name);
        AdjacentNode          closest_node_to_target = new AdjacentNode(start_node, Vector3.Distance(start_node.position, target_node.position));
        Heap <TerrainNode>    open_set   = new Heap <TerrainNode>(terrain_size);
        HashSet <TerrainNode> closed_set = new HashSet <TerrainNode>();

        open_set.Add(start_node);

        //start_node.transform.gameObject.GetComponent<Renderer>().material = mat_start;
        //target_node.transform.gameObject.GetComponent<Renderer>().material = mat_target;

        // A* pathfinding algorithm
        while (open_set.Count > 0)
        {
            TerrainNode current_node = open_set.RemoveFirst();
            closed_set.Add(current_node);

            //current_node.transform.gameObject.GetComponent<Renderer>().material = mat_path;
            if (current_node == target_node)
            {
                return(RetracePath(start_node, target_node));
            }
            foreach (AdjacentNode adj_neighbour in current_node.GetAdjecentNodesArray())
            {
                TerrainNode neighbour = adj_neighbour.terrain_node;
                if (closed_set.Contains(neighbour))
                {
                    continue;
                }
                float new_movement_cost_to_new_neighbour = current_node.g_cost + adj_neighbour.distance;
                if (new_movement_cost_to_new_neighbour < neighbour.g_cost || !open_set.Contains(neighbour))
                {
                    neighbour.g_cost = new_movement_cost_to_new_neighbour;
                    neighbour.h_cost = Vector3.Distance(neighbour.position, target_node.position);
                    neighbour.parent = current_node;

                    if (!open_set.Contains(neighbour))
                    {
                        open_set.Add(neighbour);
                    }
                    else
                    {
                        open_set.UpdateItem(neighbour);
                    }
                    if (neighbour.h_cost < closest_node_to_target.distance)
                    {
                        closest_node_to_target = new AdjacentNode(neighbour, neighbour.h_cost);
                    }
                }
            }
        }
        // no path found, return the closest node to target
        return(FindPath(start_position, closest_node_to_target.transform));
    }
Пример #2
0
    // Use this for initialization
    void Start()
    {
        // global_settings contains information about the scene
        global_settings = global_manager.GetComponent <GlobalSettings>();
        terrain_define  = global_settings.terrain_define;

        // player_info contains information about the player
        player_info  = player_manager.GetComponent <PlayerInfo>();
        player_input = player_manager.GetComponent <PlayerInput>();

        // player
        player = player_info.player;

        // terrain
        terrain_nodes_list = terrain_define.terrain_nodes_list;
        pathfinder         = global_settings.pathfinder;
        //Debug.Log(terrain_nodes_list);
        path_to_follow = new TerrainNode[1] {
            terrain_nodes_list.FindClosestTerrainNodeToPoint(new Vector3(0.0f, 0.0f, 0.0f))
        };
    }