//刷新地形mesh void RefreshMesh(Event e) { //Ray inputRay = Camera.main.ScreenPointToRay(Input.mousePosition); Ray inputRay = HandleUtility.GUIPointToWorldRay(e.mousePosition); Debug.Log(inputRay.direction); RaycastHit hit; HexCell centerCell = null; int centerX = 0; int centerZ = 0; m_refreshChunkList.Clear(); if (Physics.Raycast(inputRay, out hit)) { centerCell = HexGrid.instance.GetCell(hit.point); if (m_lockedChunk == null || centerCell.chunkParent != m_lockedChunk) { return; } TerrainEditor.redoStack.Clear(); TerrainEditor.UndoAdd(centerCell, m_brush); m_refreshChunkList.Add(centerCell.chunkParent); centerX = centerCell.coordinates.X; centerZ = centerCell.coordinates.Z; Vector3 pos = hit.point; //整个Cell进行刷新 if (m_brush.m_brushShapeType == TerrainBrush.BrushShapeType.CellBrush) { for (int l = 0, z = centerZ; z >= centerZ - m_brush.brushRange + 1; l++, z--) { for (int x = centerX - m_brush.brushRange + 1 + l; x <= centerX + m_brush.brushRange - 1; x++) { EditCell(HexGrid.instance.GetCell(new HexCoordinates(x, z)), m_brush); } } for (int l = 1, z = centerZ + 1; z <= centerZ + m_brush.brushRange - 1; l++, z++) { for (int x = centerX - m_brush.brushRange + 1; x <= centerX + m_brush.brushRange - 1 - l; x++) { EditCell(HexGrid.instance.GetCell(new HexCoordinates(x, z)), m_brush); } } for (int i = 0; i < m_refreshChunkList.Count; i++) { m_refreshChunkList[i].Refresh(); } } //刷新地形权重图 else if (m_brush.m_brushShapeType == TerrainBrush.BrushShapeType.CircleBrush) { //m_brush.PaintPixel(pos.x, pos.z, HexGrid.instance.ChunkWidth, HexGrid.instance.ChunkHeight, UpdateMaterialWeight, null); } //将修改后的也压入undo栈中,为压入redo栈做准备 TerrainEditor.UndoAdd(centerCell, m_brush); } }
//刷新地形mesh void RefreshMesh(Event e) { //Ray inputRay = Camera.main.ScreenPointToRay(Input.mousePosition); Ray inputRay = HandleUtility.GUIPointToWorldRay(e.mousePosition); Debug.Log(inputRay.direction); RaycastHit hit; HexCell centerCell = null; int centerX = 0; int centerZ = 0; m_refreshChunkList.Clear(); m_refreshCellList.Clear(); if (Physics.Raycast(inputRay, out hit)) { centerCell = HexGrid.instance.GetCell(hit.point); TerrainEditor.redoStack.Clear(); TerrainEditor.UndoAdd(centerCell, m_brush); m_refreshChunkList.Add(centerCell.chunkParent); m_refreshCellList.Add(centerCell); centerX = centerCell.coordinates.X; centerZ = centerCell.coordinates.Z; Vector3 pos = hit.point; HexDirection clickDir = HexGrid.instance.GetPointDirection(new Vector2(pos.x - centerCell.transform.position.x, pos.z - centerCell.transform.position.z)); for (int l = 0, z = centerZ; z >= centerZ - m_brush.brushRange + 1; l++, z--) { for (int x = centerX - m_brush.brushRange + 1 + l; x <= centerX + m_brush.brushRange - 1; x++) { EditCell(clickDir, HexGrid.instance.GetCell(new HexCoordinates(x, z)), m_brush); } } for (int l = 1, z = centerZ + 1; z <= centerZ + m_brush.brushRange - 1; l++, z++) { for (int x = centerX - m_brush.brushRange + 1; x <= centerX + m_brush.brushRange - 1 - l; x++) { EditCell(clickDir, HexGrid.instance.GetCell(new HexCoordinates(x, z)), m_brush); } } for (int i = 0; i < m_refreshChunkList.Count; i++) { if (m_brush.m_editorType == EditorType.WaterEditor) { m_refreshChunkList[i].Refresh(MeshClass.waterMesh); m_refreshChunkList[i].Refresh(MeshClass.waterEdgeMesh); } else { m_refreshChunkList[i].Refresh(); m_refreshChunkList[i].sceneObjectMgr.Refresh(); // refreshChunkList[i].sceneObjectMgr.Refresh(refreshCellList); //StartCoroutine(WaitMesh(m_refreshChunkList[i])); } } //将修改后的也压入undo栈中,为压入redo栈做准备 TerrainEditor.UndoAdd(centerCell, m_brush); } }
void RefreshSceneObj(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); m_brush.RefreshTarget(centerCell); List <SceneObjectClass> sceneObjList = new List <SceneObjectClass>(); if (m_brush.SceneObjOperationType == SceneObjBrush.OperationType.Add) { if (m_brush.IsBrushSceneObject)//大量随机 { if (HexMetrics.instance.editorSceneObject == null) { EditorUtility.DisplayDialog("错误", "所编辑的场景物体为空", "确认"); return; } Vector2 max = new Vector2(hit.point.x + 8 * m_brush.brushRange, hit.point.z + 8 * m_brush.brushRange); Vector2 min = new Vector2(hit.point.x - 8 * m_brush.brushRange, hit.point.z - 8 * m_brush.brushRange); float px, pz, py = 0; for (int i = 0; i < m_brush.SceneObjectDensity * m_brush.brushRange; i++) { px = UnityEngine.Random.Range(min.x, max.x); pz = UnityEngine.Random.Range(min.y, max.y); if (Physics.Raycast(new Vector3(px, 35, pz), Vector3.down, out hit)) { if (hit.collider.gameObject.tag != "Mesh") { continue; } py = hit.point.y; } Vector3 tPosition = new Vector3(px, py, pz); centerCell = HexGrid.instance.GetCell(tPosition); if (centerCell.isUnderWaterLevel || centerCell == null) { continue; } GameObject tSceneObject = GameObjectPool.instance.GetPoolChild(HexMetrics.instance.editorSceneObject.name, HexMetrics.instance.editorSceneObject); tSceneObject.transform.SetParent(centerCell.chunkParent.sceneObjectMgr.transform); tSceneObject.transform.position = tPosition; tSceneObject.transform.rotation = Quaternion.Euler(0f, 360f * UnityEngine.Random.value, 0f); tSceneObject.SetActive(true); HexDirection clickDir = HexGrid.instance.GetPointDirection(new Vector2(tPosition.x - centerCell.transform.position.x, tPosition.z - centerCell.transform.position.z)); if (tSceneObject.GetComponent <SceneObjectClass>() == null) { tSceneObject.AddComponent <SceneObjectClass>(); } tSceneObject.GetComponent <SceneObjectClass>().SetInfo(tSceneObject.transform.localPosition, tSceneObject.transform.localRotation, clickDir, centerCell); tSceneObject.GetComponent <SceneObjectClass>().Refresh(true); tSceneObject.AddComponent <BoxCollider>(); tSceneObject.GetComponent <BoxCollider>().size = new Vector3(150, 150, 150); tSceneObject.GetComponent <BoxCollider>().center = new Vector3(0, 150, 0); tSceneObject.tag = "SceneObject"; centerCell.chunkParent.sceneObjectMgr.AddSceneObject(tSceneObject.GetComponent <SceneObjectClass>()); sceneObjList.Add(tSceneObject.GetComponent <SceneObjectClass>()); } } else { if (hit.collider.gameObject.tag == "Mesh") { if (!centerCell.isUnderWaterLevel && centerCell != null) { if (HexMetrics.instance.editorSceneObject == null) { EditorUtility.DisplayDialog("错误", "所编辑的场景物体为空", "确认"); return; } GameObject tSceneObject = GameObjectPool.instance.GetPoolChild(HexMetrics.instance.editorSceneObject.name, HexMetrics.instance.editorSceneObject); tSceneObject.transform.SetParent(centerCell.chunkParent.sceneObjectMgr.transform); tSceneObject.transform.position = new Vector3(hit.point.x, hit.point.y, hit.point.z); tSceneObject.transform.rotation = Quaternion.Euler(0f, 360f * UnityEngine.Random.value, 0f); tSceneObject.SetActive(true); HexDirection clickDir = HexGrid.instance.GetPointDirection(new Vector2(hit.point.x - centerCell.transform.position.x, hit.point.z - centerCell.transform.position.z)); if (tSceneObject.GetComponent <SceneObjectClass>() == null) { tSceneObject.AddComponent <SceneObjectClass>(); } tSceneObject.GetComponent <SceneObjectClass>().SetInfo(tSceneObject.transform.localPosition, tSceneObject.transform.localRotation, clickDir, centerCell, HexMetrics.instance.editorSceneObject.name); tSceneObject.GetComponent <SceneObjectClass>().Refresh(true); tSceneObject.AddComponent <BoxCollider>(); tSceneObject.GetComponent <BoxCollider>().size = new Vector3(150, 150, 150); tSceneObject.GetComponent <BoxCollider>().center = new Vector3(0, 150, 0); tSceneObject.tag = "SceneObject"; centerCell.chunkParent.sceneObjectMgr.AddSceneObject(tSceneObject.GetComponent <SceneObjectClass>()); sceneObjList.Add(tSceneObject.GetComponent <SceneObjectClass>()); } } } } else if (m_brush.SceneObjOperationType == SceneObjBrush.OperationType.Delete) { int centerX = centerCell.coordinates.X; int centerZ = centerCell.coordinates.Z; if (m_brush.IsBrushSceneObject && m_brush.SceneObjOperationType == SceneObjBrush.OperationType.Delete) { for (int l = 0, z = centerZ; z >= centerZ - m_brush.brushRange + 1; l++, z--) { for (int x = centerX - m_brush.brushRange + 1 + l; x <= centerX + m_brush.brushRange - 1; x++) { HexCell cell = HexGrid.instance.GetCell(new HexCoordinates(x, z)); cell.chunkParent.sceneObjectMgr.MinusSceneObject(cell, sceneObjList); } } for (int l = 1, z = centerZ + 1; z <= centerZ + m_brush.brushRange - 1; l++, z++) { for (int x = centerX - m_brush.brushRange + 1; x <= centerX + m_brush.brushRange - 1 - l; x++) { HexCell cell = HexGrid.instance.GetCell(new HexCoordinates(x, z)); cell.chunkParent.sceneObjectMgr.MinusSceneObject(cell, sceneObjList); } } } else { if (hit.collider.gameObject.tag == "SceneObject") { hit.collider.gameObject.GetComponent <SceneObjectClass>().cell.chunkParent.sceneObjectMgr.MinusSceneObject(hit.collider.gameObject.GetComponent <SceneObjectClass>()); } } } TerrainEditor.redoStack.Clear(); TerrainEditor.UndoAdd(m_brush.SceneObjOperationType, sceneObjList); TerrainEditor.UndoAdd((SceneObjBrush.OperationType)(1 - (int)m_brush.SceneObjOperationType), sceneObjList); } }