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; }
/** * 保存纹理图片相关信息 */ 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); }
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; }
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); }