void CreateChunks(World.WorldType worldType) { chunks = new HexGridChunk[chunkCountX * chunkCountZ]; for (int z = 0, i = 0; z < chunkCountZ; z++) { for (int x = 0; x < chunkCountX; x++) { HexGridChunk chunk = chunks[i++] = Instantiate(chunkPrefab); chunk.transform.SetParent(transform); if (i <= chunks.Length / 3) { chunk.Initialize(HexGridChunk.ChunkElevationVariance.HILLY, HexGridChunk.ChunkMaterial.GRASS); } else if (i >= (chunks.Length / 3) * 2) { chunk.Initialize(HexGridChunk.ChunkElevationVariance.FLAT, HexGridChunk.ChunkMaterial.GRASS); } else { chunk.Initialize(HexGridChunk.ChunkElevationVariance.STEEP, HexGridChunk.ChunkMaterial.GRASS); } } } }
void AddCellToChunk(int x, int z, HexCell cell) { int chunkX = x / HexMetrics.chunkSizeX; int chunkZ = z / HexMetrics.chunkSizeZ; HexGridChunk chunk = chunks[chunkX + chunkZ * chunkCountX]; int localX = x - chunkX * HexMetrics.chunkSizeX; int localZ = z - chunkZ * HexMetrics.chunkSizeZ; chunk.AddCell(localX + localZ * HexMetrics.chunkSizeZ, cell); }
void AddCellToChunk(int x, int y, HexCell cell) { int chunkX = x / chunkSizeX; int chunkY = y / chunkSizeY; HexGridChunk chunk = chunks[chunkX + chunkY * chunkCountX]; int localX = x - chunkX * chunkSizeX; int localY = y - chunkY * chunkSizeY; chunk.AddCell(localX + localY * chunkSizeX, cell); }
/// <summary> /// 更新地图块 /// </summary> /// <param name="chunkId">地图块编号</param> /// <param name="cellIndex">单元索引</param> /// <param name="color">颜色</param> /// <param name="elevation">海拔</param> /// <param name="affected">是否受影响</param> /// <param name="brushSize">刷子大小</param> public void UpdateChunk(int chunkId, int cellIndex, Color color, int elevation, bool affected = false, int brushSize = 0) { if (chunkId == int.MinValue) { return; } HexGridChunk chunk = chunks[chunkId]; StartCoroutine(chunk.UpdateChunk(cellIndex, color, elevation, affected, brushSize)); }
void AddToChunk(int x, int z, HexCell cell) { int chunkX = x / HexMetrics.chunkWidth; int chunkZ = z / HexMetrics.chunkHeight; HexGridChunk chunk = chunks[chunkX + chunkZ * chunkCountX]; int localX = x - (chunkX * HexMetrics.chunkWidth); int localZ = z - (chunkZ * HexMetrics.chunkHeight); chunk.AddCell(localX + localZ * HexMetrics.chunkWidth, cell); }
private void AddCellToChunk(int x, int z, HexCell cell) { int chunkX = x / HexMetrics.CHUNK_SIZE_X; int chunkZ = z / HexMetrics.CHUNK_SIZE_Z; HexGridChunk chunk = chunks[chunkX + chunkZ * chunkCountX]; int localX = x - chunkX * HexMetrics.CHUNK_SIZE_X; int localZ = z - chunkZ * HexMetrics.CHUNK_SIZE_Z; chunk.AddCell(localX + localZ * HexMetrics.CHUNK_SIZE_X, cell); }
//新建地图 public void NewMap(HexCell cellPrefab, Text cellLabelPrefab, HexGridChunk gridChunkPerfab, bool isNewMaterial = false, Texture2D[] terrainTexs = null, int chunkWidth = 0, int chunkHeight = 0) { if (!HexMetrics.instance.isEditor) { gridCanvas = (Instantiate(Resources.Load("Prefabs/UIPrefabs/Hex Grid Canvas") as GameObject)).GetComponent <Canvas>(); gridCanvas.transform.SetParent(transform); } //chunks = new HexGridChunk[chunkCountX * chunkCountZ]; chunks = new HexGridChunk[chunkCountX * chunkCountZ]; if (chunkWidth == 0 || chunkHeight == 0) { width = HexMetrics.instance.chunkWidth; height = HexMetrics.instance.chunkHeight; } else { width = chunkWidth; height = chunkHeight; } cellCountWidth = width * chunkCountX; cellCountHeight = height * chunkCountZ; cells = new HexCell[cellCountWidth * cellCountHeight]; for (int j = 0, i = 0; j < chunkCountZ; j++) { for (int k = 0; k < chunkCountX; k++) { HexGridChunk chunk = chunks[i++] = Instantiate(gridChunkPerfab) as HexGridChunk; chunk.Init(chunkWidth, chunkHeight, terrainTexs); //chunk.transform.SetParent(GameObject.Find("Map").transform); chunk.name = "HexChunk_" + k.ToString("000") + "_" + j.ToString("000"); chunk.transform.SetParent(transform); chunk.transform.localPosition = new Vector3(chunk.transform.localPosition.x, 0, chunk.transform.localPosition.z); if (isNewMaterial) { chunk.CreateMaterial(terrainTexs); } } } for (int j = 0, i = 0; j < cellCountHeight; j++) { for (int k = 0; k < cellCountWidth; k++) { CreateCell(k, j, i++, cellPrefab, cellLabelPrefab); } } Refresh(); }
void AddCellToChunk(int x, int z, HexCell cell) { int chunkX = x / HexMetrics.chunkSizeX;//делением нацело находим координаты нужного чанка int chunkZ = z / HexMetrics.chunkSizeZ; HexGridChunk chunk = chunks[chunkX + chunkZ * chunkCountX]; int localX = x - chunkX * HexMetrics.chunkSizeX;//нахождение локальных координат внутри конкретного чанка int localZ = z - chunkZ * HexMetrics.chunkSizeZ; chunk.AddCell(localX + localZ * HexMetrics.chunkSizeX, cell); }
void AddCellToChunk(int x, int z, HexCell cell) { int chunkX = x / HexData.chunkSizeX; int chunkZ = z / HexData.chunkSizeZ; HexGridChunk chunk = chunks[chunkX + chunkZ * chunkCountX]; int localX = x - chunkX * HexData.chunkSizeX; int localZ = z - chunkZ * HexData.chunkSizeZ; chunk.AddCell(localX + localZ * HexData.chunkSizeX, cell, AutoGenerate); }
private void AddHexToChunk(int x, int z, HexObject hex) { int chunkX = x / HexMetrics.Instance.chunkSizeX; int chunkZ = z / HexMetrics.Instance.chunkSizeZ; HexGridChunk chunk = chunks[chunkX + chunkZ * ChunkCountX]; int localX = x - chunkX * HexMetrics.Instance.chunkSizeX; int localZ = z - chunkZ * HexMetrics.Instance.chunkSizeZ; chunk.AddHex(localX + localZ * HexMetrics.Instance.chunkSizeX, hex); }
void CreateChunks() { chunks = new HexGridChunk[chunkCountX * chunkCountY]; for (int y = 0, i = 0; y < chunkCountY; y++) { for (int x = 0; x < chunkCountX; x++) { HexGridChunk chunk = chunks [i++] = Instantiate(chunkPrefab); chunk.transform.SetParent(transform); } } }
void CreateChunks() { chunks = new HexGridChunk[chunkCountX * chunkCountZ]; for (int z = 0, i = 0; z < chunkCountZ; z++) { for (int x = 0; x < chunkCountX; x++) { HexGridChunk chunk = chunks[i++] = Instantiate(chunkPerfab); chunk.transform.SetParent(transform); } } }
private void CreateChunks() { _chunks = new HexGridChunk[_chunkCountX * _chunkCountZ]; for (int z = 0, i = 0; z < _chunkCountZ; z++) { for (int x = 0; x < _chunkCountX; x++) { HexGridChunk chunk = _chunks[i++] = Instantiate(chunkPrefab); chunk.transform.SetParent(transform); } } }
/// <summary> /// 把六边形添加到对应的网格块下 /// </summary> /// <param name="x"></param> /// <param name="z"></param> /// <param name="cell"></param> void AddCellToChunk(int x, int z, HexCell cell) { // 计算出这个六边形属于哪个网格块 int chunkX = x / HexMetrics.chunkSizeX; int chunkZ = z / HexMetrics.chunkSizeZ; HexGridChunk chunk = chunks[chunkX + chunkZ * chunkCountX]; // 计算出这个六边形是该网格块中的第几个 int localX = x - chunkX * HexMetrics.chunkSizeX; int localZ = z - chunkZ * HexMetrics.chunkSizeZ; chunk.AddCell(localX + localZ * HexMetrics.chunkSizeX, cell); }
void CreateChunks() { chunks = new HexGridChunk[chunkCountZ * chunkCountX]; for (int z = 0, i = 0; z < chunkCountZ; ++z) { for (int x = 0; x < chunkCountX; ++x) { HexGridChunk chunk = chunks[i++] = Instantiate(chunkPrefab); chunk.transform.SetParent(transform); } } }
private void AddCellToChunk(int x, int z, HexCell hexCell) { int chunkX = x / HexMetrics.ChunkSizeX; int chunkZ = z / HexMetrics.ChunkSizeZ; int index = (chunkZ * m_chunkCountX) + chunkX; HexGridChunk chunk = m_gridChunks[index]; int localX = x - chunkX * HexMetrics.ChunkSizeX; int localZ = z - chunkZ * HexMetrics.ChunkSizeZ; chunk.AddCell((localZ * HexMetrics.ChunkSizeX) + localX, hexCell); }
/// <summary> /// 创建地图块,并将创建的实例循环添加至数组chunks中 /// </summary> private void CreateChunks() { //设置数组长宽 chunks = new HexGridChunk[chunkCountX * chunkCountZ]; //双循环,将创建的chunk实例添加到chunks数组中 for (int z = 0, i = 0; z < chunkCountZ; z++) { for (int x = 0; x < chunkCountX; x++) { HexGridChunk chunk = chunks[i++] = Instantiate(chunkPrefab); chunk.transform.SetParent(transform); } } }
void CreateChunks() { Chunks = new HexGridChunk[chunkCountX, chunkCountZ]; for (int z = 0, i = 0; z < chunkCountZ; z++) { for (int x = 0; x < chunkCountX; x++, i++) { HexGridChunk chunk = Chunks[x, z] = Instantiate(chunkPrefab); chunk.transform.SetParent(transform); chunk.hexGrid = this; chunk.xIndex = x; chunk.zIndex = z; } } }
/// <summary> /// 通过cell在数组中的坐标计算后,将其分配到对应的chunk中 /// </summary> /// <param name="x">cell在整体数组中的横坐标</param> /// <param name="z">cell在整体数组中的纵坐标</param> /// <param name="cell">cell自身的实例</param> private void AddCellToChunk(int x, int z, HexCell cell) { //通过cell整体数组的横纵坐标,计算出cell属于哪个chunk int chunkX = x / HexMetrics.chunkSizeX; int chunkZ = z / HexMetrics.chunkSizeZ; //通过计算得到的坐标,获取对应chunk的实例 HexGridChunk chunk = chunks[chunkX + chunkZ * chunkCountX]; //通过cell整体数组坐标,计算出其在对应chunk数组中的下标 int localX = x - chunkX * HexMetrics.chunkSizeX; int localZ = z - chunkZ * HexMetrics.chunkSizeZ; //得到下标后,将cell实例添加到对应chunk的数组中 chunk.AddCell(localX + localZ * HexMetrics.chunkSizeX, cell); }
void CellToChunk(int x, int z, HexCell cell) { int chunkX = x / width; int chunkZ = z / height; HexGridChunk tmpChunk = chunks[chunkZ * chunkCountX + chunkX]; int cellOfChunkX = x - x / width * width; int cellOfChunkZ = z - z / height * height; if (cellOfChunkZ * width + cellOfChunkX == 0) { tmpChunk.transform.position = cell.transform.position; } tmpChunk.AddCell(cellOfChunkZ * width + cellOfChunkX, cell); cell.SetParentChunk(tmpChunk); }
void CreateChunks() { columns = new Transform[chunkCountX]; for (int x = 0; x < chunkCountX; x++) { columns[x] = new GameObject("Column").transform; columns[x].SetParent(transform, false); } chunks = new HexGridChunk[chunkCountX * chunkCountZ]; for (int z = 0, i = 0; z < chunkCountZ; z++) { for (int x = 0; x < chunkCountX; x++) { HexGridChunk chunk = chunks[i++] = Instantiate(chunkPrefab); chunk.transform.SetParent(columns[x], false); } } }
void OnGUI() { EditorGUILayout.Space(); mapCell = EditorGUILayout.ObjectField(mapCell, typeof(HexCell), true) as HexCell; cellLabelPrefab = EditorGUILayout.ObjectField(cellLabelPrefab, typeof(Text), true) as Text; chunkPrefab = EditorGUILayout.ObjectField(chunkPrefab, typeof(HexGridChunk), true) as HexGridChunk; noiseSource = EditorGUILayout.ObjectField(noiseSource, typeof(Texture), true) as Texture2D; mapSizeX = EditorGUILayout.IntField("地图长:", mapSizeX); mapSizeY = EditorGUILayout.IntField("地图宽:", mapSizeY); EditorGUILayout.Space(); if (GUILayout.Button("生成地图预览")) { if (mapCell == null) { Debug.LogError("没有地图格子预制体"); return; } GenerateMap(); isCreate = true; } if (isCreate) { for (int i = 0; i < HexMapEditor.HexGrid.chunks.Length; i++) { HexMapEditor.HexGrid.chunks[i].LateRefresh(); } } if (GUILayout.Button("打开怪物资源")) { SceneEditorWindow.CreateDungeonEditor(); } if (GUILayout.Button("打开地图数据编辑")) { HexMapCellTypeWindow.CreateCellTypeEditor(); } if (GUILayout.Button("保存当前场景数据到Json")) { MapEditorData.ExportJSON(); } }
private void OnSceneGUI() { HandleUtility.AddDefaultControl(GUIUtility.GetControlID(FocusType.Keyboard)); switch (editorType) { case EditorType.HeightEditor: currentBrush = heightBrush; MeshModifier.instance.m_brush = currentBrush; MeshModifier.instance.DoEvent(); break; case EditorType.WaterEditor: currentBrush = waterBrush; MeshModifier.instance.m_brush = currentBrush; MeshModifier.instance.DoEvent(); break; case EditorType.EdgeEditor: currentBrush = edgeBrush; MeshModifier.instance.m_brush = currentBrush; MeshModifier.instance.DoEvent(); break; case EditorType.MaterialEditor: HexGridChunk preLockedChunk = MaterialModifier.instance.m_lockedChunk; currentBrush = materialBrush; MaterialModifier.instance.m_brush = currentBrush; MaterialModifier.instance.DoEvent(); if (MaterialModifier.instance.m_lockedChunk != preLockedChunk) { Repaint(); } break; case EditorType.SceneObjEditor: currentBrush = sceneObjBrush; SceneObjModifier.instance.m_brush = sceneObjBrush; SceneObjModifier.instance.DoEvent(); break; } SceneView.currentDrawingSceneView.Repaint(); }
private void DrawDiffuseLayerGUI(HexGridChunk chunk) { int count = 0; HexGridChunk.TerrainLayer[] terrainLayers = chunk.terrainLayers; for (int i = 0; i < terrainLayers.Length; i++) { HexGridChunk.TerrainLayer curLayer = terrainLayers[i]; if (curLayer == null || curLayer.terrainIndex == -1) { continue; } count++; EditorGUILayout.BeginHorizontal(); Texture2D curTex = curLayer.albedoMap; Texture2D newTex = EditorGUILayout.ObjectField(curTex, typeof(Texture2D), false, GUILayout.Width(72), GUILayout.Height(72)) as Texture2D; EditorGUILayout.BeginVertical(); EditorGUILayout.LabelField("Layer: " + (i + 1).ToString()); EditorGUILayout.BeginHorizontal(); if (EditorGUILayout.Toggle(materialBrush.TerrainType == (TerrainTypes)i, GUILayout.Width(18))) { materialBrush.TerrainType = (TerrainTypes)i; } EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); if (newTex != curTex) { chunk.ReplaceAlbedoMap(i, newTex); } } if (terrainLayers.Length < 6 || count < 6) { EditorGUILayout.BeginHorizontal(); if (GUILayout.Button(CONTENT_ADD_LAYER, GUILayout.MaxWidth(20))) { chunk.AddTerrainLayer(null); } EditorGUILayout.EndHorizontal(); } }
private void CreateChunks() { m_columns = new Transform[m_chunkCountX]; for (int i = 0; i < m_columns.Length; ++i) { m_columns[i] = new GameObject("Column").transform; m_columns[i].SetParent(transform, false); } m_gridChunks = new HexGridChunk[m_chunkCountX * m_chunkCountZ]; int count = 0; for (int z = 0; z < m_chunkCountZ; ++z) { for (int x = 0; x < m_chunkCountX; ++x) { HexGridChunk chunk = Instantiate(HexGridChunkPrefab); chunk.transform.SetParent(m_columns[x], false); m_gridChunks[count++] = chunk; } } }
void SetLockedChunk(Event e) { Ray inputRay = HandleUtility.GUIPointToWorldRay(e.mousePosition); RaycastHit hit; HexCell centerCell = null; if (Physics.Raycast(inputRay, out hit)) { centerCell = HexGrid.instance.GetCell(hit.point); if (e.keyCode == KeyCode.L) { if (m_lockedChunk != null) { m_brush.m_hexEdgeMesh.gameObject.SetActive(false); m_lockedChunk = null; } else { m_brush.m_hexEdgeMesh.gameObject.SetActive(true); m_lockedChunk = centerCell.chunkParent; } } } }
/// <summary> /// 刷新地图块 /// </summary> /// <param name="chunkId">地图块编号</param> public void Refresh(int chunkId) { HexGridChunk chunk = chunks[chunkId]; chunk.Refresh(); }
//反向获取所在块 public void SetParentChunk(HexGridChunk chunk) { chunkParent = chunk; }
IEnumerator WaitMesh(HexGridChunk chunk) { yield return(new WaitForSeconds(0.3f)); chunk.sceneObjectMgr.Refresh(); }
//新建地图 public void NewMap(string mapName = "Hex Map", bool isNewMaterial = false, Texture2D[] terrainTexs = null, int chunkWidth = 0, int chunkHeight = 0) { if (!HexMetrics.instance.isEditor) { gridCanvas = (Instantiate(Resources.Load("Prefabs/UIPrefabs/Hex Grid Canvas") as GameObject)).GetComponent <Canvas>(); gridCanvas.transform.SetParent(transform); } mapPrefab = (Instantiate(Resources.Load("Prefabs/Hex Map") as GameObject)).GetComponent <HexMap>(); mapPrefab.name = "HexMap"; cellPrefab = (Instantiate(Resources.Load("Prefabs/Hex Cell") as GameObject)).GetComponent <HexCell>(); cellPrefab.name = "HexCell"; cellLabelPrefab = (Instantiate(Resources.Load("Prefabs/UIPrefabs/Hex Cell Label") as GameObject)).GetComponent <Text>(); cellLabelPrefab.name = "HexCellLabel"; noiseSource = Resources.Load("Texture/Noise") as Texture2D; //chunks = new HexGridChunk[chunkCountX * chunkCountZ]; if (HexMetrics.instance.isEditorTexture) { gridChunkPerfab = (Instantiate(Resources.Load("Prefabs/Hex Grid Chunk") as GameObject)).GetComponent <HexGridChunk>(); gridChunkPerfab.name = "Hex Grid Chunk Prefab"; } else { gridChunkPerfab = (Instantiate(Resources.Load("Prefabs/Hex Grid Chunk Color") as GameObject)).GetComponent <HexGridChunk>(); gridChunkPerfab.name = "Hex Grid Chunk Color Prefab"; } for (int i = 0; i < oldCountX * oldCountZ; i++) { if (chunks[i] != null) { chunks[i].Clear(); if (HexMetrics.instance.isEditor) { DestroyImmediate(chunks[i].gameObject); } else { Destroy(chunks[i].gameObject); } } } HexMetrics.instance.noiseSource = noiseSource; if (chunkWidth == 0 || chunkHeight == 0) { width = HexMetrics.instance.chunkWidth; height = HexMetrics.instance.chunkHeight; } else { width = chunkWidth; height = chunkHeight; } oldCountX = chunkCountX; oldCountZ = chunkCountZ; cellCountWidth = width * chunkCountX; cellCountHeight = height * chunkCountZ; maps = new HexMap[1]; maps[0] = Instantiate(mapPrefab) as HexMap; maps[0].name = mapName; maps[0].transform.localPosition = Vector3.zero; maps[0].transform.localRotation = Quaternion.Euler(0, 0, 0); maps[0].SetMapSize(chunkCountX, chunkCountZ); maps[0].NewMap(cellPrefab, cellLabelPrefab, gridChunkPerfab, isNewMaterial, terrainTexs, width, height); cells = maps[0].cells; chunks = maps[0].chunks; //cells = new HexCell[cellCountWidth * cellCountHeight]; //for (int j = 0, i = 0; j < chunkCountZ; j++) //{ // for (int k = 0; k < chunkCountX; k++) // { // HexGridChunk chunk = chunks[i++] = Instantiate(gridChunkPerfab) as HexGridChunk; // //chunk.transform.SetParent(GameObject.Find("Map").transform); // chunk.name = "HexChunk_" + k.ToString("000") + "_" + j.ToString("000"); // chunk.transform.SetParent(transform); // chunk.transform.localPosition = new Vector3(chunk.transform.localPosition.x, 0, chunk.transform.localPosition.z); // } //} //for (int j = 0, i = 0; j < cellCountHeight; j++) //{ // for (int k = 0; k < cellCountWidth; k++) // { // CreateCell(k, j, i++); // } //} //Refresh(); }