Beispiel #1
0
    //刷新地形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);
        }
    }
Beispiel #2
0
    //刷新地形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);
        }
    }
Beispiel #3
0
    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);
        }
    }