//TODO fix the filename of the textures as constant private void BuildBaseData() { #region Step1: Create Script GameObject pathDataObj = new GameObject(); pathDataObj.name = "PathData"; pathDataObj.transform.position = Vector3.zero; APahtData pathData = pathDataObj.AddComponent <APahtData>(); #endregion #region Step2: Load HeightData and Obstacle 1 EditorUtility.DisplayProgressBar("创建中", "正在创建行走数据以及高度法线数据, 1/34", 1 / 34.0f); Texture2D hTx = (Texture2D)EditorCommonFunctions.GetReadWritable(m_pGroundHeightmap); Texture2D nTx = (Texture2D)EditorCommonFunctions.GetReadWritable(m_pGroundNormalmap); pathData.m_fGridHeightData = new float[SceneConstant.m_iSceneSize * SceneConstant.m_iSceneSize]; pathData.m_byGridStateData = new byte[SceneConstant.m_iSceneSize * SceneConstant.m_iSceneSize]; pathData.m_v3NormalData = new Vector3[SceneConstant.m_iSceneSize * SceneConstant.m_iSceneSize]; for (int i = 0; i < SceneConstant.m_iSceneSize; ++i) { for (int j = 0; j < SceneConstant.m_iSceneSize; ++j) { pathData.m_fGridHeightData[i * SceneConstant.m_iSceneSize + j] = 4.0f * SceneConstant.m_fHighgroundHeight * (hTx.GetPixel(i, j).r - 0.5f); pathData.m_byGridStateData[i * SceneConstant.m_iSceneSize + j] = hTx.GetPixel(i, j).g > hTx.GetPixel(i, j).b ? GridMath.m_byWalkable : GridMath.m_byNoWalkable; Color cNormal = nTx.GetPixel(i, j); pathData.m_v3NormalData[i * SceneConstant.m_iSceneSize + j] = new Vector3(cNormal.r, cNormal.g, cNormal.b); pathData.m_v3NormalData[i * SceneConstant.m_iSceneSize + j] = (pathData.m_v3NormalData[i * SceneConstant.m_iSceneSize + j] - new Vector3(0.5f, 0.5f, 0.5f)) * 2.0f; pathData.m_v3NormalData[i * SceneConstant.m_iSceneSize + j].Normalize(); } } #endregion #region Step3: Do Generate pathData.GenerateOptimaztion(); #endregion EditorUtility.ClearProgressBar(); }
public static Texture2D GetTexture2DWithColor(Texture2D pMain, Texture2D pColor, Texture2D pShadow, Color cMain, Color cSub, bool bIsInv) { Texture2D pMainR = (Texture2D)EditorCommonFunctions.GetReadWritable(pMain); Color32[] pxMainR = pMainR.GetPixels32(); Texture2D pColorR = (Texture2D)EditorCommonFunctions.GetReadWritable(pColor); Color32[] pxColorR = pColorR.GetPixels32(); Texture2D pShadowR = (Texture2D)EditorCommonFunctions.GetReadWritable(pShadow); Color32[] pxShadowR = pShadowR.GetPixels32(); int iWidth = Mathf.Max(pMainR.width, pColorR.width); int iHeight = Mathf.Max(pMainR.height, pColorR.height); Texture2D ret1 = new Texture2D(iWidth, iHeight, TextureFormat.RGB24, false); Color32[] res132_1 = new Color32[iWidth * iHeight]; for (int i = 0; i < iWidth; ++i) { for (int j = 0; j < iHeight; ++j) { Color cMainTex = pxMainR[(i * pMainR.width / iWidth) * pMainR.height + j * pMainR.height / iHeight]; Color cColorTex = pxColorR[(i * pColorR.width / iWidth) * pColorR.height + j * pColorR.height / iHeight]; Color cShadowTex = pxShadowR[(i * pShadowR.width / iWidth) * pShadowR.height + j * pShadowR.height / iHeight]; float shadowcol = Mathf.Clamp01((cShadowTex.r + 0.2f) * (1.0f + cColorTex.b * cColorTex.r)); float rate = cColorTex.b; float srate = cColorTex.r; Color cor = cSub * cColorTex.g + cMain * cColorTex.r; Color realC = cMainTex * (1.0f - rate) + cor * rate; realC = 1.5f * shadowcol * realC; realC.a = 1.0f; if (bIsInv) { realC = (new Color(realC.r - 0.5f, realC.g - 0.5f, realC.b - 0.5f) * Mathf.Clamp(srate, 0.2f, 0.8f) + new Color(0.5f, 0.5f, 0.5f)) * 0.3f + 0.1f * cMain + 0.1f * Color.white; } res132_1[i * iHeight + j] = realC; } } ret1.SetPixels32(res132_1); return(ret1); }
void OnWizardCreate() { #region Step1: Check files if (string.IsNullOrEmpty(TemplateName)) { CRuntimeLogger.LogError("必须有个模板名称"); return; } Texture2D heighttx = (Texture2D)EditorCommonFunctions.GetReadWritable(HeightMap); if (null == heighttx || SceneConstant.m_iHightmapSize != heighttx.width || SceneConstant.m_iHightmapSize != heighttx.height) { CRuntimeLogger.LogError(string.Format("必须是{0}x{0}的高度贴图,如果你的图片正确,可以检查下导入设置是否是Editor/GUI", SceneConstant.m_iHightmapSize)); return; } Texture2D groundtx = (Texture2D)EditorCommonFunctions.GetReadWritable(GroundMap); if (null == groundtx || SceneConstant.m_iHightmapSize != groundtx.width || SceneConstant.m_iHightmapSize != groundtx.height) { CRuntimeLogger.LogError(string.Format("必须是{0}x{0}的地皮贴图,如果你的图片正确,可以检查下导入设置是否是Editor/GUI", SceneConstant.m_iHightmapSize)); return; } Texture2D doctx = (Texture2D)EditorCommonFunctions.GetReadWritable(DocMap); if (null == doctx || SceneConstant.m_iDecoratemapSize != doctx.width || SceneConstant.m_iDecoratemapSize != doctx.height) { CRuntimeLogger.LogError(string.Format("必须是{0}x{0}的装饰贴图", SceneConstant.m_iDecoratemapSize)); return; } #endregion #region Step2: Create string sGroundFileName = SceneConstant.m_sArtworkPath + "Templates/" + string.Format("T{0}X{0}", SceneConstant.m_iHightmapSize) + "/GenerateMesh/" + TemplateName + ".asset"; Texture2D wmap, nmap; SceneEditorUtility.CreateGround(heighttx, groundtx, doctx, sGroundFileName, GroundType, false, out wmap, out nmap); CSceneTexture sceneTx = new CSceneTexture { m_sSceneType = GroundType }; if (!sceneTx.Load() || 81 != sceneTx.m_pElement.Count) { CRuntimeLogger.LogError(GroundType + "贴图配置文件有问题"); return; } CSceneGroudTemplate groundTemplate = new CSceneGroudTemplate { m_sSceneType = GroundType }; if (!groundTemplate.Load()) { CRuntimeLogger.LogError(GroundType + "贴图配置文件有问题"); return; } CSceneType type = new CSceneType(); type.Load(); if (null == type[GroundType]) { CRuntimeLogger.LogError(GroundType + "的配置找不到?"); return; } #endregion #region Step3: Make Record CSceneTemplate templates = new CSceneTemplate(); templates.Load(); CSceneTemplateElement element = templates[TemplateName]; if (null == element) { element = templates.CreateElement(TemplateName); } element.m_sDecoratePath = AssetDatabase.GetAssetPath(DocMap); element.m_sGroundPath = AssetDatabase.GetAssetPath(GroundMap); element.m_sHeightPath = AssetDatabase.GetAssetPath(HeightMap); templates.Save(); #endregion }
protected void BuildTextureDataWithFolder() { #region Step1: Find all files string sFolderTx = Application.dataPath + "/" + SceneConstant.m_sArtworkPath + TypeName + SceneConstant.m_sSceneTexturesPath; string sFolderDoc = Application.dataPath + "/" + SceneConstant.m_sArtworkPath + TypeName + SceneConstant.m_sDecoratesPath; CRuntimeLogger.Log("将从" + sFolderTx + "和" + sFolderDoc + "收集信息"); DirectoryInfo dirtx = new DirectoryInfo(sFolderTx); DirectoryInfo dirdoc = new DirectoryInfo(sFolderDoc); if (!dirtx.Exists || !dirdoc.Exists) { CRuntimeLogger.LogWarning("你选择目录内容不太对吧!"); return; } List <FileInfo> allTextures = new List <FileInfo>(); allTextures.AddRange(dirtx.GetFiles("*.png", SearchOption.AllDirectories)); allTextures.AddRange(dirdoc.GetFiles("*.png", SearchOption.AllDirectories)); List <FileInfo> allModels = dirdoc.GetFiles("*.fbx", SearchOption.AllDirectories).ToList(); #endregion #region Step2: Create SceneType CSceneType scenetypes = new CSceneType(); scenetypes.Load(); if (null == scenetypes[TypeName]) { CSceneTypeElement newType = scenetypes.CreateElement(TypeName); newType.m_bCanRot = CanRotate; newType.m_eEdgeType = EdgeType; newType.m_iCliffType = CliffType; newType.m_bHasGroundOffset = HasGroundOffset; } else { scenetypes[TypeName].m_bCanRot = CanRotate; scenetypes[TypeName].m_eEdgeType = EdgeType; scenetypes[TypeName].m_iCliffType = CliffType; scenetypes[TypeName].m_bHasGroundOffset = HasGroundOffset; } scenetypes.Save(); #endregion #region Step3: Bake Texture Atlas Dictionary <int, int> codes = new Dictionary <int, int>(new IntEqualityComparer()); Dictionary <string, Texture2D> txDic = new Dictionary <string, Texture2D>(); foreach (FileInfo fileInfo in allTextures) { string sFileName = CommonFunctions.GetLastName(fileInfo.FullName); string[] twoparts = sFileName.Split('_'); string sAssetPath = "Assets" + fileInfo.FullName.Replace("\\", "/").Replace(Application.dataPath.Replace("\\", "/"), ""); Texture2D t1 = AssetDatabase.LoadAssetAtPath(sAssetPath, typeof(Texture2D)) as Texture2D; txDic.Add(sFileName, (Texture2D)EditorCommonFunctions.GetReadWritable(t1)); //Check whether is a template texture int iCode, iRepeat; if (2 == twoparts.Length && !string.IsNullOrEmpty(twoparts[0]) && int.TryParse(twoparts[0].Substring(1, twoparts[0].Length - 1), out iCode) && int.TryParse(twoparts[1], out iRepeat)) { if (codes.ContainsKey(iCode)) { if (codes[iCode] < iRepeat) { codes[iCode] = iRepeat; } } else { codes.Add(iCode, iRepeat); } } } Dictionary <string, Rect> textureDic = EditorCommonFunctions.PackTexture( txDic, SceneConstant.m_sArtworkPath + TypeName + SceneConstant.m_sSceneTexturesPath, Shader.Find("Mobile/Unlit (Supports Lightmap)"), EditorCommonFunctions.EPackColorFormat.ForcePng); #endregion #region Step4: Make template CSceneGroudTemplate tamplate = new CSceneGroudTemplate { m_sSceneType = TypeName }; foreach (KeyValuePair <string, Rect> kvp in textureDic) { CSceneGroudTemplateElement newGT = tamplate.CreateElement(); tamplate.ChangeName(newGT.m_sElementName, kvp.Key); newGT.m_vUV = CommonFunctions.Rect2V4(kvp.Value); } tamplate.Save(); #endregion #region Step5: Make Scene Texture CSceneTexture newT = new CSceneTexture { m_sSceneType = TypeName }; for (int lt = 0; lt < 3; ++lt) { for (int rt = 0; rt < 3; ++rt) { for (int rb = 0; rb < 3; ++rb) { for (int lb = 0; lb < 3; ++lb) { int iCode, iRots; bool bFlip; FindCodeAndRot(codes, lt, rt, rb, lb, out iCode, out iRots, out bFlip); if (iCode < 0) { CRuntimeLogger.LogError(string.Format("组合没有找到{0}-{1}-{2}-{3}", lt, rt, rb, lb)); return; } CSceneTextureElement newE = newT.CreateElement(); int iCode2 = lt * CommonFunctions.IntPow(3, 0) + rt * CommonFunctions.IntPow(3, 1) + rb * CommonFunctions.IntPow(3, 2) + lb * CommonFunctions.IntPow(3, 3); newT.ChangeName(newE.m_sElementName, "T" + iCode2); if (iCode2 != newE.m_iID) { newT.ChangeId(newE.m_iID, iCode2); } newE.m_iTemplate = iCode; newE.m_iRotNumber = iRots; newE.m_iTextureCount = codes[iCode]; newE.m_bReflect = bFlip; } } } } newT.Save(); #endregion #region Step6: Make Decorate Dictionary <int, string> modelTemplates = new Dictionary <int, string>(new IntEqualityComparer()); Dictionary <int, int> modelRepeates = new Dictionary <int, int>(new IntEqualityComparer()); foreach (FileInfo fileInfo in allModels) { string sFileName = CommonFunctions.GetLastName(fileInfo.FullName); string[] twoparts = sFileName.Split('_'); string sAssetPath = "Assets" + fileInfo.FullName.Replace("\\", "/").Replace(Application.dataPath.Replace("\\", "/"), ""); //Check whether is a template texture int iCode, iRepeat; if (3 == twoparts.Length && int.TryParse(twoparts[1], out iCode) && int.TryParse(twoparts[2], out iRepeat) && iCode < 3 && iCode >= 0) { //Make template data if (!modelTemplates.ContainsKey(iCode)) { modelTemplates.Add(iCode, twoparts[0] + "_" + iCode); } if (!modelRepeates.ContainsKey(iCode)) { modelRepeates.Add(iCode, iRepeat); } else if (modelRepeates[iCode] < iRepeat) { modelRepeates[iCode] = iRepeat; } //Make the mesh List <Vector3> verts = new List <Vector3>(); List <Vector2> uvs = new List <Vector2>(); List <int> trangles = new List <int>(); GameObject go = AssetDatabase.LoadMainAssetAtPath(sAssetPath) as GameObject; if (null != go) { foreach (MeshFilter mf in go.GetComponentsInChildren <MeshFilter>(true)) { Mesh editablemesh = (Mesh)EditorCommonFunctions.GetReadWritable(mf.sharedMesh); int iVertCount = verts.Count; Rect rct; MeshRenderer mr = mf.gameObject.GetComponent <MeshRenderer>(); if (null != mr && null != mr.sharedMaterial && null != mr.sharedMaterial.mainTexture && textureDic.ContainsKey(mr.sharedMaterial.mainTexture.name)) { rct = textureDic[mr.sharedMaterial.mainTexture.name]; } else if (textureDic.ContainsKey(editablemesh.name)) { rct = textureDic[editablemesh.name]; } else { CRuntimeLogger.LogWarning("Mesh找不到贴图:" + sAssetPath); return; } if (mf.transform == go.transform) { verts.AddRange(editablemesh.vertices); } else { for (int i = 0; i < editablemesh.vertices.Length; ++i) { Vector3 worldPos = mf.transform.localToWorldMatrix.MultiplyVector(editablemesh.vertices[i]) + mf.transform.position; verts.Add(go.transform.worldToLocalMatrix.MultiplyVector(worldPos - go.transform.position)); } } for (int i = 0; i < editablemesh.uv.Length; ++i) { float fX = Mathf.Clamp01(editablemesh.uv[i].x); float fY = Mathf.Clamp01(editablemesh.uv[i].y); uvs.Add(new Vector2(rct.xMin + rct.width * fX, rct.yMin + rct.height * fY)); } for (int i = 0; i < editablemesh.triangles.Length; ++i) { trangles.Add(iVertCount + editablemesh.triangles[i]); } } } Mesh theMesh = new Mesh { vertices = verts.ToArray(), uv = uvs.ToArray(), triangles = trangles.ToArray() }; theMesh.RecalculateNormals(); Unwrapping.GenerateSecondaryUVSet(theMesh); ; AssetDatabase.CreateAsset(theMesh, "Assets/" + SceneConstant.m_sArtworkPath + TypeName + SceneConstant.m_sDecoratesPath + "/Generate/" + sFileName + ".asset"); } } CSceneDecorate doc = new CSceneDecorate { m_sSceneType = TypeName }; CSceneDecorate olddoc = new CSceneDecorate { m_sSceneType = TypeName }; olddoc.Load(); foreach (KeyValuePair <int, string> kvp in modelTemplates) { CSceneDecorateElement element = doc.CreateElement(kvp.Value); if (element.m_iID != kvp.Key) { doc.ChangeId(element.m_iID, kvp.Key); } element.m_iDecrateRepeat = modelRepeates[kvp.Key]; if (null != olddoc[kvp.Key]) { element.m_bBlockPathfinding = olddoc[kvp.Key].m_bBlockPathfinding; element.m_iDecrateSize = olddoc[kvp.Key].m_iDecrateSize; element.m_bOnlyRotateY = olddoc[kvp.Key].m_bOnlyRotateY; } } doc.Save(); AssetDatabase.Refresh(); #endregion }
protected void OnGUI() { if (null == m_pAllTemplates || null == m_sTemplateChooses || 0 == m_sTemplateChooses.Length) { EditorGUILayout.HelpBox("创建的模板并没有找到!", MessageType.Error); return; } int iIndex1 = 0; int iIndex2 = 0; for (int i = 0; i < m_sTemplateChooses.Length; ++i) { if (!string.IsNullOrEmpty(m_sT1) && m_sT1.Equals(m_sTemplateChooses[i])) { iIndex1 = i; } if (!string.IsNullOrEmpty(m_sT2) && m_sT2.Equals(m_sTemplateChooses[i])) { iIndex2 = i; } } //Choose Template 1 EditorGUILayout.BeginHorizontal(); int iChoose1 = EditorGUILayout.Popup("选择模板1", iIndex1, m_sTemplateChooses); m_sT1 = m_sTemplateChooses[iChoose1]; m_iRot1 = EditorGUILayout.IntField("旋转次数", m_iRot1); m_bFlip1 = EditorGUILayout.Toggle("是否翻转", m_bFlip1); EditorGUILayout.EndHorizontal(); //Choose Template 2 EditorGUILayout.BeginHorizontal(); int iChoose2 = EditorGUILayout.Popup("选择模板2", iIndex2, m_sTemplateChooses); m_sT2 = m_sTemplateChooses[iChoose2]; m_iRot2 = EditorGUILayout.IntField("旋转次数", m_iRot2); m_bFlip2 = EditorGUILayout.Toggle("是否翻转", m_bFlip2); EditorGUILayout.EndHorizontal(); bool bGenerateLittleMap = false; if (GUILayout.Button("随机生成")) { bGenerateLittleMap = true; m_sT1 = m_sTemplateChooses[Random.Range(0, m_sTemplateChooses.Length)]; m_sT2 = m_sTemplateChooses[Random.Range(0, m_sTemplateChooses.Length)]; m_iRot1 = Random.Range(0, 4); m_iRot2 = Random.Range(0, 4); m_bFlip1 = Random.Range(0.0f, 1.0f) > 0.5f; m_bFlip2 = Random.Range(0.0f, 1.0f) > 0.5f; } if (GUILayout.Button("看看小地图") || bGenerateLittleMap) { m_pHTexture = new Texture2D(SceneConstant.m_iSceneHeightMapSize, SceneConstant.m_iSceneHeightMapSize, TextureFormat.RGB565, false); m_pGTexture = new Texture2D(SceneConstant.m_iSceneHeightMapSize, SceneConstant.m_iSceneHeightMapSize, TextureFormat.RGB565, false); m_pDTexture = new Texture2D(SceneConstant.m_iSceneSize, SceneConstant.m_iSceneSize, TextureFormat.RGB565, false); Texture2D ht1 = (Texture2D)EditorCommonFunctions.GetReadWritable( AssetDatabase.LoadAssetAtPath <Texture2D>(m_pAllTemplates[m_sT1].m_sHeightPath)); Texture2D ht2 = (Texture2D)EditorCommonFunctions.GetReadWritable( AssetDatabase.LoadAssetAtPath <Texture2D>(m_pAllTemplates[m_sT2].m_sHeightPath)); Texture2D gt1 = (Texture2D)EditorCommonFunctions.GetReadWritable( AssetDatabase.LoadAssetAtPath <Texture2D>(m_pAllTemplates[m_sT1].m_sGroundPath)); Texture2D gt2 = (Texture2D)EditorCommonFunctions.GetReadWritable( AssetDatabase.LoadAssetAtPath <Texture2D>(m_pAllTemplates[m_sT2].m_sGroundPath)); Texture2D dt1 = (Texture2D)EditorCommonFunctions.GetReadWritable( AssetDatabase.LoadAssetAtPath <Texture2D>(m_pAllTemplates[m_sT1].m_sDecoratePath)); Texture2D dt2 = (Texture2D)EditorCommonFunctions.GetReadWritable( AssetDatabase.LoadAssetAtPath <Texture2D>(m_pAllTemplates[m_sT2].m_sDecoratePath)); for (int i = 0; i < 2 * SceneConstant.m_iHightmapSize - 1; ++i) { for (int j = 0; j < 2 * SceneConstant.m_iHightmapSize - 1; ++j) //0-64 { //0-31, 0-31 if (i < SceneConstant.m_iHightmapSize - 1 && j < SceneConstant.m_iHightmapSize - 1) { m_pHTexture.SetPixel(i, j, GetPixel(ht2, i, j, m_iRot2 + 2, m_bFlip2)); m_pGTexture.SetPixel(i, j, GetPixel(gt2, i, j, m_iRot2 + 2, m_bFlip2)); } //33-64, 0-31 else if (i > SceneConstant.m_iHightmapSize - 1 && j < SceneConstant.m_iHightmapSize - 1) { m_pHTexture.SetPixel(i, j, GetPixel(ht1, i - SceneConstant.m_iHightmapSize + 1, j, m_iRot1 + 2, m_bFlip1)); m_pGTexture.SetPixel(i, j, GetPixel(gt1, i - SceneConstant.m_iHightmapSize + 1, j, m_iRot1 + 2, m_bFlip1)); } else if (i > SceneConstant.m_iHightmapSize - 1 && j > SceneConstant.m_iHightmapSize - 1) { m_pHTexture.SetPixel(i, j, GetPixel(ht2, i - SceneConstant.m_iHightmapSize + 1, j - SceneConstant.m_iHightmapSize + 1, m_iRot2, m_bFlip2)); m_pGTexture.SetPixel(i, j, GetPixel(gt2, i - SceneConstant.m_iHightmapSize + 1, j - SceneConstant.m_iHightmapSize + 1, m_iRot2, m_bFlip2)); } else if (i < SceneConstant.m_iHightmapSize - 1 && j > SceneConstant.m_iHightmapSize - 1) { m_pHTexture.SetPixel(i, j, GetPixel(ht1, i, j - SceneConstant.m_iHightmapSize + 1, m_iRot1, m_bFlip1)); m_pGTexture.SetPixel(i, j, GetPixel(gt1, i, j - SceneConstant.m_iHightmapSize + 1, m_iRot1, m_bFlip1)); } else if (i == SceneConstant.m_iHightmapSize - 1 && j < SceneConstant.m_iHightmapSize - 1) { Color hc1 = GetPixel(ht2, i, j, m_iRot2 + 2, m_bFlip2); Color hc2 = GetPixel(ht1, i - SceneConstant.m_iHightmapSize + 1, j, m_iRot1 + 2, m_bFlip1); m_pHTexture.SetPixel(i, j, hc1 * 0.5f + hc2 * 0.5f); Color gc1 = GetPixel(gt2, i, j, m_iRot2 + 2, m_bFlip2); Color gc2 = GetPixel(gt1, i - SceneConstant.m_iHightmapSize + 1, j, m_iRot1 + 2, m_bFlip1); m_pGTexture.SetPixel(i, j, gc1 * 0.5f + gc2 * 0.5f); } else if (i == SceneConstant.m_iHightmapSize - 1 && j > SceneConstant.m_iHightmapSize - 1) { Color hc1 = GetPixel(ht2, i - SceneConstant.m_iHightmapSize + 1, j - SceneConstant.m_iHightmapSize + 1, m_iRot2, m_bFlip2); Color hc2 = GetPixel(ht1, i, j - SceneConstant.m_iHightmapSize + 1, m_iRot1, m_bFlip1); m_pHTexture.SetPixel(i, j, hc1 * 0.5f + hc2 * 0.5f); Color gc1 = GetPixel(gt2, i - SceneConstant.m_iHightmapSize + 1, j - SceneConstant.m_iHightmapSize + 1, m_iRot2, m_bFlip2); Color gc2 = GetPixel(gt1, i, j - SceneConstant.m_iHightmapSize + 1, m_iRot1, m_bFlip1); m_pGTexture.SetPixel(i, j, gc1 * 0.5f + gc2 * 0.5f); } else if (i > SceneConstant.m_iHightmapSize - 1 && j == SceneConstant.m_iHightmapSize - 1) { Color hc1 = GetPixel(ht1, i - SceneConstant.m_iHightmapSize + 1, j, m_iRot1 + 2, m_bFlip1); Color hc2 = GetPixel(ht2, i - SceneConstant.m_iHightmapSize + 1, j - SceneConstant.m_iHightmapSize + 1, m_iRot2, m_bFlip2); m_pHTexture.SetPixel(i, j, hc1 * 0.5f + hc2 * 0.5f); Color gc1 = GetPixel(gt1, i - SceneConstant.m_iHightmapSize + 1, j, m_iRot1 + 2, m_bFlip1); Color gc2 = GetPixel(gt2, i - SceneConstant.m_iHightmapSize + 1, j - SceneConstant.m_iHightmapSize + 1, m_iRot2, m_bFlip2); m_pGTexture.SetPixel(i, j, gc1 * 0.5f + gc2 * 0.5f); } else if (i < SceneConstant.m_iHightmapSize - 1 && j == SceneConstant.m_iHightmapSize - 1) { Color hc1 = GetPixel(ht2, i, j, m_iRot2 + 2, m_bFlip2); Color hc2 = GetPixel(ht1, i, j - SceneConstant.m_iHightmapSize + 1, m_iRot1, m_bFlip1); m_pHTexture.SetPixel(i, j, hc1 * 0.5f + hc2 * 0.5f); Color gc1 = GetPixel(gt2, i, j, m_iRot2 + 2, m_bFlip2); Color gc2 = GetPixel(gt1, i, j - SceneConstant.m_iHightmapSize + 1, m_iRot1, m_bFlip1); m_pGTexture.SetPixel(i, j, gc1 * 0.5f + gc2 * 0.5f); } else if (i == SceneConstant.m_iHightmapSize - 1 && j == SceneConstant.m_iHightmapSize - 1) { Color hc1 = GetPixel(ht2, i, j, m_iRot2 + 2, m_bFlip2); Color hc2 = GetPixel(ht1, i - SceneConstant.m_iHightmapSize + 1, j, m_iRot1 + 2, m_bFlip1); Color hc3 = GetPixel(ht2, i - SceneConstant.m_iHightmapSize + 1, j - SceneConstant.m_iHightmapSize + 1, m_iRot2, m_bFlip2); Color hc4 = GetPixel(ht1, i, j - SceneConstant.m_iHightmapSize + 1, m_iRot1, m_bFlip1); m_pHTexture.SetPixel(i, j, hc1 * 0.25f + hc2 * 0.25f + hc3 * 0.25f + hc4 * 0.25f); Color gc1 = GetPixel(gt2, i, j, m_iRot2 + 2, m_bFlip2); Color gc2 = GetPixel(gt1, i - SceneConstant.m_iHightmapSize + 1, j, m_iRot1 + 2, m_bFlip1); Color gc3 = GetPixel(gt2, i - SceneConstant.m_iHightmapSize + 1, j - SceneConstant.m_iHightmapSize + 1, m_iRot2, m_bFlip2); Color gc4 = GetPixel(gt1, i, j - SceneConstant.m_iHightmapSize + 1, m_iRot1, m_bFlip1); m_pGTexture.SetPixel(i, j, gc1 * 0.25f + gc2 * 0.25f + gc3 * 0.25f + gc4 * 0.25f); } if (i < 2 * SceneConstant.m_iHightmapSize - 2 && j < 2 * SceneConstant.m_iHightmapSize - 2) { //0-31, 0-31 if (i < SceneConstant.m_iHightmapSize - 1 && j < SceneConstant.m_iHightmapSize - 1) { m_pDTexture.SetPixel(i, j, GetPixel(dt2, i, j, m_iRot2 + 2, m_bFlip2)); } //32-63, 0-31 else if (i >= SceneConstant.m_iHightmapSize - 1 && j < SceneConstant.m_iHightmapSize - 1) { m_pDTexture.SetPixel(i, j, GetPixel(dt1, i - SceneConstant.m_iHightmapSize + 1, j, m_iRot1 + 2, m_bFlip1)); } else if (i >= SceneConstant.m_iHightmapSize - 1 && j >= SceneConstant.m_iHightmapSize - 1) { m_pDTexture.SetPixel(i, j, GetPixel(dt2, i - SceneConstant.m_iHightmapSize + 1, j - SceneConstant.m_iHightmapSize + 1, m_iRot2, m_bFlip2)); } else if (i < SceneConstant.m_iHightmapSize - 1 && j >= SceneConstant.m_iHightmapSize - 1) { m_pDTexture.SetPixel(i, j, GetPixel(dt1, i, j - SceneConstant.m_iHightmapSize + 1, m_iRot1, m_bFlip1)); } } } } m_pHTexture.Apply(); m_pGTexture.Apply(); m_pDTexture.Apply(); } EditorGUILayout.BeginHorizontal(); if (null != m_pHTexture) { GUILayout.Box(m_pHTexture); } if (null != m_pGTexture) { GUILayout.Box(m_pGTexture); } if (null != m_pDTexture) { GUILayout.Box(m_pDTexture); } EditorGUILayout.EndHorizontal(); if (null != m_pHTexture && null != m_pGTexture && null != m_pDTexture) { m_sGroundType = EditorGUILayout.TextField("地图类型:", m_sGroundType); m_eSceneEdge = (ESceneEdgeType)EditorGUILayout.EnumPopup("包边", m_eSceneEdge); m_sBattleFieldName = EditorGUILayout.TextField("战场文件名称:", m_sBattleFieldName); if (!string.IsNullOrEmpty(m_sBattleFieldName) && null != m_pSceneType[m_sGroundType]) { if (GUILayout.Button("生成场景")) { BakeEdge(m_pHTexture, m_pGTexture, m_pDTexture, m_eSceneEdge); m_pWTexture = new Texture2D(SceneConstant.m_iSceneSize, SceneConstant.m_iSceneSize, TextureFormat.RGB565, false); m_pNTexture = new Texture2D(SceneConstant.m_iSceneSize, SceneConstant.m_iSceneSize, TextureFormat.RGB565, false); //Save textures CommonFunctions.CreateFolder(Application.dataPath + "/" + SceneConstant.m_sArtworkPath + "BattleFields/" + m_sBattleFieldName + "/?"); File.WriteAllBytes(Application.dataPath + "/" + SceneConstant.m_sArtworkPath + "BattleFields/" + m_sBattleFieldName + "/Heightmap.png", m_pHTexture.EncodeToPNG()); File.WriteAllBytes(Application.dataPath + "/" + SceneConstant.m_sArtworkPath + "BattleFields/" + m_sBattleFieldName + "/Griundmap.png", m_pGTexture.EncodeToPNG()); File.WriteAllBytes(Application.dataPath + "/" + SceneConstant.m_sArtworkPath + "BattleFields/" + m_sBattleFieldName + "/Decoratemap.png", m_pDTexture.EncodeToPNG()); Texture2D wmap, nmap; SceneEditorUtility.CreateGround(m_pHTexture, m_pGTexture, m_pDTexture, SceneConstant.m_sArtworkPath + "BattleFields/" + m_sBattleFieldName + ".asset", m_sGroundType, true, out wmap, out nmap); File.WriteAllBytes(Application.dataPath + "/" + SceneConstant.m_sArtworkPath + "BattleFields/" + m_sBattleFieldName + "/Walkmap.png", wmap.EncodeToPNG()); File.WriteAllBytes(Application.dataPath + "/" + SceneConstant.m_sArtworkPath + "BattleFields/" + m_sBattleFieldName + "/Normalmap.png", nmap.EncodeToPNG()); } } } }
public static Dictionary <string, string> CreateMeshes(SCharRendererFullInfo[] mesh, Dictionary <string, Rect> rectList, string sFileName, int iProgress, int iProgressFull, int iMc, int iSc) { Dictionary <string, string> ret = new Dictionary <string, string>(); //Load Mesh foreach (SCharRendererFullInfo info in mesh) { if (!info.m_bDiscard) { for (int i = 0; i < iMc; ++i) { for (int j = 0; j < iSc; ++j) { ++iProgress; EditorUtility.DisplayProgressBar("正在生成Atlas模型", string.Format("{0}/{1}", iProgress, iProgressFull), iProgress / (float)iProgressFull); if (!info.m_bCombine) { #region Not Combine string sTexture1 = string.Format("{0}_M{1}S{2}", info.m_sFullTexName, i, j); Mesh theMesh = (Mesh)EditorCommonFunctions.GetReadWritable(info.m_pMesh); Mesh theMesh1 = new Mesh(); theMesh1.SetVertices(theMesh.vertices.ToList()); theMesh1.SetTriangles(theMesh.triangles.ToList(), 0); List <Vector2> list1 = new List <Vector2>(); for (int k = 0; k < theMesh.uv.Length; ++k) { Vector2 vUV = theMesh.uv[k]; if (theMesh.uv[k].x <-0.01f || theMesh.uv[k].y <-0.01f || theMesh.uv[k].x> 1.01f || theMesh.uv[k].y> 1.01f) { CRuntimeLogger.LogWarning("UV is not in 0 - 1, clampled!: FBX:" + CommonFunctions.GetLastName(info.m_sMeshFilterName) + " Model:" + info.m_pMesh.name); } vUV.x = Mathf.Clamp01(theMesh.uv[k].x); vUV.y = Mathf.Clamp01(theMesh.uv[k].y); Rect rect1 = rectList[sTexture1]; list1.Add(new Vector2(vUV.x * rect1.width + rect1.xMin, vUV.y * rect1.height + rect1.yMin)); } theMesh1.uv = list1.ToArray(); theMesh1.uv2 = null; theMesh1.normals = null; theMesh1.colors = null; theMesh1.tangents = null; ; //Create Mesh string sName1 = string.Format("M{0}S{1}/", i, j) + CommonFunctions.GetLastName(info.m_sMeshFilterName) + "_" + info.m_pMesh.name + "_" + info.m_sFullTexName; AssetDatabase.CreateAsset(theMesh1, "Assets/" + sFileName + sName1 + ".asset"); if (ret.ContainsKey(sName1)) { CRuntimeLogger.LogWarning("有mesh的FBX文件重名!" + sName1); } else { ret.Add(sName1, "Assets/" + sFileName + sName1 + ".asset"); } #endregion } else { #region Combine List <Vector3> poses = new List <Vector3>(); List <int> indexes = new List <int>(); List <Vector2> uvs1 = new List <Vector2>(); for (int objIndex = 0; objIndex < info.m_pCombinedMeshObj.Length; ++objIndex) { string sTexture1 = string.Format("{0}_M{1}S{2}", info.m_sTextureNames[objIndex], i, j); Mesh theMesh = (Mesh)EditorCommonFunctions.GetReadWritable(info.m_pCombinedMesh[objIndex]); int iOldPosNum = poses.Count; if (0 == objIndex) { poses = theMesh.vertices.ToList(); } else { foreach (Vector3 vets in theMesh.vertices) { Vector3 worldPos = info.m_pCombinedMeshObj[objIndex].transform.localToWorldMatrix.MultiplyVector(vets) + info.m_pCombinedMeshObj[objIndex].transform.position; poses.Add(info.m_pCombinedMeshObj[0].transform.worldToLocalMatrix.MultiplyVector(worldPos - info.m_pCombinedMeshObj[0].transform.position)); } } if (0 == objIndex) { indexes = theMesh.triangles.ToList(); } else { foreach (int oneind in theMesh.triangles) { indexes.Add(oneind + iOldPosNum); } } for (int k = 0; k < theMesh.uv.Length; ++k) { Vector2 vUV = theMesh.uv[k]; vUV.x = Mathf.Clamp01(theMesh.uv[k].x); vUV.y = Mathf.Clamp01(theMesh.uv[k].y); Rect rect1 = rectList[sTexture1]; uvs1.Add(new Vector2(vUV.x * rect1.width + rect1.xMin, vUV.y * rect1.height + rect1.yMin)); } } Mesh theMesh1 = new Mesh(); theMesh1.SetVertices(poses); theMesh1.SetTriangles(indexes, 0); theMesh1.uv = uvs1.ToArray(); theMesh1.uv2 = null; theMesh1.normals = null; theMesh1.colors = null; theMesh1.tangents = null; ; //Create Mesh string sName1 = string.Format("M{0}S{1}/cmb_", i, j) + CommonFunctions.GetLastName(info.m_sMeshFilterName); AssetDatabase.CreateAsset(theMesh1, "Assets/" + sFileName + sName1 + ".asset"); if (ret.ContainsKey(sName1)) { CRuntimeLogger.LogWarning("有mesh的FBX文件重名!" + sName1); } else { ret.Add(sName1, "Assets/" + sFileName + sName1 + ".asset"); } #endregion } } } } } return(ret); }