/// <summary> /// Load a scene from JSON into the active scene /// </summary> /// <param name="json">JSON representation of this scene</param> /// <param name="assetPack">The AssetPack to be used for asset references</param> /// <param name="onAfterDeserialize">An action which will be invoked after deserialization before root objects are activated</param> /// <returns>The SerializationMetadata used to import this scene</returns> public static SerializationMetadata ImportScene(string json, AssetPack assetPack = null, Action <List <GameObject> > onAfterDeserialize = null) { var metadata = new SerializationMetadata(assetPack); var container = new SceneContainer(SceneManager.GetActiveScene(), metadata, false); var sceneRoot = new GameObject(); var sceneRootTransform = sceneRoot.transform; container.SceneRootTransform = sceneRootTransform; // Set root inactive so that we can activate everything at once sceneRoot.SetActive(false); try { SerializationUtils.DeserializeScene(json, metadata, ref container); } catch (Exception e) { Debug.LogException(e); container = null; } if (container != null) { k_Roots.Clear(); foreach (Transform child in sceneRootTransform) { k_Roots.Add(child.gameObject); } metadata.SetupSceneObjectMetadata(k_Roots); metadata.DoPostSerializationActions(); onAfterDeserialize?.Invoke(k_Roots); foreach (var root in k_Roots) { // Moving this root object out of its parent will activate all newly created GameObjects root.transform.SetParent(null, false); } } UnityObjectUtils.Destroy(sceneRoot); return(metadata); }
/// <summary> /// Alternative method to JsonSerialization.ToJson which uses JsonSceneWriter /// Use this if you need to support `ISerializationCallbacks` /// </summary> /// <param name="value">The value to serialize</param> /// <param name="metadata">SerializationMetadata for this call</param> /// <typeparam name="T">The type of the value being serialized</typeparam> /// <returns>A string containing the Json serialized representation of `value`</returns> public static string ToJson <T>(T value, SerializationMetadata metadata = null) { var parameters = new JsonSerializationParameters { DisableRootAdapters = true, DisableSerializedReferences = true }; using (var writer = new JsonStringBuffer(parameters.InitialCapacity, Allocator.Temp)) { var container = new PropertyWrapper <T>(value); var visitor = new JsonSceneWriter(metadata); visitor.SetStringWriter(writer); visitor.SetSerializedType(parameters.SerializedType); visitor.SetMinified(parameters.Minified); visitor.SetSimplified(parameters.Simplified); using (visitor.Lock()) PropertyContainer.Visit(ref container, visitor); return(writer.ToString()); } }
/// <summary> /// Serialize a scene to Json /// Scene must be loaded and valid /// </summary> /// <param name="scene">The scene to serialize</param> /// <param name="assetPack">The asset pack used to store and retrieve assets</param> /// <returns>The serialized scene as a Json string</returns> public static string SerializeScene(Scene scene, AssetPack assetPack = null) { var metadata = new SerializationMetadata(assetPack); return(ToJson(new SceneContainer(scene, metadata), metadata)); }
/// <summary> /// Create a new SerializationMetadata object for use in scene object serialization or deserialization /// </summary> /// <param name="assetPack">The AssetPack to use for asset references</param> public SerializationMetadata(AssetPack assetPack = null) { CurrentSerializationMetadata = this; m_AssetPack = assetPack; }