Exemplo n.º 1
0
    //地形瓦片
    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);
            }
        }
    }
Exemplo n.º 2
0
    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);
            }
        }
    }
Exemplo n.º 3
0
    //纹理瓦片
    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);
            }
        }
    }