public string ShaderJsonPos(SenceHierarchyInfo s, string shaderName) { switch (shaderName) { //shadersVector4Pos 保存有所有shader字符窜的位置; // case "Standard": // case "@Moblie_WJM_Mirror": case "@Moblie_WJM_Alpha": return(Vector4ToString(s.shadersVector4Pos[0], 0)); case "@Moblie_WJM_Base": return(Vector4ToString(s.shadersVector4Pos[1], 1)); case "@Moblie_WJM_CubeMap": return(Vector4ToString(s.shadersVector4Pos[2], 2)); case "@Moblie_WJM_Glass_Middle": return(Vector4ToString(s.shadersVector4Pos[3], 3)); case "@Moblie_WJM_Mirror": return(Vector4ToString(s.shadersVector4Pos[4], 4)); case "@Moblie_WJM_Sky": return(Vector4ToString(s.shadersVector4Pos[5], 5)); case "@Moblie_WJM_SpriteTree": return(Vector4ToString(s.shadersVector4Pos[6], 6)); case "@Moblie_WJM_TreeLeaf": return(Vector4ToString(s.shadersVector4Pos[7], 7)); case "@Moblie_WJM_Water": return(Vector4ToString(s.shadersVector4Pos[8], 8)); case "@Moblie_WJM_WFaceCamera": return(Vector4ToString(s.shadersVector4Pos[9], 9)); default: Debug.LogError(shaderName + "材质不支持"); return("[]"); } }
void CreateSenceInteractiveJsonFile(SenceHierarchyInfo senceH) { if (senceH.senceInteractiveInfo != null) { senceH.senceInteractiveInfo.RecordInfo(); string senceInteractiveJson = senceH.senceInteractiveInfo.senceInteractiveInfoJson; if (useCompress) { System.IO.File.WriteAllBytes(hierarchyFolderFinal + "/senceInteractive.json", CLZF2.Compress(System.Text.Encoding.Default.GetBytes(senceInteractiveJson))); } else { System.IO.File.WriteAllText(hierarchyFolderFinal + "/senceInteractive.json", senceInteractiveJson); } } else { string log = senceH.gameObject.name + "中的senceInteractiveInfo未设置,请检查是否已设置!"; Debug.Log(log); Debug.LogWarning(log); Debug.LogError(log); } }
void CreateBuuferGeometryBinFile(SenceHierarchyInfo threeJsSenceHierarchy) { List <byte> binFileBuffer = new List <byte>(); // GenOneGameObjectBinBuffer(threeJsSenceHierarchy.allGameObject3DMesh[1], binFileBuffer.Count); for (int i = 0; i < threeJsSenceHierarchy.allGameObject3DMesh.Count; i++) { // WaitForSeconds(0.2f); binFileBuffer.AddRange ( GenOneGameObjectBinBuffer(threeJsSenceHierarchy.allGameObject3DMesh[i], binFileBuffer.Count) ); } Debug.Log("BinFileBuffer Length: " + binFileBuffer.Count); string savePath = geometryFolderFinal + "/" + "123.json"; threeJsSenceHierarchy.lastAllGameObject3DMesh = threeJsSenceHierarchy.allGameObject3DMesh; if (useCompress) { System.IO.File.WriteAllBytes(savePath, CLZF2.Compress(binFileBuffer.ToArray())); // byte[] tempByte = binFileBuffer.ToArray(); // System.IO.File.WriteAllBytes(savePath, LZ4.LZ4Codec.EncodeHC(tempByte, 0, tempByte.Length)); } else { System.IO.File.WriteAllBytes(savePath, binFileBuffer.ToArray()); } string[] shadersGroup = new string[] { "@Moblie_WJM_Alpha", "@Moblie_WJM_Base", "@Moblie_WJM_CubeMap", "@Moblie_WJM_Glass_Middle", "@Moblie_WJM_Mirror", "@Moblie_WJM_Sky", "@Moblie_WJM_SpriteTree", "@Moblie_WJM_TreeLeaf", "@Moblie_WJM_Water", "@Moblie_WJM_WFaceCamera" }; List <Vector4> shadersVec4Pos = new List <Vector4>(); int allCount = 0; int start = 0; int count = 0; int start2 = 0; int count2 = 0; string shaderTxtRootPath = Application.dataPath + "/WJMFramework/AppAndThreeJSExport2017/Editor/"; List <byte> shaderBytes = new List <byte>(); for (int i = 0; i < shadersGroup.Length; i++) { byte[] vertexShaderStr = System.IO.File.ReadAllBytes(shaderTxtRootPath + "vertex" + shadersGroup[i] + ".txt"); shaderBytes.AddRange(vertexShaderStr); start = allCount; count = vertexShaderStr.Length; allCount += count; byte[] fragmentShaderStr = System.IO.File.ReadAllBytes(shaderTxtRootPath + "fragment" + shadersGroup[i] + ".txt"); shaderBytes.AddRange(fragmentShaderStr); start2 = allCount; count2 = fragmentShaderStr.Length; allCount += count2; shadersVec4Pos.Add(new Vector4(start, count, start2, count2)); // Debug.Log(new Vector4(start, count, start2, count2)); } shaderBytes.Add(new byte()); shaderBytes.Add(new byte()); threeJsSenceHierarchy.shadersVector4Pos = shadersVec4Pos.ToArray(); // Debug.Log(shaderBytes.Count); string savePath2 = geometryFolderFinal + "/" + "456.json"; if (useCompress) { System.IO.File.WriteAllBytes(savePath2, CLZF2.Compress(shaderBytes.ToArray())); } else { System.IO.File.WriteAllBytes(savePath2, shaderBytes.ToArray()); } }
void CreateSenceHierarchyJsonFile(SenceHierarchyInfo senceH) { string senceHierarchy = "{\"v\":\"2017_0_0\",\"compress\":\"LZF\","; senceHierarchy += "\"SceneBuildTime\":\"" + DateTime.Now.ToString("d") + "\","; senceHierarchy += "\"envCubeMap\":\"" + senceH.envCubeMap.name + "\","; senceHierarchy += "\"SenceHierarchy\":["; for (int i = 0; i < senceH.allTempObject3DInfo.Count; i++) { senceHierarchy += "{" + senceH.allTempObject3DInfo[i].nameJson + ","; senceHierarchy += senceH.allTempObject3DInfo[i].idJson + ","; senceHierarchy += senceH.allTempObject3DInfo[i].layerJson + ","; senceHierarchy += senceH.allTempObject3DInfo[i].positionJson + ","; senceHierarchy += senceH.allTempObject3DInfo[i].rotationJson + ","; senceHierarchy += senceH.allTempObject3DInfo[i].scaleJson + ","; if (senceH.allTempObject3DInfo[i].mesh != null) { senceHierarchy += senceH.allTempObject3DInfo[i].lightmapOffsetJson + ","; senceHierarchy += senceH.allTempObject3DInfo[i].meshJson + ","; senceHierarchy += senceH.allTempObject3DInfo[i].renderOrderJson + ","; senceHierarchy += senceH.allTempObject3DInfo[i].instanceChildPosition + ","; senceHierarchy += senceH.allTempObject3DInfo[i].materialsJson + ","; senceHierarchy += senceH.allTempObject3DInfo[i].parentJson + "}"; } else { senceHierarchy += senceH.allTempObject3DInfo[i].parentJson + "}"; } if (i != (senceH.allTempObject3DInfo.Count - 1)) { senceHierarchy += ","; } } senceHierarchy += "]"; senceHierarchy += ",\"allMeshbeTo\":["; for (int i = 0; i < senceH.allGameObject3DMesh.Count; i++) { senceHierarchy += "{" + senceH.allGameObject3DMesh[i].json; senceHierarchy += ",\"type\": \"BufferGeometry\",\"data\": {"; if (senceH.allGameObject3DMesh[i].mesh.subMeshCount > 0) { int meshCount = senceH.allGameObject3DMesh[i].mesh.subMeshCount; senceHierarchy += "\"groups\": ["; int lastCount = 0; string indexGroupJson = ""; for (int j = 0; j < meshCount; j++) { indexGroupJson += "{\"start\":" + lastCount; indexGroupJson += ",\"count\":" + senceH.allGameObject3DMesh[i].mesh.GetTriangles(j).Length; lastCount += senceH.allGameObject3DMesh[i].mesh.GetTriangles(j).Length; indexGroupJson += ",\"materialIndex\":" + j; if (j == meshCount - 1) { indexGroupJson += "}]"; } else { indexGroupJson += "},"; } } senceHierarchy += indexGroupJson; } senceHierarchy += ",\"index\": {\"itemSize\": 1,\"type\": \"Uint16Array\","; senceHierarchy += "\"array\":[" + senceH.allGameObject3DMesh[i].indexBufferPos[0] + "," + senceH.allGameObject3DMesh[i].indexBufferPos[1] + "]}"; senceHierarchy += ",\"attributes\": {"; senceHierarchy += "\"position\": {\"itemSize\": 3,\"type\": \"Float32Array\","; senceHierarchy += "\"array\":[" + senceH.allGameObject3DMesh[i].vertexBufferPos[0] + "," + senceH.allGameObject3DMesh[i].vertexBufferPos[1] + "]}"; /* * if (senceH.allGameObject3DMesh[i].allChild!=null) * { * senceHierarchy += ",\"instancePosGroup\": {\"itemSize\": 3,\"type\": \"Float32Array\","; * senceHierarchy += "\"array\":[" + senceH.allGameObject3DMesh[i].instancePosGroupPos[0] + "," + senceH.allGameObject3DMesh[i].instancePosGroupPos[1] + "]}"; * } */ if (senceH.allGameObject3DMesh[i].useRealtimeLight) { senceHierarchy += ",\"normal\": {\"itemSize\": 3,\"type\": \"Float32Array\","; senceHierarchy += "\"array\": [" + senceH.allGameObject3DMesh[i].normalBufferPos[0] + "," + senceH.allGameObject3DMesh[i].normalBufferPos[1] + "]}"; } if (senceH.allGameObject3DMesh[i].exportUV) { senceHierarchy += ",\"uv\": {\"itemSize\": 2,\"type\": \"Float32Array\","; senceHierarchy += "\"array\": [" + senceH.allGameObject3DMesh[i].uvBufferPos[0] + "," + senceH.allGameObject3DMesh[i].uvBufferPos[1] + "]}"; } if (senceH.allGameObject3DMesh[i].exportUV2) { senceHierarchy += ",\"uv2\": {\"itemSize\": 2,\"type\": \"Float32Array\","; senceHierarchy += "\"array\": [" + senceH.allGameObject3DMesh[i].uv2BufferPos[0] + "," + senceH.allGameObject3DMesh[i].uv2BufferPos[1] + "]}"; } if (senceH.allGameObject3DMesh[i].worldPosAndScalePos[1] > 0) { senceHierarchy += ",\"worldPosAndScale\": {\"itemSize\": 4,\"type\": \"Float32Array\","; senceHierarchy += "\"array\": [" + senceH.allGameObject3DMesh[i].worldPosAndScalePos[0] + "," + senceH.allGameObject3DMesh[i].worldPosAndScalePos[1] + "]}"; } if (senceH.allGameObject3DMesh[i].hasWaterMat) { senceHierarchy += ",\"tangent\": {\"itemSize\": 3,\"type\": \"Float32Array\","; senceHierarchy += "\"array\": [" + senceH.allGameObject3DMesh[i].tangentsPos[0] + "," + senceH.allGameObject3DMesh[i].tangentsPos[1] + "]}"; } senceHierarchy += "}}"; if (i != senceH.allGameObject3DMesh.Count - 1) { senceHierarchy += "},"; } else { senceHierarchy += "}"; } } senceHierarchy += "]"; if (senceH.sun != null) { senceHierarchy += ",\"sun\":[" + senceH.sun.transform.forward.x + "," + senceH.sun.transform.forward.y + "," + (-senceH.sun.transform.forward.z) + "]"; senceHierarchy += ",\"sunIntensity\":[" + senceH.sun.color.r * senceH.sun.intensity + "," + senceH.sun.color.g * senceH.sun.intensity + "," + senceH.sun.color.b * senceH.sun.intensity + "]"; } senceHierarchy += ",\"fogNearAndFar\":[" + senceH.fogNearAndFar.x + "," + senceH.fogNearAndFar.y + "]"; senceHierarchy += ",\"fogColor\":[" + senceH.fogColor.r + "," + senceH.fogColor.g + "," + senceH.fogColor.b + "]"; senceHierarchy += ",\"allCustomTexture\":["; for (int i = 0; i < senceH.allCustomTexture.Count; i++) { string expandName = AssetDatabase.GetAssetPath(senceH.allCustomTexture[i]).Split('.')[1]; // 替换扩展名 expandName = "jpg"; Texture2D te = (Texture2D)senceH.allCustomTexture[i]; if (te.format == TextureFormat.RGBA32 || te.format == TextureFormat.DXT5 || te.format == TextureFormat.BC6H || te.format == TextureFormat.ETC2_RGBA8 || te.format == TextureFormat.PVRTC_RGBA2 || te.format == TextureFormat.PVRTC_RGBA4) { expandName = "png"; } // Debug.Log(te.format); senceHierarchy += "{\"name\":\"" + senceH.allCustomTexture[i].name + "\",\"type\":\"" + expandName + "\""; // +senceH.diffuseMapBelongGameObjects[i].json; for (int j = 0; j < senceH.allGameObject3DTexture.Count; j++) { if (senceH.allGameObject3DTexture[j].tex == senceH.allCustomTexture[i]) { senceHierarchy += "," + senceH.allGameObject3DTexture[j].json; } } if (i != senceH.allCustomTexture.Count - 1) { senceHierarchy += "},"; } else { senceHierarchy += "}"; } } senceHierarchy += "]"; //不需要知道allLightmap被谁用了,因为每个物体都有个Lightmap Index senceHierarchy += ",\"allLightmapTexture\":["; for (int i = 0; i < senceH.allLightmapTexture.Count; i++) { string expandName = AssetDatabase.GetAssetPath(senceH.allLightmapTexture[i]).Split('.')[1]; expandName = "jpg"; Texture2D te = (Texture2D)senceH.allLightmapTexture[i]; if (te.format == TextureFormat.RGBA32 || te.format == TextureFormat.DXT5 || te.format == TextureFormat.BC6H || te.format == TextureFormat.ETC2_RGBA8) { expandName = "png"; } senceHierarchy += "{\"name\":\"" + senceH.allLightmapTexture[i].name + "\",\"type\":\"" + expandName + "\""; if (i != senceH.allLightmapTexture.Count - 1) { senceHierarchy += "},"; } else { senceHierarchy += "}"; } } senceHierarchy += "]"; //cubemapGroup senceHierarchy += ",\"allCubeMapTexture\":["; for (int i = 0; i < senceH.allCubeMapTexture.Count; i++) { string expandName = AssetDatabase.GetAssetPath(senceH.allCubeMapTexture[i]).Split('.')[1]; // 替换扩展名 expandName = "jpg"; Cubemap te = (Cubemap)senceH.allCubeMapTexture[i]; if (te.format == TextureFormat.RGBA32 || te.format == TextureFormat.DXT5 || te.format == TextureFormat.BC6H || te.format == TextureFormat.ETC2_RGBA8) { expandName = "png"; } senceHierarchy += "{\"name\":\"" + senceH.allCubeMapTexture[i].name + "\",\"type\":\"" + expandName + "\""; // +senceH.diffuseMapBelongGameObjects[i].json; for (int j = 0; j < senceH.allGameObject3DCubeTexture.Count; j++) { if (senceH.allGameObject3DCubeTexture[j].tex == senceH.allCubeMapTexture[i]) { senceHierarchy += "," + senceH.allGameObject3DCubeTexture[j].json; } else { //senceHierarchy += ",\"beTo\":[]"; } } if (i != senceH.allCubeMapTexture.Count - 1) { senceHierarchy += "},"; } else { senceHierarchy += "}"; } } senceHierarchy += "]"; senceHierarchy += ",\"materials\":["; Material[] mats = senceH.allMaterials.ToArray(); for (int i = 0; i < mats.Length; i++) { senceHierarchy += "{\"name\":\"" + mats[i].name + "\","; senceHierarchy += "\"shader\":" + ShaderJsonPos(senceH, mats[i].shader.name) + ","; // senceHierarchy += "\"_SpecColor2\":\"" + ColorToString(mats[i].GetColor("_SpecColor2")) + "\","; // senceHierarchy += "\"_Shininess\":\"" + mats[i].GetFloat("_Shininess").ToString() + "\","; senceHierarchy += "\"_Color\":\"" + ColorToString(mats[i].GetColor("_Color")) + "\","; if (mats[i].HasProperty("_MainTex") && mats[i].GetTexture("_MainTex") != null) { string textureName = mats[i].GetTexture("_MainTex").name; if (mats[i].shader.name == "@WJM_Glass_Middle") { } senceHierarchy += "\"_MainTex\":\"" + mats[i].GetTexture("_MainTex").name + "\","; } else { senceHierarchy += "\"_MainTex\":\"null\","; } if (mats[i].HasProperty("_Smooth")) { senceHierarchy += "\"_Smooth\":\"" + mats[i].GetFloat("_Smooth") + "\","; } if (mats[i].HasProperty("_Reflect")) { senceHierarchy += "\"_Reflect\":\"" + mats[i].GetFloat("_Reflect") + "\","; } if (mats[i].HasProperty("_FresnelPower")) { senceHierarchy += "\"_FresnelPower\":\"" + mats[i].GetFloat("_FresnelPower") + "\","; } if (mats[i].HasProperty("_FresnelBias")) { senceHierarchy += "\"_FresnelBias\":\"" + mats[i].GetFloat("_FresnelBias") + "\","; } if (mats[i].HasProperty("_alphaSin")) { senceHierarchy += "\"_alphaSin\":\"" + mats[i].GetFloat("_alphaSin") + "\","; } if (mats[i].HasProperty("_Width")) { senceHierarchy += "\"_Width\":\"" + mats[i].GetFloat("_Width") + "\","; } if (mats[i].HasProperty("_Height")) { senceHierarchy += "\"_Height\":\"" + mats[i].GetFloat("_Height") + "\","; } if (mats[i].HasProperty("_sizeBlend")) { senceHierarchy += "\"_sizeBlend\":\"" + mats[i].GetFloat("_sizeBlend") + "\","; } if (mats[i].HasProperty("_scale")) { senceHierarchy += "\"_scale\":\"" + mats[i].GetFloat("_scale") + "\","; } if (mats[i].HasProperty("_PviotOffsetX")) { senceHierarchy += "\"_PviotOffsetX\":\"" + mats[i].GetFloat("_PviotOffsetX") + "\","; } if (mats[i].HasProperty("_PviotOffsetY")) { senceHierarchy += "\"_PviotOffsetY\":\"" + mats[i].GetFloat("_PviotOffsetY") + "\","; } if (mats[i].HasProperty("_WaveSpeed")) { Vector4 v = mats[i].GetVector("_WaveSpeed"); senceHierarchy += "\"_WaveSpeed\":\"" + ColorToString(new Color(v.x, v.y, v.z, v.w)) + "\","; } if (mats[i].HasProperty("_Cutoff")) { senceHierarchy += "\"_Cutoff\":\"" + mats[i].GetFloat("_Cutoff") + "\","; } if (mats[i].HasProperty("_lightmap_color")) { senceHierarchy += "\"_lightmap_color\":\"" + ColorToString(mats[i].GetColor("_lightmap_color")) + "\","; } else if (mats[i].HasProperty("_LightmapColor")) { senceHierarchy += "\"_lightmap_color\":\"" + ColorToString(mats[i].GetColor("_LightmapColor")) + "\","; } else { senceHierarchy += "\"_lightmap_color\":\"" + ColorToString(new Color(0.0f, 0.0f, 0.0f)) + "\","; } if (mats[i].HasProperty("_LightMap") && mats[i].GetTexture("_LightMap") != null) { senceHierarchy += "\"_LightMap\":\"" + mats[i].GetTexture("_LightMap").name + "\""; } else { senceHierarchy += "\"_LightMap\":\"null\""; } senceHierarchy += i == (mats.Length - 1) ? "}" : "},"; } senceHierarchy += "]}"; Debug.Log(hierarchyFolderFinal + "/senceHierarchy.json"); if (useCompress) { System.IO.File.WriteAllBytes(hierarchyFolderFinal + "/senceHierarchy.json", CLZF2.Compress(System.Text.Encoding.Default.GetBytes(senceHierarchy))); // byte[] tempByte=System.Text.Encoding.Default.GetBytes(senceHierarchy); // System.IO.File.WriteAllBytes(hierarchyFolderFinal + "/senceHierarchy.json", LZ4.LZ4Codec.EncodeHC(tempByte,0,tempByte.Length)); } else { System.IO.File.WriteAllText(hierarchyFolderFinal + "/senceHierarchy.json", senceHierarchy); } }
void CopyAllTexture(SenceHierarchyInfo sceneH) { BackUpAndScaleAndFormatAndSizeAndCopyTexture(sceneH.allCustomTexture, (int)customTextrueMaxSize); BackUpAndScaleAndFormatAndSizeAndCopyTexture(sceneH.allLightmapTexture, (int)lightmapTextrueMaxSize, true); BackUpAndScaleAndFormatAndSizeAndCopyCubeTexture(sceneH.allCubeMapTexture, 256); }
void OnGUI() { if (senceHierarchyInfo != null && sceneAsset != null) { EditorGUI.LabelField(new Rect(20, 10, 1000, 20), new GUIContent("Web 输出:" + savePath)); } if (lastSenceHierarchyInfo != senceHierarchyInfo) { lastSenceHierarchyInfo = senceHierarchyInfo; CheckOutPutPathNameAndCreateFolder(); } if (lastSceneAsset != sceneAsset) { lastSceneAsset = sceneAsset; CheckOutPutPathNameAndCreateFolder(); } senceHierarchyInfo = (SenceHierarchyInfo)EditorGUI.ObjectField(new Rect(20, 40, 300, 16), senceHierarchyInfo, typeof(SenceHierarchyInfo), true); sceneAsset = (SceneAsset)EditorGUI.ObjectField(new Rect(20, 60, 300, 16), sceneAsset, typeof(SceneAsset), true); /* * savePath = EditorGUI.TextField(new Rect(20, 60, 280, 18), new GUIContent(""), savePath); * if (GUI.Button(new Rect(320, 59, 150, 20), new GUIContent("Set Path (设置路径)"))) * { * string temp = EditorUtility.OpenFolderPanel("Select ThreeJS folder", Application.dataPath, "threejsdata"); * if (temp != "") * { * savePath = temp; * Debug.Log(savePath); * } * } */ customTextrueMaxSize = (TextrueSize)EditorGUI.EnumPopup(new Rect(170, 110, 300, 25), "贴图输出最大值", customTextrueMaxSize); lightmapTextrueMaxSize = (TextrueSize)EditorGUI.EnumPopup(new Rect(170, 150, 300, 25), "unity烘培贴图输出最大值", lightmapTextrueMaxSize); onlyHierarchyAndInteractiveinfo = EditorGUI.ToggleLeft(new Rect(170, 190, 300, 25), new GUIContent("只导出Hierarchy+Interactive.info"), onlyHierarchyAndInteractiveinfo); if (GUI.Button(new Rect(320, 250, 150, 20), new GUIContent("Export"))) { CheckOutPutPathNameAndCreateFolder(); if (senceHierarchyInfo != null) { //BuildAsset时忽略这个物体,这个物体只用在导出web资源,运行时不需要 senceHierarchyInfo.gameObject.hideFlags = HideFlags.DontSaveInBuild; useCompress = true; //收集场景中所有需要导出的资源 senceHierarchyInfo.PrepareThreeJsSceneData(); //创建输出的文件夹 // if (!onlyHierarchyAndInteractiveinfo) // CreateOutPutFold(); //创建bin流,包含shader流 if (!onlyHierarchyAndInteractiveinfo) { CreateBuuferGeometryBinFile(senceHierarchyInfo); } else { senceHierarchyInfo.allGameObject3DMesh = senceHierarchyInfo.lastAllGameObject3DMesh; } //创建场景信息 CreateSenceHierarchyJsonFile(senceHierarchyInfo); //创建交互信息 CreateSenceInteractiveJsonFile(senceHierarchyInfo); //复制出所有图片 if (!onlyHierarchyAndInteractiveinfo) { CopyAllTexture(senceHierarchyInfo); } //清除临时添加的ThreeJsObject3DInfo senceHierarchyInfo.DestroyTempData(); } else { string log = "请选中SenceHierarchyInfo物体,如果场景中没有,请在根目录添加一个"; GlobalDebug.Addline(log); Debug.Log(log); Debug.LogWarning(log); Debug.LogError(log); } } }