/**
         * 保存纹理图片相关信息
         */
        public string SaveTextureFormat(Texture2D tex, string texPath, string matPath, bool closemipmap = false, string ext = "png", bool normal = false)
        {
            string name = PathHelper.CheckFileName(tex.name + ".image.json");

            MyJson_Tree textureItem = new MyJson_Tree();
            var         fileName    = texPath.Substring(0, texPath.LastIndexOf(".") + 1) + ext;

            textureItem.SetString("name", PathHelper.CheckFileName(texPath));
            textureItem.SetEnum("filterMode", tex.filterMode, true);
            textureItem.SetEnum("wrap", tex.wrapMode, true);
            textureItem.SetBool("mipmap", !closemipmap && tex.mipmapCount > 1);

            if (tex.anisoLevel > 1)
            {
                textureItem.SetNumber("anisotropy", tex.anisoLevel);
            }

            if (tex.format == TextureFormat.Alpha8)
            {
                textureItem.SetString("format", "Gray");
            }
            else if (ext == "jpg" ||
                     tex.format == TextureFormat.RGB24 ||
                     tex.format == TextureFormat.PVRTC_RGB2 ||
                     tex.format == TextureFormat.PVRTC_RGB4 ||
                     tex.format == TextureFormat.RGB565 ||
                     tex.format == TextureFormat.ETC_RGB4 ||
                     tex.format == TextureFormat.ATC_RGB4 ||
                     tex.format == TextureFormat.ETC2_RGB ||
                     tex.format == TextureFormat.ASTC_RGB_4x4 ||
                     tex.format == TextureFormat.ASTC_RGB_5x5 ||
                     tex.format == TextureFormat.ASTC_RGB_6x6 ||
                     tex.format == TextureFormat.ASTC_RGB_8x8 ||
                     tex.format == TextureFormat.ASTC_RGB_10x10 ||
                     tex.format == TextureFormat.ASTC_RGB_12x12
                     )
            {
                textureItem.SetString("format", "RGB");
            }

            textureItem.SetInt("version", 2);

            //得到.imgdesc.json数据,并保存到bufs中
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            textureItem.CovertToStringWithFormat(sb, 4);
            byte[] bs = System.Text.Encoding.UTF8.GetBytes(sb.ToString());
            //相对路径
            var imgdescPath = texPath.Substring(0, texPath.LastIndexOf("/") + 1) + name;

            this.AddFileBuffer(imgdescPath, bs);

            return(imgdescPath);
        }
Пример #2
0
        protected void AddMinMaxGradient(MyJson_Tree compItem, string key, ParticleSystem.MinMaxGradient gradient)
        {
            MyJson_Tree gradientItem = new MyJson_Tree(false);

            gradientItem.SetEnum("mode", gradient.mode);

            switch (gradient.mode)
            {
            case ParticleSystemGradientMode.Color:
                gradientItem.SetColor("color", gradient.color);
                break;

            case ParticleSystemGradientMode.TwoColors:
                gradientItem.SetColor("colorMin", gradient.colorMin);
                gradientItem.SetColor("colorMax", gradient.colorMax);
                break;

            case ParticleSystemGradientMode.Gradient:
                this.AddGradient(gradientItem, "gradient", gradient.gradient);
                break;

            case ParticleSystemGradientMode.TwoGradients:
                this.AddGradient(gradientItem, "gradientMin", gradient.gradientMin);
                this.AddGradient(gradientItem, "gradientMax", gradient.gradientMax);
                break;
            }

            compItem[key] = gradientItem;
        }
Пример #3
0
        protected void AddMinMaxCurve(MyJson_Tree compItem, string key, ParticleSystem.MinMaxCurve curve, float scale = 1.0f)
        {
            MyJson_Tree curveItem = new MyJson_Tree(false);

            curveItem.SetEnum("mode", curve.mode);
            switch (curve.mode)
            {
            case ParticleSystemCurveMode.Constant:
                curveItem.SetNumber("constant", curve.constant);
                break;

            case ParticleSystemCurveMode.TwoConstants:
                curveItem.SetNumber("constantMin", curve.constantMin);
                curveItem.SetNumber("constantMax", curve.constantMax);
                break;

            case ParticleSystemCurveMode.Curve:
                this.AddCurve(curveItem, "curve", FillCurve(curve.curve, curve.curveMultiplier * scale));
                break;

            case ParticleSystemCurveMode.TwoCurves:
                this.AddCurve(curveItem, "curveMin", FillCurve(curve.curveMin, curve.curveMultiplier * scale));
                this.AddCurve(curveItem, "curveMax", FillCurve(curve.curveMax, curve.curveMultiplier * scale));
                break;
            }

            compItem[key] = curveItem;
        }
Пример #4
0
        protected void AddGradient(MyJson_Tree gradientItem, string key, Gradient gradient)
        {
            //alpha和color过渡值最大为4,如果不够手动填充,如果超过,中间的截掉
            GradientAlphaKey[] alphaKeys = this.FillGradientAlpha(gradient);
            GradientColorKey[] colorKeys = this.FillGradientColor(gradient);

            MyJson_Tree gradients = new MyJson_Tree(false);

            gradients.SetEnum("mode", gradient.mode);
            var alphaKeysItem = new MyJson_Array();
            var colorKeysItem = new MyJson_Array();

            gradients["alphaKeys"] = alphaKeysItem;
            gradients["colorKeys"] = colorKeysItem;

            //alphaKey
            foreach (GradientAlphaKey _ak in alphaKeys)
            {
                MyJson_Tree akItem = new MyJson_Tree(false);
                int         akHash = akItem.GetHashCode();
                akItem.SetNumber("alpha", _ak.alpha);
                akItem.SetNumber("time", _ak.time);
                alphaKeysItem.Add(akItem);
            }

            //colorKey
            foreach (GradientColorKey _ck in colorKeys)
            {
                MyJson_Tree ckItem = new MyJson_Tree(false);
                int         ckHash = ckItem.GetHashCode();
                ckItem.SetColor("color", _ck.color);
                ckItem.SetNumber("time", _ck.time);
                colorKeysItem.Add(ckItem);
            }

            gradientItem[key] = gradients;
        }
Пример #5
0
        public override bool WriteToJson(GameObject obj, Component component, MyJson_Object compJson)
        {
            ParticleSystem comp = component as ParticleSystem;

            if (!comp.emission.enabled || obj.GetComponent <ParticleSystemRenderer>() == null)
            {
                MyLog.LogWarning("无效的粒子组件:" + obj.name);
                return(false);
            }

            //main
            {
                var main     = comp.main;
                var mainItem = new MyJson_Tree(false);
                compJson["main"] = mainItem;
                mainItem.SetNumber("duration", main.duration);
                mainItem.SetBool("loop", main.loop);
                this.AddMinMaxCurve(mainItem, "startDelay", main.startDelay);
                this.AddMinMaxCurve(mainItem, "startLifetime", main.startLifetime);
                this.AddMinMaxCurve(mainItem, "startSpeed", main.startSpeed);

                mainItem.SetBool("startSize3D", main.startSize3D);
                if (main.startSize3D)
                {
                    this.AddMinMaxCurve(mainItem, "startSizeX", main.startSizeX);
                    this.AddMinMaxCurve(mainItem, "startSizeY", main.startSizeY);
                    this.AddMinMaxCurve(mainItem, "startSizeZ", main.startSizeZ);
                }
                else
                {
                    this.AddMinMaxCurve(mainItem, "startSizeX", main.startSize);
                    this.AddMinMaxCurve(mainItem, "startSizeY", main.startSize);
                    this.AddMinMaxCurve(mainItem, "startSizeZ", main.startSize);
                }

                mainItem.SetBool("_startRotation3D", main.startRotation3D);
                if (main.startRotation3D)
                {
                    this.AddMinMaxCurve(mainItem, "startRotationX", main.startRotationX);
                    this.AddMinMaxCurve(mainItem, "startRotationY", main.startRotationY);
                    this.AddMinMaxCurve(mainItem, "startRotationZ", main.startRotationZ);
                }
                else
                {
                    this.AddMinMaxCurve(mainItem, "startRotationX", main.startRotation);
                    this.AddMinMaxCurve(mainItem, "startRotationY", main.startRotation);
                    this.AddMinMaxCurve(mainItem, "startRotationZ", main.startRotation);
                }

                this.AddMinMaxGradient(mainItem, "startColor", main.startColor);
                this.AddMinMaxCurve(mainItem, "gravityModifier", main.gravityModifier);
                mainItem.SetEnum("_simulationSpace", main.simulationSpace);
                mainItem.SetEnum("scaleMode", main.scalingMode);
                mainItem.SetBool("playOnAwake", main.playOnAwake);
                if (ExportToolsSetting.instance.estimateMaxParticles)
                {
                    var value = this.EstimateMaxParticles(comp);
                    mainItem.SetInt("_maxParticles", value);
                    MyLog.Log(comp.gameObject.name + " 粒子估算:" + value);
                }
                else
                {
                    mainItem.SetInt("_maxParticles", main.maxParticles);
                }
            }

            //emission
            {
                var emissionItem = new MyJson_Tree(false);
                compJson["emission"] = emissionItem;
                this.AddMinMaxCurve(emissionItem, "rateOverTime", comp.emission.rateOverTime);
                emissionItem["bursts"] = new MyJson_Array();
                var bursts = new ParticleSystem.Burst[comp.emission.burstCount];
                comp.emission.GetBursts(bursts);
                foreach (var burst in bursts)
                {
                    MyJson_Array burstItem = new MyJson_Array();
                    burstItem.AddNumber(burst.time);
                    burstItem.AddInt(burst.minCount);
                    burstItem.AddInt(burst.maxCount);
                    burstItem.AddInt(burst.cycleCount);
                    burstItem.AddNumber(burst.repeatInterval);
                    (emissionItem["bursts"] as MyJson_Array).Add(burstItem);
                }
            }
            //shape
            if (comp.shape.enabled)
            {
                var shapItem = new MyJson_Tree(false);
                compJson["shape"] = shapItem;
                shapItem.SetEnum("shapeType", comp.shape.shapeType);
                shapItem.SetNumber("angle", comp.shape.angle);
                shapItem.SetNumber("length", comp.shape.length);
                shapItem.SetEnum("arcMode", comp.shape.arcMode);
                shapItem.SetNumber("arc", comp.shape.arc);
                shapItem.SetNumber("arcSpread", comp.shape.arcSpread);
                shapItem.SetEnum("radiusMode", comp.shape.radiusMode);
                shapItem.SetNumber("radius", comp.shape.radius);
                shapItem.SetNumber("radiusSpread", comp.shape.radiusSpread);
                shapItem.SetVector3("box", comp.shape.box);
                shapItem.SetBool("randomDirection", comp.shape.randomDirectionAmount > 0);
                shapItem.SetBool("spherizeDirection", comp.shape.sphericalDirectionAmount > 0);
                this.AddMinMaxCurve(shapItem, "arcSpeed", comp.shape.arcSpeed);
            }
            //velocityOverLifetiem
            if (comp.velocityOverLifetime.enabled)
            {
                var velocityOverItem = new MyJson_Tree(false);
                compJson["velocityOverLifetime"] = velocityOverItem;
                velocityOverItem.SetEnum("_mode", comp.velocityOverLifetime.x.mode);
                velocityOverItem.SetEnum("_space", comp.velocityOverLifetime.space);
                this.AddMinMaxCurve(velocityOverItem, "_x", comp.velocityOverLifetime.x);
                this.AddMinMaxCurve(velocityOverItem, "_y", comp.velocityOverLifetime.y);
                this.AddMinMaxCurve(velocityOverItem, "_z", comp.velocityOverLifetime.z);
            }
            //colorOverLifetime
            if (comp.colorOverLifetime.enabled)
            {
                var colorOverItem = new MyJson_Tree(false);
                compJson["colorOverLifetime"] = colorOverItem;
                this.AddMinMaxGradient(colorOverItem, "_color", comp.colorOverLifetime.color);
            }
            //sizeOverLifetime
            if (comp.sizeOverLifetime.enabled)
            {
                var sizeOverItem = new MyJson_Tree(false);
                compJson["sizeOverLifetime"] = sizeOverItem;
                sizeOverItem.SetBool("_separateAxes", comp.sizeOverLifetime.separateAxes);
                this.AddMinMaxCurve(sizeOverItem, "_size", comp.sizeOverLifetime.size);
                this.AddMinMaxCurve(sizeOverItem, "_x", comp.sizeOverLifetime.x);
                this.AddMinMaxCurve(sizeOverItem, "_y", comp.sizeOverLifetime.y);
                this.AddMinMaxCurve(sizeOverItem, "_z", comp.sizeOverLifetime.z);
            }
            //rotationOverLifetime
            if (comp.rotationOverLifetime.enabled)
            {
                var rotationOverItem = new MyJson_Tree(false);
                compJson["rotationOverLifetime"] = rotationOverItem;
                rotationOverItem.SetBool("_separateAxes", comp.rotationOverLifetime.separateAxes);
                this.AddMinMaxCurve(rotationOverItem, "_x", comp.rotationOverLifetime.x);
                this.AddMinMaxCurve(rotationOverItem, "_y", comp.rotationOverLifetime.y);
                this.AddMinMaxCurve(rotationOverItem, "_z", comp.rotationOverLifetime.z);
            }
            //textureSheetAnimationModule
            if (comp.textureSheetAnimation.enabled)
            {
                var textureSheetAnimation = new MyJson_Tree(false);
                compJson["textureSheetAnimation"] = textureSheetAnimation;
                textureSheetAnimation.SetInt("_numTilesX", comp.textureSheetAnimation.numTilesX);
                textureSheetAnimation.SetInt("_numTilesY", comp.textureSheetAnimation.numTilesY);
                textureSheetAnimation.SetEnum("_animation", comp.textureSheetAnimation.animation);
                textureSheetAnimation.SetBool("_useRandomRow", comp.textureSheetAnimation.useRandomRow);
                textureSheetAnimation.SetInt("_cycleCount", comp.textureSheetAnimation.cycleCount);
                textureSheetAnimation.SetInt("_rowIndex", comp.textureSheetAnimation.rowIndex);
                this.AddMinMaxCurve(textureSheetAnimation, "_frameOverTime", comp.textureSheetAnimation.frameOverTime, comp.textureSheetAnimation.numTilesX * comp.textureSheetAnimation.numTilesY);
                this.AddMinMaxCurve(textureSheetAnimation, "_startFrame", comp.textureSheetAnimation.startFrame);
            }

            return(true);
        }