Суббота, 20 Апреля 2024, 06:26

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Передвижение по точкам. (Пытаюсь сваять TD, думаю, как сделать передвижение мобов.)
Передвижение по точкам.
DeathgarДата: Среда, 15 Марта 2017, 11:26 | Сообщение # 1
уже был
Сейчас нет на сайте
На сцене есть точки, в которые должны мобы идти последовательно.
Первый вопрос:
Есть код:
Код

using UnityEngine;
using System.Collections;

public class Enemie : MonoBehaviour {
    public float hp;
    public float speed;
    public float damage;

    public Transform[] transfArray; // массив с позициями точек
    private int count; //переход к точке
    private int size; // размер массива
    private bool arr = true; // массив не равен нулю

    void Start()
    {

  size = transfArray.Length;
  Debug.Log (size);
  if (size == 0)
  {
   arr = false;
  }

    }

    public void hpDamage(float damageTover)
    {
  hp -= damageTover;
    }
    

        //Движение в "if" происходит
    void Update ()
    {
  if (arr) {
   gameObject.transform.position = Vector3.Lerp (gameObject.transform.position, transfArray [count].position, speed);
   if (Vector3.Distance (gameObject.transform.position, transfArray [count].position) < 0.2f) {
    if (count == size) {
     //Destroy (transfArray [count].gameObject);
     //Дамаг таверу.
    } else
     count++;
   }
  }
    }
}


Но выдаёт ошибку: NullReferenceException: Object reference not set to an instance of an object Enemie.Update ()
Каждая точка массива, это отдельный префаб(что категорически не удобно, это второй вопроса.)

Второй вопрос:

Пытался как-то автоматизировать:

Код

private Transform[] transfArray;
    private int count;
    private int size;
    public int max; //количество точек
    private bool arr = true;

    void Start()
    {
  transfArray = new Transform[max];
  for (int i = 1; i <= max; i++)
  {
   string name = "Sphere " + i.ToString();
   transfArray[i-1] = GameObject.Find(name).GetComponent<Transform>();
  }

  if (size == 0)
  {
   arr = false;
  }
    }


Но он выдаёт ошибку "NullReferenceException: Object reference not set to an instance of an object Enemie.Start ()", хотя, если отдельно написать GameObject.Find("Sphere 1"), то вроде находит.

Как быть? Помогите или поделитесь своими методами передвижения мобов, пожалуйста.
URGINSANДата: Среда, 15 Марта 2017, 11:49 | Сообщение # 2
почти ветеран
Сейчас нет на сайте
Deathgar, попробуй поиск объекта делать не в старте, а например, в корутине чуть чуть позже от старта. Я раньше замечал, что поиск по тегу или еще как в start почти никогда не работает. В старте у меня только прямой поиск по имени пашет (если в одну строчку).
Код


void Start()
{
StartCoroutine(takeStart());
}

IENumerator takeStart()
    {
yield return new WaitForSeconds(0.5f);
  transfArray = new Transform[max];
  for (int i = 1; i <= max; i++)
  {
   string name = "Sphere " + i.ToString();
   transfArray[i-1] = GameObject.Find(name).GetComponent<Transform>();
  }

  if (size == 0)
  {
   arr = false;
  }
    }


Типа того, что-то.


Я на драйве
EchoITДата: Среда, 15 Марта 2017, 12:43 | Сообщение # 3
старожил
Сейчас нет на сайте
URGINSAN, всё прекрасно работает в старте. Ни разу такой проблемы не было. Зачем городить корутины в этом случае, вообще не понимаю. Видимо, тут фанаты goto собрались, везде эти корутины пропихивать пытаются. :(
К тому же, в его примере, поиск как раз по имени, который ну уж точно 100% работает.

Deathgar, на какой именно строчке ошибка выпадает?


Долгожданный анонсик: State of War

Сообщение отредактировал EchoIT - Среда, 15 Марта 2017, 13:48
DeathgarДата: Среда, 15 Марта 2017, 14:36 | Сообщение # 4
уже был
Сейчас нет на сайте
EchoIT, в первом случае:
Код
gameObject.transform.position = Vector3.Lerp (gameObject.transform.position, transfArray [count].position, speed);

Во втором:
Код
transfArray[i-1] = GameObject.Find(name).GetComponent<Transform>();

Добавлено (15 марта 2017, 14:21)
---------------------------------------------
Ребята, второй вопрос отпадает. Был мой косяк, походу связанный с именами...
Вот рабочий код:

Код

using UnityEngine;
using System.Collections;

private Transform[] transfArray;
    private int count;
    private int size;
    public int max; //количество точек
    private bool arr = true;

    void Start()
    {
  transfArray = new Transform[max];
  for (int i = 1; i <= max; i++)
  {
   string name = "Sphere " + i.ToString();
   transfArray[i-1] = GameObject.Find(name).GetComponent<Transform>();
  }

  if (size == 0)
  {
   arr = false;
  }
    }

    public void hpDamage(float damageTover)
    {
  hp -= damageTover;
    }
    

        //Движение в "if" происходит
    void Update ()
    {
  if (arr) {
   gameObject.transform.position = Vector3.Lerp (gameObject.transform.position, transfArray [count].position, speed);
   if (Vector3.Distance (gameObject.transform.position, transfArray [count].position) < 0.2f) {
    if (count == size) {
     //Destroy (transfArray [count].gameObject);
     //Дамаг таверу.
    } else
     count++;
   }
  }
    }
}

Если кому надо, пробуйте, должно работать, только имена меняйте на свои.

Но, движение получается рывками, от точке к точке.

Добавлено (15 марта 2017, 14:22)
---------------------------------------------
Можно закрывать...

Добавлено (15 марта 2017, 14:36)
---------------------------------------------
А вот, если заменить Update на такой, то будет плавно c:

Код
void Update ()
    {
  if (arr) {
   //gameObject.transform.position = Vector3.Lerp (gameObject.transform.position, transfArray [count].position, speed);
   transform.Translate(Vector3.Normalize(transfArray[count].position - transform.position) * Time.deltaTime * speed);
   if (Vector3.Distance (gameObject.transform.position, transfArray [count].position) < 0.2f) {
    if (count == size) {
     //Destroy (transfArray [count].gameObject);
     //Дамаг таверу.
    } else
     count++;
   }
  }
    }


Решено.
URGINSANДата: Среда, 15 Марта 2017, 21:37 | Сообщение # 5
почти ветеран
Сейчас нет на сайте
EchoIT, я несколько раз с подобным сталкивался. Именно поиск по тегу не успевал найти объект до его создания походу. Корутина спасала.

Я на драйве
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Передвижение по точкам. (Пытаюсь сваять TD, думаю, как сделать передвижение мобов.)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг