Проблема с загрузкой json файла для игры песочницы на Unity

У меня есть игра песочница 3d для которой есть несколько префабов. И я хочу чтобы можно было через json файл загружать любое количество префабов с их позицией поворотом размером и типом.


Ответы (1 шт):

Автор решения: Angry Dev

Алгоритм действий следующий:

  1. Сделать структуру для сериализации свойств єкземпляров префабов
  2. Загрузить текст json со структорой и десериализовать ее
  3. Обойти этот список, загрузив префабы по имени и инстанциировать в указаном месте

Вот пример структуры и алгоритма который будет загружать 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.

→ Ссылка