Unity C #.Как связать созданные объекты со сценарием поиска пути и как заставить игровой объект переместиться в список узлов? - PullRequest
0 голосов
/ 23 ноября 2018

Я использую Unity и C # и довольно плохо знаком с обоими.

У меня есть класс с именем Pathfinding, прикрепленный к пустому игровому объекту.Он требует ссылки на начальный игровой объект и конечный игровой объект и создает список узлов между ними в кратчайшем пути.(A *).

Мне нужна помощь:

  1. Как создать экземпляр моего вражеского игрового объекта из префаба и связать его с этим сценарием (обычно это делаетсяперетаскивая игровой объект на соответствующую плитку в редакторе).

  2. Как я могу сделать игровой объект движущимся, следуя списку, созданному алгоритмом поиска пути (возможно, занимает первый из списка,движется, потом пересчитывает)?Больше информации: Моя доска разделена на множество маленьких кубиков, алгоритм использует их для создания пути.Путь (список этих узлов) сохраняется.Я хочу, чтобы несколько врагов

Большое спасибо.Спросите меня, если это не достаточно ясно, и я постараюсь предоставить скриншоты или информацию.:)

1 Ответ

0 голосов
/ 23 ноября 2018

1.Создайте противника и добавьте его в список (который есть в вашем скрипте):

using UnityEngine;

    public class Controller: MonoBehaviour
    {
        GameObject enemyPrefab;

        List<GameObject> enemiesList = new List<GameObject>();

        void Start()
        {
          GameObject enemy = Instantiate(enemiePrefab, transform.position, transform.rotation);
          enemiesList.Add(enemy);
        }
    }

2.Заставьте объект двигаться по вашему пути:

Есть много способов сделать это, но я предлагаю вам сохранить в списке, массиве или что вы хотите, различные путевые точки что у вас есть.Затем заставьте своих врагов следовать за одной путевой точкой за другой.

Так что теперь ваш главный скрипт должен выглядеть так:

using UnityEngine;

public class Controller : MonoBehaviour
{
    public GameObject enemyPrefab;

    private List<GameObject> enemiesList = new List<GameObject>();
    public List<GameObject> wayPoints = new List<GameObject>();

    void Start()
    {
      GameObject enemy = Instantiate(enemiePrefab, transform.position, transform.rotation);
      enemy.wayPoints = wayPoints;
      enemiesList.Add(enemy);
    }
}

А ваш вражеский скрипт должен выглядеть так:

using UnityEngine;

    public class Enemy : MonoBehaviour
    {
       public List<GameObject> wayPoints = new List<GameObject>();

       public float speed;
       private Transform target;
       int waypointIndex = 0;

       private void Start()
       {
         target = List[waypointIndex].transform;
         waypointIndex++;
       }

        void Update()
        {
          // The step size is equal to speed times frame time.
          float step = speed * Time.deltaTime;

          // Move our position a step closer to the target.
          transform.position = Vector3.MoveTowards(transform.position, target.position, step);

          //If we arrive to the target, get the new target
          if(this.transform.position == target.position)
          {
            waypointIndex++;
            //if it is the last element, go to the first one again
            if(wayPointIndex > List.Count())
            {
              wayPointIndex = 0;
            }            
            target = List[waypointIndex].transform;      
          }              
        }
    }

Обратите внимание, что вы можете изменить код, чтобы ваш контроллер также перемещал каждого врага, но это ваше дело!

...