@PlaBetaVer

Можно ли так писать классы в юнити?

В игре мне нужно создать определенное кол-во движущихся объектов, у них своя скорость и координаты ,в которых они двигаются, но создавать для каждого объекта скрипт нет смысла, так что лучше будет в инспекторе юнити сделать так, чтобы можно было указывать сколько объектов у меня будет и задавать параметры для них
Выглядит это вот так
5f5883885a5a2457042205.jpeg

А скрипт вот такой
using System.Linq;
using UnityEngine;
public class ObstacleManager : MonoBehaviour
{
    [System.Serializable]
    public class ObjectsCoords
    {
        public GameObject dynamicObstacle; // Объект
        public Transform[] dynamicCoords; // Координаты точек, к которым двигается объект
        public float speed;

        public bool isArrivedSecondCoord; // Прибыл ли объект к точке
    }

   public ObjectsCoords[] dynamicObj;

    // Задаем для объекта начальное положение
    void Start()
    {
        for (int i = 0; i < dynamicObj.Length; i++)
        {
            dynamicObj[i].dynamicObstacle.transform.position = dynamicObj[i].dynamicCoords[0].position;
        }

    }


    void Update()
    {
        for (int i = 0; i < dynamicObj.Length; i++)
        {
            // Если объект прибыл на точку, то меняется булевая переменная, благодаря которой объект отправиться обратно
            if (dynamicObj[i].dynamicObstacle.transform.position == dynamicObj[i].dynamicCoords[0].position && dynamicObj[i].isArrivedSecondCoord)
                dynamicObj[i].isArrivedSecondCoord = false;
            
            if (dynamicObj[i].dynamicObstacle.transform.position == dynamicObj[i].dynamicCoords[1].position && !dynamicObj[i].isArrivedSecondCoord)
                dynamicObj[i].isArrivedSecondCoord = true;
            
            // Задаем координаты, куда будет двигаться объект, если он прибыл на точку, то возвращается обратно
            if (!dynamicObj[i].isArrivedSecondCoord)
                dynamicObj[i].dynamicObstacle.transform.position = Vector2.MoveTowards(dynamicObj[i].dynamicObstacle.transform.position, dynamicObj[i].dynamicCoords[1].position, dynamicObj[i].speed * Time.deltaTime);
          
            if (dynamicObj[i].isArrivedSecondCoord)
                dynamicObj[i].dynamicObstacle.transform.position = Vector2.MoveTowards(dynamicObj[i].dynamicObstacle.transform.position, dynamicObj[i].dynamicCoords[0].position, dynamicObj[i].speed * Time.deltaTime);
            
        }
    }

}


Мне кажется, что можно написать скрипт лучше и менее загроможденным, чтоб не пришлось все время указывать экземпляр класса или все ок?
  • Вопрос задан
  • 108 просмотров
Решения вопроса 1
GavriKos
@GavriKos Куратор тега Unity Game Engine
тоб не пришлось все время указывать экземпляр класса

если вы о dynamicObj[i] - то как раз для таких случаев и делают 1 экземпляр скрипта на 1 объект.
Дополнительно минус вашей реализации - вы никак не мониторите уничтожение объектов.

И вам не надо создавать скрипт для каждого объекта - вам нужно создать экземпляр - т.е. сделать AddComponent
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
от 80 000 до 160 000 ₽
Stark Games Минск
До 3 500 $
Frostgate studio Новосибирск
от 60 000 до 100 000 ₽