public override void Serialize(SerializedAssets serializedAssets, object[] serializeOptions, NodeBase objNode, List <Action <NodeBase> > postSerializeActions) { //Make sure this is always 36 characters long. this.referenceID = this.rootNode.GenerateID(); ComponentNode scriptNode = new ComponentNode(PCFResourceType.CLASS, referenceID, null, this.type.Name.ToString()); //Parent top level scripts to ObjectNode. objNode.AddChildNode(scriptNode); FieldInfo[] fields = this.type.GetFields(); for (int i = 0; i < fields.Length; i++) { if (fields[i].IsPublic && !fields[i].IsStatic) { SerializeField(serializedAssets, serializeOptions, scriptNode, postSerializeActions, fields[i]); } } AssetResource resource = new AssetResource(false); byte[] metaDataBuffer = ProtocolBufferSerializer.SerializeFieldData(this.type, this.fieldName, this.arrayItem, this.type.Assembly); resource.Serialize(this.referenceID, MetaDataType.PROTOBUF, metaDataBuffer, null); serializedAssets.AddResource(referenceID, PCFResourceType.CLASS, resource); }
public override void Serialize(SerializedAssets serializedAssets, object[] serializeOptions, NodeBase objNode, List <Action <NodeBase> > postSerializeActions) { //Make sure this is always 36 characters long. this.referenceID = this.rootNode.GenerateID(); ComponentNode componentNode = new ComponentNode(PCFResourceType.TRANSFORM, referenceID, null, this.transform.name); //Component nodes must always be parented to objNodes. objNode.AddChildNode(componentNode); Vector3[] vectors = new Vector3[3]; vectors[0] = this.transform.localPosition; vectors[1] = this.transform.localRotation.eulerAngles; vectors[2] = this.transform.localScale; byte[] bytes = WriteVector3ArrayToBytes(vectors); //Create serialized asset by converting data to a bytearray and give it to the constructor. AssetResource resource = new AssetResource(false); resource.Serialize(referenceID, MetaDataType.UNKOWN, null, bytes); serializedAssets.AddResource(referenceID, PCFResourceType.TRANSFORM, resource); //Nodes store their resource when serializing componentNode.SetSerializer(this); }
public override void Serialize(SerializedAssets serializedAssets, object[] serializeOptions, NodeBase objNode, List <Action <NodeBase> > postSerializeActions) { //Make sure this is always 36 characters long. this.referenceID = this.rootNode.GenerateID(); ComponentNode componentNode = new ComponentNode(PCFResourceType.MESH, referenceID, null); //Component nodes must always be parented to objNodes. objNode.AddChildNode(componentNode); //Serialize mesh into a byte array. byte[] bytes = MeshSerializeUtilities.WriteMesh(this.meshFilter.sharedMesh, true, false); //Serialize Material UnitySerializeMaterial materialSerializer = new UnitySerializeMaterial(this.meshRenderer.sharedMaterial, this.rootNode); materialSerializer.Serialize(serializedAssets, serializeOptions, componentNode, postSerializeActions); //Make sure mesh knows that material it needs. JObject metaData = new JObject(); metaData["materialID"] = materialSerializer.GetPointerID(); //Create serialized asset by converting data to a bytearray and give it to the constructor. AssetResource resource = new AssetResource(false); byte[] metaDataBuffer = System.Text.Encoding.UTF8.GetBytes(metaData.ToString(Formatting.None)); resource.Serialize(referenceID, MetaDataType.JSON, metaDataBuffer, bytes); serializedAssets.AddResource(referenceID, PCFResourceType.MESH, resource); //Nodes store their resource when serializing componentNode.SetSerializer(this); }
public override void Serialize(SerializedAssets serializedAssets, object[] serializeOptions, NodeBase objNode, List <Action <NodeBase> > postSerializeActions) { if (File.Exists(this.internalBundlePath)) { //Make sure this is always 36 characters long. this.referenceID = this.rootNode.GenerateID(); ComponentNode componentNode = new ComponentNode(PCFResourceType.INTERNALBUNDLE, referenceID, null, platform); //Material nodes can and are most likely to be children of other component nodes. objNode.AddChildNode(componentNode); JObject metaData = new JObject(); metaData["platform"] = platform; metaData["contents"] = contents; byte[] serializedBundle = File.ReadAllBytes(internalBundlePath); //Create serialized asset by converting data to a bytearray and give it to the constructor. AssetResource resource = new AssetResource(false); byte[] metaDataBuffer = System.Text.Encoding.UTF8.GetBytes(metaData.ToString(Formatting.None)); resource.Serialize(referenceID, MetaDataType.JSON, metaDataBuffer, serializedBundle); serializedAssets.AddResource(referenceID, PCFResourceType.INTERNALBUNDLE, resource); } }
public override void Serialize(SerializedAssets serializedAssets, object[] serializeOptions, NodeBase objNode, List <Action <NodeBase> > postSerializeActions) { //Make sure this is always 36 characters long. this.referenceID = this.rootNode.GenerateID(); ComponentNode componentNode = new ComponentNode(PCFResourceType.ANIMATOR, referenceID, null); //Component nodes must always be parented to objNodes. objNode.AddChildNode(componentNode); //Serialize child node ( the avatar ) //We serialize as reference. UnitySerializeAvatar avatarReferenceSerializer = new UnitySerializeAvatar(this.animator, this.parentGO, this.rootNode); avatarReferenceSerializer.Serialize(serializedAssets, serializeOptions, componentNode, postSerializeActions); JObject metaData = new JObject(); //Serialize apply root motion variable in the metadata. metaData["applyRootMotion"] = this.animator.applyRootMotion; //Serialize avatarReference in the metadata. metaData["avatarReferenceID"] = avatarReferenceSerializer.GetReferenceID(); //Create serialized asset by converting data to a bytearray and give it to the constructor. AssetResource resource = new AssetResource(false); byte[] metaDataBuffer = System.Text.Encoding.UTF8.GetBytes(metaData.ToString(Formatting.None)); resource.Serialize(referenceID, MetaDataType.JSON, metaDataBuffer, null); serializedAssets.AddResource(referenceID, PCFResourceType.ANIMATOR, resource); //Nodes store their resource when serializing componentNode.SetSerializer(this); }
public override void Serialize(SerializedAssets serializedAssets, object[] serializeOptions, NodeBase objNode, List <Action <NodeBase> > postSerializeActions) { //Make sure this is always 36 characters long. this.referenceID = this.rootNode.GenerateID(); ComponentNode componentNode = new ComponentNode(PCFResourceType.SKINNEDMESH, referenceID, null); //Component nodes must always be parented to objNodes. objNode.AddChildNode(componentNode); byte[] bytes = MeshSerializeUtilities.WriteMesh(this.skinnedMesh.sharedMesh, true, true); //Serialize Material UnitySerializeMaterial materialSerializer = new UnitySerializeMaterial(this.skinnedMesh.sharedMaterial, this.rootNode); materialSerializer.Serialize(serializedAssets, serializeOptions, componentNode, postSerializeActions); //Make sure mesh knows that material it needs. JObject metaData = new JObject(); metaData["materialID"] = materialSerializer.GetPointerID(); metaData["rootBone"] = skinnedMesh.rootBone.name; if (skinnedMesh.probeAnchor != null) { metaData["probeAnchor"] = skinnedMesh.probeAnchor.name; } metaData["quality"] = (int)skinnedMesh.quality; JArray bones = new JArray(); for (int i = 0; i < skinnedMesh.bones.Length; i++) { bones.Add(skinnedMesh.bones[i].name); } metaData["bones"] = bones; JArray blendShapeWeights = new JArray(); for (int i = 0; i < skinnedMesh.sharedMesh.blendShapeCount; i++) { blendShapeWeights.Add(skinnedMesh.GetBlendShapeWeight(i)); } metaData["blendShapeWeights"] = blendShapeWeights; //Create serialized asset by converting data to a bytearray and give it to the constructor. AssetResource resource = new AssetResource(false); byte[] metaDataBuffer = System.Text.Encoding.UTF8.GetBytes(metaData.ToString(Formatting.None)); resource.Serialize(referenceID, MetaDataType.JSON, metaDataBuffer, bytes); serializedAssets.AddResource(referenceID, PCFResourceType.SKINNEDMESH, resource); //Nodes store their resource when serializing componentNode.SetSerializer(this); }
public override void Serialize(SerializedAssets serializedAssets, object[] serializeOptions, NodeBase objNode, List <Action <NodeBase> > postserializeActions) { if (this.audioClip == null) { Debug.Log("Missing audio clip! If this is intentional ignore this message."); return; } #if UNITY_EDITOR //Make sure this is always 36 characters long. this.referenceID = this.rootNode.GenerateID(); AudioSerializeOpts serializeOption = null; for (int i = 0; i < serializeOptions.Length; i++) { object opt = serializeOptions[i]; if (opt is AudioSerializeOpts) { serializeOption = opt as AudioSerializeOpts; break; } } if (serializeOption == null) { return; } ComponentNode scriptNode = new ComponentNode(PCFResourceType.AUDIO, referenceID, null, typeof(UnityEngine.AudioClip).Name.ToString()); objNode.AddChildNode(scriptNode); bool streamed = true; byte[] audioData = serializeOption.PackageAudio(audioClip, serializedAssets, this.referenceID, ref streamed); JObject metaData = new JObject(); metaData["fieldName"] = this.fieldName; metaData["arrayItem"] = this.arrayItem; metaData["name"] = this.audioClip.name; metaData["sampleRate"] = this.audioClip.frequency; metaData["channels"] = this.audioClip.channels; metaData["samples"] = this.audioClip.samples * this.audioClip.channels; metaData["streamed"] = streamed; byte[] metaDataBuffer = System.Text.Encoding.UTF8.GetBytes(metaData.ToString(Formatting.None)); AssetResource resource = new AssetResource(true); resource.Serialize(referenceID, MetaDataType.JSON, metaDataBuffer, audioData); serializedAssets.AddResource(referenceID, PCFResourceType.AUDIO, resource); #endif }
public override void Serialize(SerializedAssets serializedAssets, object[] serializeOptions, NodeBase objNode, List <Action <NodeBase> > postSerializeActions) { #if UNITY_EDITOR //Make sure this is always 36 characters long. this.referenceID = this.rootNode.GenerateID(); ComponentNode componentNode = new ComponentNode(PCFResourceType.TEXTURE, referenceID, null); //Component nodes must always be parented to objNodes. objNode.AddChildNode(componentNode); if (this.texture != null) { TextureSerializeOpts serializeOption = null; for (int i = 0; i < serializeOptions.Length; i++) { object opt = serializeOptions[i]; if (opt is TextureSerializeOpts) { serializeOption = opt as TextureSerializeOpts; break; } } if (serializeOption == null) { return; } //Create serialized asset by converting data to a bytearray and give it to the constructor. AssetResource resource = new AssetResource(false); TextureDataFormat format = TextureDataFormat.Empty; byte[] textureData = serializeOption.PackageTexture(this.texture, serializedAssets, referenceID, ref format); JObject metaData = new JObject(); metaData["width"] = this.texture.width; metaData["height"] = this.texture.height; metaData["textureFormat"] = (int)format; byte[] metaDataBuffer = System.Text.Encoding.UTF8.GetBytes(metaData.ToString(Formatting.None)); resource.Serialize(referenceID, MetaDataType.JSON, metaDataBuffer, textureData); serializedAssets.AddResource(referenceID, PCFResourceType.TEXTURE, resource); //Nodes store their resource when serializing componentNode.SetSerializer(this); } #endif }
public override void Serialize(SerializedAssets serializedAssets, object[] serializeOptions, NodeBase objNode, List <Action <NodeBase> > postSerializeActions) { //Make sure this is always 36 characters long. this.referenceID = this.rootNode.GenerateID(); //If the datatype is not a primitive look for a class specific serializer to invoke. Assembly assembly = Assembly.GetAssembly(this.GetType()); string namespaceName = this.GetType().Namespace; string serializerName = namespaceName + "." + this.type.Name + "Serialization"; Type serializerType = assembly.GetType(serializerName, false); List <UInt32> collectionIDs = new List <UInt32>(); //See if there is a custom serializer defined for this type. if (serializerType != null) { ComponentNode componentNode = new ComponentNode(PCFResourceType.POINTERCOLLECTION, referenceID, null, this.type.Name.ToString()); objNode.AddChildNode(componentNode); for (int i = 0; i < this.values.Length; i++) { System.Object obj = this.values[i]; object serializerClass = Activator.CreateInstance(serializerType, Convert.ChangeType(obj, this.type), "", true, this.rootNode); MethodInfo serializeMethod = serializerType.GetMethod("Serialize"); MethodInfo pointerIDMethod = serializerType.GetMethod("GetPointerID"); object[] parameters = new object[4]; parameters[0] = serializedAssets; parameters[1] = serializeOptions; parameters[2] = componentNode; parameters[3] = postSerializeActions; serializeMethod.Invoke(serializerClass, parameters); UInt32 refID = (UInt32)pointerIDMethod.Invoke(serializerClass, null); collectionIDs.Add(refID); } AssetResource resource = new AssetResource(false); byte[] metaDataBuffer = ProtocolBufferSerializer.SerializeCollectionData(this.type, this.fieldName, collectionIDs.Count, collectionIDs.ToArray(), this.type.Assembly); resource.Serialize(this.referenceID, MetaDataType.PROTOBUF, metaDataBuffer, null); serializedAssets.AddResource(referenceID, PCFResourceType.POINTERCOLLECTION, resource); } }
public override void Serialize(SerializedAssets serializedAssets, object[] serializeOptions, NodeBase objNode, List <Action <NodeBase> > postSerializeActions) { //Make sure this is always 36 characters long. this.referenceID = this.rootNode.GenerateID(); byte[] bytes = null; if (this.type == typeof(string)) { if (this.value != null) { bytes = System.Text.Encoding.UTF8.GetBytes((string)this.value); } } else if (this.type == typeof(int)) { bytes = BitConverter.GetBytes((int)this.value); } else if (this.type == typeof(float)) { bytes = BitConverter.GetBytes((float)this.value); } else if (this.type == typeof(double)) { bytes = BitConverter.GetBytes((double)this.value); } else if (this.type == typeof(bool)) { bytes = BitConverter.GetBytes((bool)this.value); } else if (this.type == typeof(byte[])) { bytes = (byte[])this.value; } if (bytes != null) { ComponentNode componentNode = new ComponentNode(PCFResourceType.PRIMITIVE, referenceID, null, this.type.Name.ToString()); objNode.AddChildNode(componentNode); AssetResource resource = new AssetResource(false); byte[] metaDataBuffer = ProtocolBufferSerializer.SerializeFieldData(this.type, this.fieldName, this.arrayItem, this.type.Assembly); resource.Serialize(this.referenceID, MetaDataType.PROTOBUF, metaDataBuffer, bytes); serializedAssets.AddResource(referenceID, PCFResourceType.PRIMITIVE, resource); } }
public override void Serialize(SerializedAssets serializedAssets, object[] serializeOptions, NodeBase objNode, List <Action <NodeBase> > postserializeActions) { //Make sure this is always 36 characters long. this.referenceID = this.rootNode.GenerateID(); ComponentNode scriptNode = new ComponentNode(PCFResourceType.GRADIENT, referenceID, null, typeof(UnityEngine.Gradient).Name.ToString()); objNode.AddChildNode(scriptNode); GradientColorKey[] colorKeys = this.gradient.colorKeys; System.Object[] convertedColorKeys = new System.Object[colorKeys.Length]; for (int i = 0; i < colorKeys.Length; i++) { GradientColorKey colorKey = colorKeys[i]; convertedColorKeys[i] = colorKey as System.Object; } UnitySerializeCollection colorKeySerializer = new UnitySerializeCollection(convertedColorKeys, typeof(UnityEngine.GradientColorKey), null, "colorKeys", rootNode); colorKeySerializer.Serialize(serializedAssets, serializeOptions, scriptNode, postserializeActions); GradientAlphaKey[] alphaKeys = this.gradient.alphaKeys; System.Object[] convertedAlphaKeys = new System.Object[alphaKeys.Length]; for (int i = 0; i < alphaKeys.Length; i++) { GradientAlphaKey alphaKey = alphaKeys[i]; convertedAlphaKeys[i] = alphaKey as System.Object; } UnitySerializeCollection alphaKeySerializer = new UnitySerializeCollection(convertedAlphaKeys, typeof(UnityEngine.GradientAlphaKey), null, "alphaKeys", rootNode); alphaKeySerializer.Serialize(serializedAssets, serializeOptions, scriptNode, postserializeActions); AssetResource resource = new AssetResource(false); byte[] metaDataBuffer = ProtocolBufferSerializer.SerializeFieldData(this.gradient.GetType(), this.fieldName, this.arrayItem, this.gradient.GetType().Assembly); resource.Serialize(this.referenceID, MetaDataType.PROTOBUF, metaDataBuffer, null); serializedAssets.AddResource(referenceID, PCFResourceType.GRADIENT, resource); }
public override void Serialize(SerializedAssets serializedAssets, object[] serializeOptions, NodeBase objNode, List <Action <NodeBase> > postSerializeActions) { //Make sure this is always 36 characters long. this.referenceID = this.rootNode.GenerateID(); ComponentNode componentNode = new ComponentNode(PCFResourceType.COLLIDER, referenceID, null); //Material nodes can and are most likely to be children of other component nodes. objNode.AddChildNode(componentNode); //Create serialized asset by converting data to a bytearray and give it to the constructor. AssetResource resource = new AssetResource(false); resource.Serialize(referenceID, MetaDataType.UNKOWN, null, null); serializedAssets.AddResource(referenceID, PCFResourceType.COLLIDER, resource); //Nodes store their resource when serializing componentNode.SetSerializer(this); }
public override void Serialize(SerializedAssets serializedAssets, object[] serializeOptions, NodeBase objNode, List <Action <NodeBase> > postSerializeActions) { //Make sure this is always 36 characters long. this.referenceID = this.rootNode.GenerateID(); AvatarSerializeOpts serializeOption = null; for (int i = 0; i < serializeOptions.Length; i++) { object opt = serializeOptions[i]; if (opt is AvatarSerializeOpts) { serializeOption = opt as AvatarSerializeOpts; break; } } if (serializeOption == null) { return; } ComponentNode componentNode = new ComponentNode(PCFResourceType.AVATAR, referenceID, null); //Component nodes must always be parented to objNodes. objNode.AddChildNode(componentNode); JObject metaData = serializeOption.SerializeAvatar(this.parentGO, this.animator); //Create serialized asset by converting data to a bytearray and give it to the constructor. AssetResource resource = new AssetResource(false); byte[] metaDataBuffer = System.Text.Encoding.UTF8.GetBytes(metaData.ToString(Formatting.None)); resource.Serialize(referenceID, MetaDataType.JSON, metaDataBuffer, null); serializedAssets.AddResource(referenceID, PCFResourceType.AVATAR, resource); //Nodes store their resource when serializing componentNode.SetSerializer(this); }
public override void Serialize(SerializedAssets serializedAssets, object[] serializeOptions, NodeBase objNode, List <Action <NodeBase> > postserializeActions) { this.referenceID = this.rootNode.GenerateID(); ComponentNode componentNode = new ComponentNode(PCFResourceType.TRANSFORMPOINTER, referenceID, null, this.transform.GetType().Name.ToString()); objNode.AddChildNode(componentNode); //Find the node this node points to in the tree. NodeBase transformNode = FindTransformInTree(rootNode, this.transform.name); UInt32 referencedID = transformNode.GetReferenceID(); AssetResource resource = new AssetResource(false); byte[] metaDataBuffer = ProtocolBufferSerializer.SerializeFieldData(this.transform.GetType(), this.fieldName, this.arrayItem, this.transform.GetType().Assembly); resource.Serialize(this.referenceID, MetaDataType.PROTOBUF, metaDataBuffer, BitConverter.GetBytes(referencedID)); serializedAssets.AddResource(referenceID, PCFResourceType.TRANSFORMPOINTER, resource); this.pointedID = transformNode.GetReferenceID(); }
public override void Serialize(SerializedAssets serializedAssets, object[] serializeOptions, NodeBase objNode, List <Action <NodeBase> > postSerializeActions) { //Make sure this is always 36 characters long. this.referenceID = this.rootNode.GenerateID(); ComponentNode componentNode = new ComponentNode(PCFResourceType.LIGHT, referenceID, null); //Material nodes can and are most likely to be children of other component nodes. objNode.AddChildNode(componentNode); byte[] bytes = new byte[24]; float[] data = new float[6]; data[0] = this.light.color.r; data[1] = this.light.color.g; data[2] = this.light.color.b; data[3] = this.light.color.a; data[4] = (float)this.light.type; data[5] = this.light.intensity; for (int i = 0; i < data.Length; i++) { Buffer.BlockCopy(BitConverter.GetBytes(data[i]), 0, bytes, 4 * i, 4); } //Create serialized asset by converting data to a bytearray and give it to the constructor. AssetResource resource = new AssetResource(false); resource.Serialize(referenceID, MetaDataType.UNKOWN, null, bytes); serializedAssets.AddResource(referenceID, PCFResourceType.LIGHT, resource); //Nodes store their resource when serializing componentNode.SetSerializer(this); }
public override void Serialize(SerializedAssets serializedAssets, object[] serializeOptions, NodeBase objNode, List <Action <NodeBase> > postSerializeActions) { //Make sure this is always 36 characters long. this.referenceID = this.rootNode.GenerateID(); ComponentNode componentNode = new ComponentNode(PCFResourceType.ANIMATION, referenceID, null); //Component nodes must always be parented to objNodes. objNode.AddChildNode(componentNode); //Get fields using reflection PropertyInfo[] properties = animation.GetType().GetProperties(); for (int i = 0; i < properties.Length; i++) { if (properties[i].CanWrite) { PropertyInfo currentProperty = properties[i]; Type valueType = currentProperty.PropertyType; //Find matching deserializer using reflection and field type as string or similar. if (valueType.IsPrimitive || valueType == typeof(string)) { UnitySerializerBase primitiveSerializer = new UnitySerializePrimitive(currentProperty.GetValue(animation, null), valueType, currentProperty.Name, false, this.rootNode); primitiveSerializer.Serialize(serializedAssets, serializeOptions, componentNode, postSerializeActions); } else if (typeof(IList).IsAssignableFrom(properties[i].PropertyType)) { //Convoluted way to make sure we have an array of System.Object. IEnumerable collection = currentProperty.GetValue(animation, null) as IEnumerable; List <System.Object> intermediateList = new List <System.Object>(); foreach (System.Object item in collection) { intermediateList.Add(item); } System.Object[] values = intermediateList.ToArray(); if (values != null && values.Length > 0) { UnitySerializerBase collectionSerializer = new UnitySerializeCollection(values, values[0].GetType(), animation, currentProperty.Name, rootNode); collectionSerializer.Serialize(serializedAssets, serializeOptions, componentNode, postSerializeActions); } } else if (valueType.IsClass || valueType.IsLayoutSequential) { //If the datatype is not a primitive look for a class specific serializer to invoke. Assembly assembly = Assembly.GetAssembly(this.GetType()); string namespaceName = this.GetType().Namespace; string serializerName = namespaceName + "." + valueType.Name + "Serialization"; Type serializerType = assembly.GetType(serializerName, false); System.Object val = properties[i].GetValue(this.animation, null); //If we have implemented a custom serializer for this type we invoke it and let it serialize relevant data. if (serializerType != null) { object serializerClass = Activator.CreateInstance(serializerType, Convert.ChangeType(val, valueType), currentProperty.Name, false, this.rootNode); MethodInfo serializeMethod = serializerType.GetMethod("Serialize"); object[] parameters = new object[4]; parameters[0] = serializedAssets; parameters[1] = serializeOptions; parameters[2] = componentNode; parameters[3] = postSerializeActions; serializeMethod.Invoke(serializerClass, parameters); } else { //Use generic serializer incase not found. UnitySerializerBase classSerialize = new UnitySerializeClass(currentProperty.GetValue(this.animation, null), valueType, currentProperty.Name, false, this.rootNode); classSerialize.Serialize(serializedAssets, serializeOptions, componentNode, postSerializeActions); } } } } //Create serialized asset by converting data to a bytearray and give it to the constructor. AssetResource resource = new AssetResource(false); resource.Serialize(referenceID, MetaDataType.UNKOWN, null, null); serializedAssets.AddResource(referenceID, PCFResourceType.ANIMATION, resource); }
public override void Serialize(SerializedAssets serializedAssets, object[] serializeOptions, NodeBase objNode, List <Action <NodeBase> > postSerializeActions) { //Make sure this is always 36 characters long. this.referenceID = this.rootNode.GenerateID(); ComponentNode scriptNode = new ComponentNode(PCFResourceType.SCRIPT, referenceID, null, this.script.GetType().Name.ToString()); //Parent top level scripts to ObjectNode. objNode.AddChildNode(scriptNode); JObject metaData = new JObject(); metaData["scriptname"] = this.script.GetType().ToString(); //Get fields using reflection FieldInfo[] fields = script.GetType().GetFields(); for (int i = 0; i < fields.Length; i++) { if (fields[i].IsPublic && !fields[i].IsStatic) { FieldInfo currentField = fields[i]; Type valueType = currentField.FieldType; //Find matching deserializer using reflection and field type as string or similar. if (valueType.IsPrimitive || valueType == typeof(string)) { UnitySerializerBase primitiveSerializer = new UnitySerializePrimitive(currentField.GetValue(script), valueType, currentField.Name, false, this.rootNode); primitiveSerializer.Serialize(serializedAssets, serializeOptions, scriptNode, postSerializeActions); } else if (typeof(IList).IsAssignableFrom(fields[i].FieldType)) { //Convoluted way to make sure we have an array of System.Object. IEnumerable collection = currentField.GetValue(script) as IEnumerable; List <System.Object> intermediateList = new List <System.Object>(); foreach (System.Object item in collection) { intermediateList.Add(item); } System.Object[] values = intermediateList.ToArray(); if (values != null && values.Length > 0) { UnitySerializerBase collectionSerializer = new UnitySerializeCollection(values, values[0].GetType(), script, currentField.Name, rootNode); collectionSerializer.Serialize(serializedAssets, serializeOptions, scriptNode, postSerializeActions); } } else if (valueType.IsClass || valueType.IsLayoutSequential) { //If the datatype is not a primitive look for a class specific serializer to invoke. Assembly assembly = Assembly.GetAssembly(this.GetType()); string namespaceName = this.GetType().Namespace; string serializerName = namespaceName + "." + valueType.Name + "Serialization"; Type serializerType = assembly.GetType(serializerName, false); System.Object val = fields[i].GetValue(this.script); //If we have implemented a custom serializer for this type we invoke it and let it serialize relevant data. if (serializerType != null) { object serializerClass = Activator.CreateInstance(serializerType, Convert.ChangeType(val, valueType), currentField.Name, false, this.rootNode); MethodInfo serializeMethod = serializerType.GetMethod("Serialize"); object[] parameters = new object[4]; parameters[0] = serializedAssets; parameters[1] = serializeOptions; parameters[2] = scriptNode; parameters[3] = postSerializeActions; serializeMethod.Invoke(serializerClass, parameters); } else { //Use generic serializer incase not found. UnitySerializerBase classSerialize = new UnitySerializeClass(currentField.GetValue(this.script), valueType, currentField.Name, false, this.rootNode); classSerialize.Serialize(serializedAssets, serializeOptions, scriptNode, postSerializeActions); } } } } AssetResource resource = new AssetResource(false); byte[] metaDataBuffer = System.Text.Encoding.UTF8.GetBytes(metaData.ToString(Formatting.None)); resource.Serialize(this.referenceID, MetaDataType.JSON, metaDataBuffer, null); serializedAssets.AddResource(referenceID, PCFResourceType.SCRIPT, resource); }
public override void Serialize(SerializedAssets serializedAssets, object[] serializeOptions, NodeBase objNode, List <Action <NodeBase> > postSerializeActions) { //Make sure this is always 36 characters long. this.referenceID = this.rootNode.GenerateID(); LightprobeSerializeOpts serializeOption = null; for (int i = 0; i < serializeOptions.Length; i++) { object opt = serializeOptions[i]; if (opt is LightprobeSerializeOpts) { serializeOption = opt as LightprobeSerializeOpts; break; } } if (serializeOption == null) { return; } ComponentNode componentNode = new ComponentNode(PCFResourceType.LIGHTPROBES, referenceID, null); //Material nodes can and are most likely to be children of other component nodes. objNode.AddChildNode(componentNode); //Manually serialize SH components,. //However unity does not currently expose any way to generate the probes at runtime. //So we cannot set them directly unless the probes exist. (Fix it unity :D) byte[] serializedProbes = SerializeLightProbes(this.lightProbes); Dictionary <string, FileInfo> internalBundles = serializeOption.ListInternalBundles(); JArray bundleReferences = new JArray(); foreach (KeyValuePair <string, FileInfo> pair in internalBundles) { UnitySerializeInternalBundle bundleSerializer = new UnitySerializeInternalBundle(pair.Key, pair.Value.FullName, string.Empty, this.rootNode); bundleSerializer.Serialize(serializedAssets, serializeOptions, componentNode, postSerializeActions); JObject item = new JObject(); item["platform"] = pair.Key; item["referenceID"] = bundleSerializer.GetReferenceID(); bundleReferences.Add(item); } JObject metaData = new JObject(); metaData["numberOfProbes"] = this.lightProbes != null ? this.lightProbes.bakedProbes.Length : 0; metaData["bundleReferences"] = bundleReferences; //Create serialized asset by converting data to a bytearray and give it to the constructor. AssetResource resource = new AssetResource(false); byte[] metaDataBuffer = System.Text.Encoding.UTF8.GetBytes(metaData.ToString(Formatting.None)); resource.Serialize(referenceID, MetaDataType.JSON, metaDataBuffer, serializedProbes); serializedAssets.AddResource(referenceID, PCFResourceType.LIGHTPROBES, resource); //Nodes store their resource when serializing componentNode.SetSerializer(this); }
public override void Serialize(SerializedAssets serializedAssets, object[] serializeOptions, NodeBase objNode, List <Action <NodeBase> > postSerializeActions) { #if UNITY_EDITOR //Make sure this is always 36 characters long. this.referenceID = this.rootNode.GenerateID(); //Check if node hierarchy contains this material already. string path = AssetDatabase.GetAssetPath(this.material); NodeBase materialNode = CheckSharedMaterial(this.rootNode, path); //If material is already serialized (aka shared we simply serialize a pointer to it. if (materialNode != null) { //Debug.Log("Shared Material: " + path); UInt32 materialID = materialNode.GetReferenceID(); ComponentNode componentNode = new ComponentNode(PCFResourceType.MATERIALPOINTER, referenceID, null); objNode.AddChildNode(componentNode); byte[] bytes = BitConverter.GetBytes(materialID); //Create serialized asset by converting data to a bytearray and give it to the constructor. AssetResource resource = new AssetResource(false); resource.Serialize(referenceID, MetaDataType.UNKOWN, null, bytes); serializedAssets.AddResource(referenceID, PCFResourceType.MATERIALPOINTER, resource); //Make sure caller can get the actual material referenceID when serializing its metadata. this.pointedID = materialID; } else { ComponentNode componentNode = new ComponentNode(PCFResourceType.MATERIAL, referenceID, path); //Material nodes can and are most likely to be children of other component nodes. objNode.AddChildNode(componentNode); SerializedMaterial serializedMaterial = new SerializedMaterial(); serializedMaterial.DisplayName = this.material.name; serializedMaterial.ShaderName = this.material.shader.name; Dictionary <string, SerializedMaterialProperty> materialProperties = new Dictionary <string, SerializedMaterialProperty>(); // Iterate through children and get the textures of the material. Shader shader = this.material.shader; int count = ShaderUtil.GetPropertyCount(shader); for (int i = 0; i < count; i++) { ShaderUtil.ShaderPropertyType propertyType = ShaderUtil.GetPropertyType(shader, i); string propertyName = ShaderUtil.GetPropertyName(shader, i); SerializedMaterialProperty property = null; //Color property. if (propertyType == ShaderUtil.ShaderPropertyType.Float || propertyType == ShaderUtil.ShaderPropertyType.Range) { SerializedMaterialFloatProperty prop = new SerializedMaterialFloatProperty(); prop.Val = this.material.GetFloat(propertyName); prop.PropertyType = (int)MaterialPropertyType.FloatType; property = prop; } //Vector property. if (propertyType == ShaderUtil.ShaderPropertyType.Vector) { SerializedMaterialVectorProperty prop = new SerializedMaterialVectorProperty(); Vector4 vector = this.material.GetVector(propertyName); prop.X = vector.x; prop.Y = vector.y; prop.Z = vector.z; prop.W = vector.w; prop.PropertyType = (int)MaterialPropertyType.VectorType; property = prop; } //Float property. if (propertyType == ShaderUtil.ShaderPropertyType.Color) { SerializedMaterialColorProperty prop = new SerializedMaterialColorProperty(); Color color = this.material.GetColor(propertyName); prop.R = color.r; prop.G = color.g; prop.B = color.b; prop.A = color.a; prop.PropertyType = (int)MaterialPropertyType.ColorType; property = prop; } //Texture property. if (propertyType == ShaderUtil.ShaderPropertyType.TexEnv) { Texture2D texture = (Texture2D)this.material.GetTexture(propertyName); if (texture != null) { UnitySerializeTexture textureSerializer = new UnitySerializeTexture(texture, this.rootNode); textureSerializer.Serialize(serializedAssets, serializeOptions, componentNode, postSerializeActions); SerializedMaterialTextureProperty prop = new SerializedMaterialTextureProperty(); prop.ReferenceID = textureSerializer.GetReferenceID(); prop.PropertyType = (int)MaterialPropertyType.TextureType; property = prop; } } materialProperties.Add(propertyName, property); } serializedMaterial.MaterialProperties = materialProperties; //Create serialized asset by converting data to a bytearray and give it to the constructor. AssetResource resource = new AssetResource(false); byte[] metaDataBuffer = ProtocolBufferSerializer.SerializedMaterial(serializedMaterial); resource.Serialize(this.referenceID, MetaDataType.PROTOBUF, metaDataBuffer, null); serializedAssets.AddResource(referenceID, PCFResourceType.MATERIAL, resource); //Nodes store their resource when serializing componentNode.SetSerializer(this); //Make sure caller can get the actual material referenceID when serializing its metadata. this.pointedID = this.referenceID; } #endif }
public override void Serialize(SerializedAssets serializedAssets, object[] serializeOptions, NodeBase objNode, List <Action <NodeBase> > postSerializeActions) { //Make sure this is always 36 characters long. this.referenceID = this.rootNode.GenerateID(); #if UNITY_EDITOR string assetPath = AssetDatabase.GetAssetPath(animationClip); NodeBase animationNode = CheckSharedAnimationClip(this.rootNode, assetPath); if (animationNode != null) { UInt32 animationID = animationNode.GetReferenceID(); ComponentNode componentNode = new ComponentNode(PCFResourceType.ANIMATIONCLIPREFERENCE, referenceID, null, typeof(UnityEngine.AnimationClip).Name.ToString()); objNode.AddChildNode(componentNode); byte[] bytes = BitConverter.GetBytes(animationID); JObject metaData = new JObject(); metaData["fieldName"] = this.fieldName; AssetResource resource = new AssetResource(false); byte[] metaDataBuffer = System.Text.Encoding.UTF8.GetBytes(metaData.ToString(Formatting.None)); resource.Serialize(referenceID, MetaDataType.JSON, metaDataBuffer, bytes); serializedAssets.AddResource(referenceID, PCFResourceType.ANIMATIONCLIPREFERENCE, resource); this.pointedID = animationID; } else { ComponentNode componentNode = new ComponentNode(PCFResourceType.ANIMATIONCLIP, referenceID, assetPath, typeof(UnityEngine.AnimationClip).Name.ToString()); objNode.AddChildNode(componentNode); EditorCurveBinding[] curveBindings = AnimationUtility.GetCurveBindings(animationClip); AnimationCurve initialCurve = AnimationUtility.GetEditorCurve(animationClip, curveBindings[0]); SerializedAnimationClip serializedAnimationClip = new SerializedAnimationClip(); serializedAnimationClip.PostWrapMode = (int)initialCurve.postWrapMode; serializedAnimationClip.PreWrapMode = (int)initialCurve.preWrapMode; for (int i = 0; i < curveBindings.Length; i++) { string propertyName = curveBindings[i].propertyName; AnimationCurve animCurve = AnimationUtility.GetEditorCurve(animationClip, curveBindings[i]); SerializedAnimationKeyFrame[] serializedKeyFrames = new SerializedAnimationKeyFrame[animCurve.keys.Length]; for (int j = 0; j < animCurve.keys.Length; j++) { serializedKeyFrames[j] = new SerializedAnimationKeyFrame(); serializedKeyFrames[j].InTagent = animCurve.keys[j].inTangent; serializedKeyFrames[j].OutTangent = animCurve.keys[j].outTangent; serializedKeyFrames[j].Time = animCurve.keys[j].time; serializedKeyFrames[j].Value = animCurve.keys[j].value; } serializedAnimationClip.AddChannel(AnimationClipUtils.GetAnimationClipChannelName(propertyName), serializedKeyFrames); } JObject metaData = new JObject(); metaData["name"] = animationClip.name; metaData["frameRate"] = animationClip.frameRate; metaData["wrapMode"] = (int)animationClip.wrapMode; metaData["legacy"] = animationClip.legacy; metaData["fieldName"] = this.fieldName; byte[] data = ProtocolBufferSerializer.SerializeAnimationClipData(serializedAnimationClip); AssetResource resource = new AssetResource(false); byte[] metaDataBuffer = System.Text.Encoding.UTF8.GetBytes(metaData.ToString(Formatting.None)); resource.Serialize(referenceID, MetaDataType.JSON, metaDataBuffer, data); serializedAssets.AddResource(referenceID, PCFResourceType.ANIMATIONCLIP, resource); //Nodes store their resource when serializing componentNode.SetSerializer(this); //Make sure caller can get the actual material referenceID when serializing its metadata. this.pointedID = this.referenceID; } #endif }