public void DeserializeBeforeRef(UABUnpacker unpacker, UABField field, ref object value, List <ISerializer> serializers)
        {
            var data = new Data();

            unpacker.Deserialize(data, field.fields, serializers);
            var ps = value as ParticleSystem;

                        #if UNITY_5_5_OR_NEWER
            ps.useAutoRandomSeed = data.useAutoRandomSeed;
            if (ps.useAutoRandomSeed == false)
            {
                ps.randomSeed = data.randomSeed;
            }
                        #endif

                        #if UNITY_5_5_OR_NEWER
            UABUtils.CopyToParticleSystemModule(data.main, ps.main);
            {
                UABUtils.CopyToParticleSystemModule(data.emission.data, ps.emission);
                var bursts = new UnityEngine.ParticleSystem.Burst[data.emission.bursts.Length];
                for (int i = 0; i < data.emission.bursts.Length; ++i)
                {
                    bursts[i] = UABUtils.CopyToParticleSystemModule(data.emission.bursts[i], bursts[i]);
                }
                ps.emission.SetBursts(bursts, data.emission.bursts.Length);
            }
                        #endif
            UABUtils.CopyToParticleSystemModule(data.shape, ps.shape);
            UABUtils.CopyToParticleSystemModule(data.velocityOverLifetime, ps.velocityOverLifetime);
            UABUtils.CopyToParticleSystemModule(data.limitVelocityOverLifetime, ps.limitVelocityOverLifetime);
            UABUtils.CopyToParticleSystemModule(data.inheritVelocity, ps.inheritVelocity);
            UABUtils.CopyToParticleSystemModule(data.forceOverLifetime, ps.forceOverLifetime);
            UABUtils.CopyToParticleSystemModule(data.colorOverLifetime, ps.colorOverLifetime);
            UABUtils.CopyToParticleSystemModule(data.sizeOverLifetime, ps.sizeOverLifetime);
            UABUtils.CopyToParticleSystemModule(data.sizeBySpeed, ps.sizeBySpeed);
            UABUtils.CopyToParticleSystemModule(data.rotationOverLifetime, ps.rotationOverLifetime);
            UABUtils.CopyToParticleSystemModule(data.rotationBySpeed, ps.rotationBySpeed);
            UABUtils.CopyToParticleSystemModule(data.externalForces, ps.externalForces);
            UABUtils.CopyToParticleSystemModule(data.rotationBySpeed, ps.rotationBySpeed);
                        #if UNITY_5_5_OR_NEWER
            UABUtils.CopyToParticleSystemModule(data.noise, ps.noise);
                        #endif
            UABUtils.CopyToParticleSystemModule(data.collision, ps.collision);
                        #if UNITY_5_5_OR_NEWER
            UABUtils.CopyToParticleSystemModule(data.trigger, ps.trigger);
            {
                UABUtils.CopyToParticleSystemModule(data.subEmitters.data, ps.subEmitters);
                for (int i = 0; i < data.subEmitters.subEmitters.Length; ++i)
                {
                    ps.subEmitters.AddSubEmitter(data.subEmitters.subEmitters[i], data.subEmitters.types[i], data.subEmitters.properties[i]);
                }
            }
            //UABUtils.CopyToParticleSystemModule(data.textureSheetAnimation, ps.textureSheetAnimation);
            UABUtils.CopyToParticleSystemModule(data.lights, ps.lights);
            UABUtils.CopyToParticleSystemModule(data.trails, ps.trails);
                        #endif
        }
        public void Serialize(UABPacker packer, UABField field, ref object value, List <ISerializer> serializers)
        {
            field.serializatorId = this.GetId();
            var ps   = value as ParticleSystem;
            var data = new Data();

                        #if UNITY_5_5_OR_NEWER
            data.useAutoRandomSeed = ps.useAutoRandomSeed;
            if (data.useAutoRandomSeed == false)
            {
                data.randomSeed = ps.randomSeed;
            }
            else
            {
                data.randomSeed = 0;
            }
                        #endif

                        #if UNITY_5_5_OR_NEWER
            data.main = UABUtils.CopyFromParticleSystemModule(ps.main, data.main);
            {
                data.emission.data = UABUtils.CopyFromParticleSystemModule(ps.emission, data.emission.data);
                var bursts = new UnityEngine.ParticleSystem.Burst[ps.emission.burstCount];
                ps.emission.GetBursts(bursts);
                data.emission.bursts = new Data.EmissionModule.Burst[bursts.Length];
                for (int i = 0; i < bursts.Length; ++i)
                {
                    data.emission.bursts[i] = new Data.EmissionModule.Burst();
                    UABUtils.CopyFromParticleSystemModule(bursts[i], data.emission.bursts[i]);
                }
            }
                        #endif
            data.shape = UABUtils.CopyFromParticleSystemModule(ps.shape, data.shape);
            data.velocityOverLifetime      = UABUtils.CopyFromParticleSystemModule(ps.velocityOverLifetime, data.velocityOverLifetime);
            data.limitVelocityOverLifetime = UABUtils.CopyFromParticleSystemModule(ps.limitVelocityOverLifetime, data.limitVelocityOverLifetime);
            data.inheritVelocity           = UABUtils.CopyFromParticleSystemModule(ps.inheritVelocity, data.inheritVelocity);
            data.forceOverLifetime         = UABUtils.CopyFromParticleSystemModule(ps.forceOverLifetime, data.forceOverLifetime);
            data.colorOverLifetime         = UABUtils.CopyFromParticleSystemModule(ps.colorOverLifetime, data.colorOverLifetime);
            data.colorOverLifetime         = UABUtils.CopyFromParticleSystemModule(ps.colorOverLifetime, data.colorOverLifetime);
            data.sizeOverLifetime          = UABUtils.CopyFromParticleSystemModule(ps.sizeOverLifetime, data.sizeOverLifetime);
            data.sizeBySpeed          = UABUtils.CopyFromParticleSystemModule(ps.sizeBySpeed, data.sizeBySpeed);
            data.rotationOverLifetime = UABUtils.CopyFromParticleSystemModule(ps.rotationOverLifetime, data.rotationOverLifetime);
            data.rotationBySpeed      = UABUtils.CopyFromParticleSystemModule(ps.rotationBySpeed, data.rotationBySpeed);
            data.externalForces       = UABUtils.CopyFromParticleSystemModule(ps.externalForces, data.externalForces);
            data.rotationBySpeed      = UABUtils.CopyFromParticleSystemModule(ps.rotationBySpeed, data.rotationBySpeed);
                        #if UNITY_5_5_OR_NEWER
            data.noise = UABUtils.CopyFromParticleSystemModule(ps.noise, data.noise);
                        #endif
            data.collision = UABUtils.CopyFromParticleSystemModule(ps.collision, data.collision);
                        #if UNITY_5_5_OR_NEWER
            data.trigger = UABUtils.CopyFromParticleSystemModule(ps.trigger, data.trigger);
            {
                data.subEmitters.data        = UABUtils.CopyFromParticleSystemModule(ps.subEmitters, data.subEmitters.data);
                data.subEmitters.subEmitters = new ParticleSystem[ps.subEmitters.subEmittersCount];
                data.subEmitters.properties  = new ParticleSystemSubEmitterProperties[ps.subEmitters.subEmittersCount];
                data.subEmitters.types       = new ParticleSystemSubEmitterType[ps.subEmitters.subEmittersCount];
                for (int i = 0; i < ps.subEmitters.subEmittersCount; ++i)
                {
                    data.subEmitters.subEmitters[i] = ps.subEmitters.GetSubEmitterSystem(i);
                    data.subEmitters.properties[i]  = ps.subEmitters.GetSubEmitterProperties(i);
                    data.subEmitters.types[i]       = ps.subEmitters.GetSubEmitterType(i);
                }
            }
                        #endif
            data.textureSheetAnimation = UABUtils.CopyFromParticleSystemModule(ps.textureSheetAnimation, data.textureSheetAnimation);
                        #if UNITY_5_5_OR_NEWER
            data.lights = UABUtils.CopyFromParticleSystemModule(ps.lights, data.lights);
            data.trails = UABUtils.CopyFromParticleSystemModule(ps.trails, data.trails);
                        #endif

            field.fields = packer.Serialize(data, serializers);
        }