//地形瓦片 private static void CreateTilesMap(string bigMapKey, int offsetX, int offsetY, MapAsset mapAsset) { GameObject root = GameObject.Find("MapTilesRoot/MapTiles"); if (root == null) { return; } //美术还没弄完先,目前只有一种类型,先特殊处理 Renderer[] gos = root.transform.GetComponentsInChildren <Renderer>(); for (int index = 0; index < gos.Length; index++) { Transform element = gos[index].transform; element.gameObject.name = gos[index].sharedMaterial.name; if (true)//element.gameObject.name.Contains(TilesMapKey)) { string prefabPath = MapDefine.TilesMapFilePath + element.gameObject.name + ".prefab"; if (!System.IO.File.Exists(Application.dataPath + prefabPath)) { PrefabUtility.CreatePrefab("Assets" + prefabPath, element.gameObject); } int col = (int)(element.position.x + offsetX) / MapDefine.MapElementSize; int row = (int)(element.position.z + offsetY) / MapDefine.MapElementSize; string elementGridKey = col + "" + row; string elementKey = tilesIndex + ""; tilesIndex++; string gridKey = col + "_" + row; MapElementInfo elementInfo = new MapElementInfo() { Pos = element.position, Angle = element.eulerAngles, Scale = element.localScale }; MapElement mapElement = new MapElement(); mapElement.elementKey = elementKey; mapElement.elementType = element.name; mapElement.elementInfo = elementInfo; mapAsset.AddMapElement(mapElement); mapAsset.AddMapElementGridItem(gridKey, elementKey); } } }
private static void CreateElement(Transform go, string bigMapIndex, ref MapAsset mapAsset) { if (go == null) { return; } string[] bigMapIndexs = bigMapIndex.Split('_'); int bigMapX = int.Parse(bigMapIndexs[0]); int bigMapY = int.Parse(bigMapIndexs[1]); //基于大地图偏移 int offsetX = bigMapX * MapDefine.MAPITEMTOTALSIZE; int offsetY = bigMapY * MapDefine.MAPITEMTOTALSIZE; string bigMapKey = bigMapX + "" + bigMapY; for (int index = 0; index < go.childCount; index++) { Transform element = go.GetChild(index); if (element.name.Contains("Ele_")) { Transform foorRoot = element.Find("Box_Collider"); if (foorRoot != null) { foorRoot.gameObject.layer = LayerMask.NameToLayer("Roof"); } string prefabPath = MapDefine.MapElementFilePath + element.name + ".prefab"; if (!System.IO.File.Exists(Application.dataPath + prefabPath)) { Transform tempColliderRoot = element.Find("ColliderRoot"); if (tempColliderRoot != null) { tempColliderRoot.SetParent(null); } PrefabUtility.CreatePrefab("Assets" + prefabPath, element.gameObject); if (tempColliderRoot != null) { tempColliderRoot.SetParent(element.transform); } } int invertal = MapDefine.MapElementSize; string elementKey = bigMapKey + ElementIndex; ElementIndex++; //bound Vector3 postion = element.position; Vector3 scale = element.localScale; element.position = Vector3.zero; // element.localScale = Vector3.one; Vector3 center = Vector3.zero; Renderer[] renders = element.GetComponentsInChildren <Renderer>(); foreach (Renderer child in renders) { center += child.bounds.center; } center /= renders.Length; Bounds bounds = new Bounds(center, Vector3.zero); foreach (Renderer child in renders) { bounds.Encapsulate(child.bounds); } Vector3 centralPoint = bounds.center; element.position = postion; // element.localScale = scale; centralPoint += element.position; int starX = (int)(centralPoint.x - bounds.size.x * 0.5f + offsetX) / invertal; int endX = (int)(centralPoint.x + bounds.size.x * 0.5f + offsetX) / invertal; int starZ = (int)(centralPoint.z - bounds.size.z * 0.5f + offsetY) / invertal; int endZ = (int)(centralPoint.z + bounds.size.z * 0.5f + offsetY) / invertal; for (int k = starX; k <= endX; k++) { for (int j = starZ; j <= endZ; j++) { string gridKey = k + "_" + j; MapElementInfo elementInfo = new MapElementInfo() { Pos = element.position, Angle = element.eulerAngles, Scale = element.lossyScale, }; // Debug.LogError(element.name+" Pos "+ element.position +" ang "+ element.eulerAngles + " scale "+ element.lossyScale); MapElement mapElement = new MapElement(); mapElement.elementKey = elementKey; mapElement.elementType = element.name; mapElement.elementInfo = elementInfo; mapAsset.AddMapElement(mapElement); mapAsset.AddMapElementGridItem(gridKey, elementKey); } } } else { CreateElement(element, bigMapIndex, ref mapAsset); } } }
//纹理瓦片 private static void CreateTileTexture(Transform go, string bigMapKey, int offsetX, int offsetY, MapAsset mapAsset) { if (go == null) { return; } for (int index = 0; index < go.childCount; index++) { Transform element = go.GetChild(index); if (element.name.Contains(TilesTextureKey)) { string prefabPath = MapDefine.TilesMapFilePath + element.name + ".prefab"; if (!System.IO.File.Exists(Application.dataPath + prefabPath)) { PrefabUtility.CreatePrefab("Assets" + prefabPath, element.gameObject); } int tempTilesindex = tilesIndex++; Vector3 postion = element.position; Vector3 scale = element.localScale; element.position = Vector3.zero; element.localScale = Vector3.one; Vector3 center = Vector3.zero; Renderer[] renders = element.GetComponentsInChildren <Renderer>(); foreach (Renderer child in renders) { center += child.bounds.center; } center /= renders.Length; Bounds bounds = new Bounds(center, Vector3.zero); foreach (Renderer child in renders) { bounds.Encapsulate(child.bounds); } Vector3 centralPoint = bounds.center; element.position = postion; element.localScale = scale; centralPoint += element.position; int starX = (int)(centralPoint.x - bounds.size.x * 0.5f + offsetX) / MapDefine.TilesGridInterval; int endX = (int)(centralPoint.x + bounds.size.x * 0.5f + offsetX) / MapDefine.TilesGridInterval; int starZ = (int)(centralPoint.z - bounds.size.z * 0.5f + offsetY) / MapDefine.TilesGridInterval; int endZ = (int)(centralPoint.z + bounds.size.z * 0.5f + offsetY) / MapDefine.TilesGridInterval; for (int k = starX; k <= endX; k++) { for (int j = starZ; j <= endZ; j++) { string gridKey = k + "_" + j; MapElementInfo elementInfo = new MapElementInfo() { Pos = element.position, Angle = element.eulerAngles, Scale = element.localScale }; MapElement mapElement = new MapElement(); mapElement.elementKey = tempTilesindex + ""; mapElement.elementType = element.name; mapElement.elementInfo = elementInfo; mapAsset.AddMapElement(mapElement); mapAsset.AddMapElementGridItem(gridKey, mapElement.elementKey); } } } else { CreateTileTexture(element, bigMapKey, offsetX, offsetY, mapAsset); } } }