Проблема с загрузкой json файла для игры песочницы на Unity
У меня есть игра песочница 3d для которой есть несколько префабов. И я хочу чтобы можно было через json файл загружать любое количество префабов с их позицией поворотом размером и типом.
Ответы (1 шт):
Автор решения: Angry Dev
→ Ссылка
Алгоритм действий следующий:
- Сделать структуру для сериализации свойств єкземпляров префабов
- Загрузить текст json со структорой и десериализовать ее
- Обойти этот список, загрузив префабы по имени и инстанциировать в указаном месте
Вот пример структуры и алгоритма который будет загружать json и расставлять префабы:
using System;
using UnityEngine;
using Object = UnityEngine.Object;
public class InstanceLoader : MonoBehaviour
{
void Start()
{
// загружаем модель
var instances = LoadInstances();
// после того как модель готова - инстанцируем
instances.InstantiateAll();
}
// загружает json структуру инстансов
// НЕ ИНСТАНЦИРУЕТ, только загружает представление
public Instances LoadInstances()
{
// загружает из папки Resources файл instances.json.txt
// ВНИМАНИЕ! файл в папке resources должен иметь расширение .txt !!!
var text = Resources.Load<TextAsset>("instances.json");
return JsonUtility.FromJson<Instances>(text.text);
}
[Serializable]
public class Instances
{
public Instance[] instances;
// Инстарцирует все элементы представления
public void InstantiateAll()
{
foreach (var instance in instances)
{
instance.Instantiate();
}
}
}
[Serializable]
public class Instance
{
// используется имя префаба которые находятся в папке Resources проекта
public string prefabName;
public float[] position;
public float[] rotation;
public float[] scale;
public GameObject Instantiate()
{
var prefab = Resources.Load<GameObject>(prefabName);
var pos = new Vector3(position[0], position[1], position[2]);
var rot = Quaternion.Euler(new Vector3(rotation[0], rotation[1], rotation[2]));
var sc = new Vector3(scale[0], scale[1], scale[2]);
var result = Object.Instantiate(prefab, pos, rot);
result.transform.localScale = sc;
return result;
}
}
}
Добавьте этот скрипт на любой активный объект в сцене после чего добавтье файл instances.json.txt в папку Resources. Вот мой пример содержимого:
{
"instances": [
{
"prefabName": "prefab_a",
"position": [0, 0, 0],
"rotation": [0, 0, 0],
"scale": [1, 1, 1]
},
{
"prefabName": "prefab_b",
"position": [1, 0, 0],
"rotation": [0, 0, 0],
"scale": [1, 1, 1]
}
]
}
Добавьте 2 префаба с именами prefab_a и prefab_b в папку Resources и запустите Play Mode.