Исходя из моего понимания, ваш вопрос в основном вопрос дизайна.В первой части этого ответа я предлагаю вам сделать дизайн и сохранить ссылку на ваши объекты.Во второй части я дам вам несколько советов относительно производительности.
[Я использую RootObject вместо Object, чтобы отсылать вас к основному GameObject, который вы создаете.]
Дизайн
Давайте разберем наши потребности, а затем предложим решение для каждого.
Сначала мы хотим прочитать какой-нибудь текстовый файл, а затем получить из него некоторые данные.Эти данные будут использованы позже для создания GameObjects.А сейчас давайте сосредоточимся на самих данных.
Здесь нам нужен класс менеджера, который читает для нас файл и сохраняет данные в некоторой форме.Мы получаем доступ к этому менеджеру позже и запрашиваем наши данные для создания объектов GameObject.
Этот класс менеджера хранит наши данные в коллекции объектов данных [обратите внимание, что здесь речь идет о простых объектах, а не об объектах Unity GameObjects],Вам нужно спроектировать этот класс данных на основе каждой строки текста, которую вы имеетеПри желании вы также можете сохранить здесь ссылки на GameObjects.
Предположим, вы читаете три строковых значения из каждой строки с именами ValueOne
, ValueTwo
и ValueThree
и хотите сохранитьссылка на три объекта GameObject, называемых RootObject
, ToolTip
и Panel
.Для этой цели вы можете определить следующий класс:
public class DataModel {
// Values read from text file.
public string valueOne { get; private set; }
public string valueTwo { get; private set; }
public string valueThree { get; private set; }
// Placeholders for GameObjecs created at runtime.
public GameObject rootObject;
public GameObject tooltipObject;
public GameObject panelObject;
public DataModel(string valueOne, string valueTwo, string valueThree){
this.valueOne = valueOne;
this.valueTwo = valueTwo;
this.valueThree = valueThree;
}
}
Затем в вашем классе менеджера вы можете создать коллекцию (например, список) для хранения ваших данных.В какой-то момент ваш класс менеджера должен прочитать текстовый файл и заполнить этот список экземплярами DataModel.Это будет что-то вроде этого:
public class DataManager {
List<DataModel> dataCollection = new List<DataModel>();
public void ReadFile() {
// Here you need to read the file and get the values you need.
// The actual code should be different from what I'm putting here.
foreach(string line in lines) {
// You get valueOne, valueTwo and valueThree
// from each line and maybe prepare them
// (maybe you need conversion from string to int)
DataModel data = new DataModel(valueOne, valueTwo, valueThree);
dataCollection.Add(data);
}
}
}
После того, как вы вызовете метод для менеджера, чтобы прочитать данные, ваши данные будут подготовлены для вас всякий раз, когда вы захотите их использовать.
Пришло время создавать объекты на основе данных и сохранять ссылку.
for (int i = 0; i++; i <= manager.dataCollection.Count) {
DataModel data = manager.dataCollection[i];
data.rootObject = instantiate() // You instantiate the root GameObject here.
data.tooltip = instantiate() // You instantiate the tooltop GameObject here.
data.panel = instantiate() // You instantiate the panel GameObject here.
}
Готово.Теперь у вас есть класс менеджера, который имеет ссылку на все данные, а также объекты GameObject, которые создаются на основе этих данных.
Производительность
Это может быть не очень хорошая идеяделать все это во время выполнения, так как это может привести к падению кадров в вашей игре.Если это проблема, вы можете попробовать пул объектов.Если вы ищете это, вы сможете найти отличные учебные пособия о том, как выполнять пул объектов.
Если вы в конечном итоге не использовали пул объектов, вы все равно можете исправить любые падения производительности, создавая только один GameObject на кадр.Это можно сделать с помощью сопрограмм.Вам просто нужно сделать yield return new WaitForEndOfFrame()
в вашем цикле создания экземпляров.
Заключительное примечание
Имейте в виду, что это все предположение, и я не думаю, что тамэто один лучший ответ на ваш вопрос.Убедитесь, что вы пытаетесь понять, какие инструменты находятся в вашем распоряжении, и попробуйте их все, прежде чем выбрать одно решение.:)