본문 바로가기
개발/Unity

[Unity] hierarchy 창에서 선택한 오브젝트 선택 유지하기

by 가리봉맨 2019. 6. 28.
반응형

유니티 에디터 확장에 관한 포스팅이다. 아트 팀에서 Vertex Tools Pro라는 툴을 사용하고 있다. 아티스트의 작업 방법은 다음과 같다. 먼저 hierarchy 창에서 MeshRenderer 컴포넌트가 포함된 오브젝트를 선택한다. 그러면 Scene 뷰에 brush가 나타나는데 이를 이용해서 매쉬의 vertex color를 칠한다. 그런데 작업 중 실수로 다른 오브젝트를 선택하는 일이 종종 일어난다는 것이다. 아트 팀에서는 페인팅 작업 중에 hierarchy 창에서 다른 오브젝트를 클릭해도 선택(selection)이 되지 않도록 해달라고 했다. 구글링으로 다음 링크와 같은 해결책을 찾았다.

https://forum.unity.com/threads/keeping-an-object-selected-in-the-hierarchy-help.210114/#post-1414054

[ 포스팅에 그림이 한 장도 없으니 블로그 첫 화면이 허전해서 넣음 ]


팀 프로젝트에 맞게 적절히 수정했더니 잘 작동했다. 로직은 아주 간단하다. 먼저 OnGui()에서 Toggle 버튼을 하나 만든다. Toggle 버튼이 체크됐다면 다른 오브젝트가 선택되는 즉시 OnSceneGUI()에서 이전에 선택된 오브젝트로 되돌려 놓는다.

그런데 이 방법으로는 오브젝트를 하나 밖에 선택할 수 없었다. UnityEditor.Selection 클래스 명세를 살펴봤다. 선택된 오브젝트들을 모두 담고 있는 GameObject[] gameObjects라는 멤버 변수가 있었다. 그런데 프로퍼티로 제공되는 이 변수는 get만 제공하고 set이 없다. 다시 살펴보니 UnityEngine.Object[] objects가 있었다. 이 멤버 변수는 get; set; 을 모두 제공한다. 대략 다음과 같이 코드를 수정했다.

Object[] mySelections;

void OnSceneGUI ( SceneView sceneView ) {
    if (Selection.transforms.Length >= 1)
    {
    	Selection.objects = mySelections;
    }
    ...

void OnGUI () {
    if (Selection.transforms.Length >= 1)
    {
        mySelections = new Object[Selection.objects.Length];
        System.Array.Copy(Selection.objects, mySelections,  Selection.objects.Length);
    }
    ...

이제 hierarchy 창에서 여러 오브젝트를 선택해도 잘 작동한다. 끝.

반응형

댓글