[Из песочницы] Реализация волнового алгоритма нахождения кратчайшего пути к динамически движущимся объектам в unity3d на C# в 2d игре

using UnityEngine;
using System.Collections;

public class Battlefield2 : MonoBehaviour {
        
        public static int[,] battlefield; // матрица местности
        public int enemyNumber = 6, playerNumber = 3; //public для возможности редактировать через инспектор 
        public static int x, y; // ширина и высота поля
        
        public GameObject enemyMilitiaman; //префаб ополченца врага
        public GameObject swordsmanGO; //префаб мечника.
        public static bool ready = false; //мы не сможем начать искать путь, пока не разместим юнитов на поле.

        void Start () {
                battlefield = new int[,]{ // матрица нашей локации. 1 - стена. 0 - свободная клетка
                        {1,1,1,1,1,1,1,1,1,1},
                        {1,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,1},
                        {1,1,1,1,1,1,1,1,1,1}};
                
                setEnemyPosition (enemyNumber); // размещаем врагов на поле
                setPlayerPosition (playerNumber); // размещаем воинов игрока
                ready = true; // можем начинать искать путь
        }
        
        // Update is called once per frame
        void Update () {

        }

        void setEnemyPosition(int numberEnemies){
                //////
                ////// РАЗМЕСТИТЕ ЮНИТОВ КАК ВАМ НЕОБХОДИМО, В ДАННОМ ПРИМЕРЕ ЭТО БУДЕТ 1 ЮНИТ НА (14,2)
                /////
                // создаем объект противника
                GameObject go = Instantiate(enemyMilitiaman, new Vector3(14, 2, 10), Quaternion.identity) as GameObject; 
                battlefield[14, 2] = 1; // обязательно запишите в карту локации, что клетка, на которой находится воин, занята.
        }
        
        void setPlayerPosition(int numberPlayerWarior){
                //////
                ////// РАЗМЕСТИТЕ ЮНИТОВ КАК ВАМ НЕОБХОДИМО, В ДАННОМ ПРИМЕРЕ ЭТО БУДЕТ 1 ЮНИТ НА (2,6)
                /////
                GameObject go = Instantiate(swordsmanGO, new Vector3(2, 6, 10), Quaternion.identity) as GameObject;
                battlefield[2, 6] = 1;
        }
        
        public static void printMatrix(){
                string arr = "";
                for (int i = 0; i < x; i++) {
                        for (int j = 0; j < y; j++) {
                                arr += battlefield[i,j] + ",";
                        }
                        arr += "\n";
                }
                print (arr);
        }
}



© Habrahabr.ru