Map tool 구현6 - undo

ㅋㅋ·2022년 9월 15일
0

유니티 엔진 2021.3.9f1 버전에서는 맵 아이템을 그린 후 undo 시 에디터 crash 발생
유니티 엔진 2021.3.6f1 버전에서는 정상 작동


Tool Window class

private void Paint(Vector2Int cellPos)
{
    ...
    {
        ...
        Undo.DestroyObjectImmediate(targetGrid.GetItem(cellPos).gameObject);
        ...
    }

    ...

    Undo.RegisterCreatedObjectUndo(target.gameObject, "Create map object");

    ...
}

private void Erase(Vector2Int cellPos)
{
    if (targetGrid.IsItemExist(cellPos))
    {
 		...
 		Undo.DestroyObjectImmediate(targetGrid.GetItem(cellPos).gameObject);
        ...
    }
}

오브젝트가 만들어지고 삭제되는 부분들을 Undo 함수로 교체하여

유니티의 Undo 시스템에 등록하여야 한다.


private void OnEnable()
{
    ...

    Undo.undoRedoPerformed -= OnUndoRedoPerformed;
    Undo.undoRedoPerformed += OnUndoRedoPerformed;
}

private void OnUndoRedoPerformed()
{
    targetGrid.RetrieveAll();
}

OnEnable에서 undoRedoPerformed에 undo 시 실행할 이벤트 함수를 등록


Custom Grid class

public void RetrieveAll()
{
    Items.Clear();

    var mapObjects = FindObjectsOfType<MapObejct>();
    if (mapObjects == null)
    {
    	return;
    }
    
    for (int i = 0; i < mapObjects.Length; i++)
    {
        Items.Add(mapObjects[i].cellPos, mapObjects[i]);
    }
}

CustomGrid 클래스에서는 undo가 발생하면 dictionary를 비우고 다시 새롭게 입력

0개의 댓글