예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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());
            }
        }
예제 #3
0
        /// <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));
        }
예제 #4
0
 /// <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;
 }