назначить объекты класса вместо фактического класса сценария для объектов игры Unity в Unity c # - PullRequest
0 голосов
/ 10 ноября 2018

Я хочу создать игру в Unity C #, в которой игрок будет добавлять столько дронов, сколько ему нужно, в качестве игровых объектов в игровой мир. Поэтому я сделал префаб дронов, а позже во время выполнения я спрашиваю количество дронов, которые игрок хочет иметь (например, n чисел), и создаю их префаб n раз. Скрипт, который прикреплен к префабу дронов, называется drone_script. Поэтому у меня есть класс drone_script в качестве общего класса. Этот класс имеет атрибут (назовем его подписчиком), который должен иметь разные уникальные значения для каждого дрона. Таким образом, он создается как нулевая ссылка в общем классе drone_script, и позже во время выполнения я его инициализирую. Во время выполнения я создаю n (те же номера, что и у игровых объектов дронов) из этого класса и назначаю их атрибуту подписчика разные значения.

Вот как это выглядит:

     some_class
     {
         for (int i = 0; i < number_of_Drones; ++i)
                {
                    drones_script[i] = new drone_script(); 
                    \\ here I am creating n objects of my general drone_script class
                    drones_script[i].drone_subscriber = a unique value;
                    \\ here I am assigning to each of the drone objects' drone_subscriber attribute a different value.
                    drco = new Vector3((float)0, (float)1, (float)0);
                    drones[i] = Instantiate(Resources.Load("drone"), drco, 
                    Quaternion.Euler(-90, 0, 90)) as GameObject;
    \\I instatiate the drone prefab in unity game world here.
                }
  }


drone_script
{
 public ROSBridgeSubscriber drone_subscriber;
 void Start() { \\some code }
 void FixedUpdate () { \\some code }
}

Моя проблема в том, что когда объекты игры дронов создаются в единстве, к ним присоединяется общий класс drone_script, и поэтому их атрибут подписчика равен нулю. Однако мне нужно, чтобы объект drone_script [i] был назначен им как их сценарий, а не сам общий drone_script. Потому что только тогда каждый игровой объект дрон имеет соответствующее значение атрибута подписчика еще до вызова функции запуска. Я правильно думаю? Если да, как я могу это сделать?

1 Ответ

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

Прежде всего, я предлагаю вам назначить dronePrefab с помощью редактора или в методе Start "some_class", потому что Resources.Load ("drone") может потреблять ресурсы, поскольку вы загружаете ресурс дрона "n" раз.

Теперь ваша конкретная проблема, вам не нужно создавать новые экземпляры "drone_script", потому что, как вы упомянули сами, каждый создаваемый вами дрон имеет свой собственный "drone_script". В общем, что нам нужно сделать, это:

  1. Создать дрон и сохранить его ссылку (как GameObject)
  2. Получить "drone_script" этого дрона (используя GetComponent <> ();)
  3. Сохраните эту ссылку на скрипт в нашем массиве, чтобы мы могли использовать ее позже
  4. Настройте некоторые переменные этого скрипта сейчас или позже в игре

Нечто подобное должно работать. В коде все должно быть примерно так (не тестировал, может быть некоторые типы ошибок)

some_class
 {
     public GameObject dronePrefab;
     for (int i = 0; i < number_of_Drones; ++i)
     {
        // Step 1.
        drco = new Vector3((float)0, (float)1, (float)0);
        drones[i] = Instantiate(dronePrefab, drco, 
        Quaternion.Euler(-90, 0, 90)) as GameObject;
        // Steps 2 & 3
        drones_script[i] = drones[i].GetComponent<drone_script>();
        // Step 4
        drones_script[i].drone_subscriber = a unique value;            
    }
}

EDIT: Просто чтобы указать на это: drone_script должен быть присоединен к сборному дрону

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...