Есть ли у геймобжетков в юнити идинтификатор, который не меняется при перезапуске игры?
Например для сохранения информации об объектах и далее восстановлении информации, нужно получить идинтификатор объекта, который уже есть на сцене. хешкод меняется при перезапуске игры
Вобщем в Юнити есть какой то режим Инспектора который позволяет увидить приватные поля у компонентов. Так вот у всех GameObject—ов есть какое то поле типа тега, у каждого он свой и этот тег сохраняет сам юнити вместе с обьектом. Для вкл режима этого нужно нажать на шестеренки в Inspector, потом там будет этот режим.
Вы можете создать собственный маленький класс, который будет хранить уникальный сгенеренный UUID идентификатор, по которому вы и будете объекты отличать.
Amir228, и да и нет
То приватное поле, которое вы описываете, есть fileID (Local Identifier In File, в инспекторе), например, 280494721. Прямого доступа к нему Unity не даёт. Но можно использовать InstanceID - это почти то же самое и к нему даже можно получить доступ: int instanceID = gameObject.GetInstanceID();
И это действительно можно использовать. Вот пример от ChatGPT
сохранение
[System.Serializable]
public class WorldData
{
public List<SerializableObjectData> objectDataList = new List<SerializableObjectData>();
}
[System.Serializable]
public class SerializableObjectData
{
public int instanceID;
public Vector3 position;
public Quaternion rotation;
// Другие данные об объекте...
}
// Ваш код сохранения данных мира
WorldData worldData = new WorldData();
foreach (GameObject gameObject in yourGameObjects)
{
SerializableObjectData objectData = new SerializableObjectData();
objectData.instanceID = gameObject.GetInstanceID();
objectData.position = gameObject.transform.position;
objectData.rotation = gameObject.transform.rotation;
// Заполните другие данные об объекте...
worldData.objectDataList.Add(objectData);
}
// Сохраните worldData в файл или другое хранилище.
загрузка
// Ваш код загрузки данных мира
// Загрузите worldData из файла или хранилища.
foreach (SerializableObjectData objectData in worldData.objectDataList)
{
GameObject gameObject = GameObject.FindObjectOfInstanceID(objectData.instanceID);
if (gameObject != null)
{
// Установите позицию и вращение объекта на основе сохраненных данных.
gameObject.transform.position = objectData.position;
gameObject.transform.rotation = objectData.rotation;
// Восстановите другие данные об объекте...
}
}
Тег, который вы упоминаете в комментарии - не лучший способ идентификации в контексте системы сохранения уникальных объектов, хотя он может дать больше конкретики о сущности объекта, чтобы сохранять не тупо все данные, а лишь нужные.
Например, если у вас есть дерево, которое можно срубить, и это дерево стоит со старта игры, вам не нужно сохранять все его данные, а лишь оставшуюся прочность. И если там 0, то это дерево просто не загружать при новой загрузке.
То, о чём писал я, ещё более конкретный способ идентификации, который, к тому же, позволяет инкапсулировать дополнительную логику. Например, можно повесить сразу несколько идентификаторов (банально лист значений enum).
Это просто другой способ делать то же самое, но немного иначе.