Map tool 구현2

ㅋㅋ·2022년 9월 15일
0

Custom grid class

public Vector2Int GetCellPos(Vector3 worldPos)
{
    return new Vector2Int(Mathf.FloorToInt(worldPos.x / config.CellSize.x), Mathf.FloorToInt(worldPos.y / config.CellSize.y));
}

마우스 위치 값을 통해 현재 그리드의 위치를 알 수 있도록

월드 좌표를 그리드 좌표로 계산하여 반환하는 함수


Tool window class

private void OnEnable()
{
    ...

    SceneView.duringSceneGui -= OnScencGUI;
    SceneView.duringSceneGui += OnScencGUI;
}

private void OnScencGUI(SceneView obj)
{
    var mousePos = Event.current.mousePosition;
    var ray = HandleUtility.GUIPointToWorldRay(mousePos);

    EditorHelper.Raycast(ray.origin, ray.origin + ray.direction * 300, out var hitPos);
}

Tool window enable 시 씬 이벤트 함수를 등록

씬 뷰에서 마우스가 이동할 때 이벤트가 발생하고,

마우스 위치를 통해 레이캐스팅하여 z가 0인 평면의 위치값 계산


private CustomGrid BuildGrid(Vector2Int cellCount, Vector2Int cellSize)
{
    ...

    var grid = new GameObject("Grid").AddComponent<CustomGrid>();

    grid.config = new CustomGridConfig();
    grid.config.CellCount = cellCount;
    grid.config.CellSize = cellSize;

    return grid;
}

DrawCreateMode 함수에서 그리드의 cell count 와 size를 Vector2IntField 함수를 통하여 받고,

생성 버튼을 누를 시 해당 정보를 통해 씬에 grid를 추가하도록 구현

버튼을 누를 시 멤버 변수로 grid를 저장해두고, 모드를 edit 모드로 전환


public enum EditToolMode
{
    Paint,
    Erase,
}

edit 모드 시에 사용할 툴들을 enum으로 정의

public EditToolMode selectedEditToolMode = EditToolMode.Paint;
public GUIContent[] editToolModeContents;

그리고 멤버 변수에 mode와 GUIContent 배열을 선언한다.

private void OnEnable()
{
    editToolModeContents = new GUIContent[]
    {
        EditorGUIUtility.TrIconContent("Grid.PaintTool", "Paint mode"),
        EditorGUIUtility.TrIconContent("Grid.EraserTool", "Erase mode")
    };
    
	...
}

OnEnable 시 icon 콘텐트를 저장


void DrawEditMode()
{
    GUILayout.BeginHorizontal(EditorStyles.toolbar);
    {
        if (GUILayout.Button("create mode", EditorStyles.toolbarButton))
        {
            ClearAll();
            ChangeMode(EditMode.Create);
        }
    }
    GUILayout.EndHorizontal();

    GUILayout.BeginHorizontal();
    {
        GUILayout.FlexibleSpace();
        selectedEditToolMode = (EditToolMode) GUILayout.Toolbar((int)selectedEditToolMode, editToolModeContents, "LargeButton", GUILayout.Width(100), GUILayout.Height(40));
        GUILayout.FlexibleSpace();
    }
    GUILayout.EndHorizontal();
}

DrawEditMode 함수에서는 생성 모드로 돌아갈 수 있도록 하는 버튼과

툴들을 선택할 수 있도록 하는 버튼들을 보여줄 수 있도록 한다.

0개의 댓글