Unity의 GameView에 좋아하는 이미지 탑재 확장을 만들었다

안녕하세요!
이번, 약간의 Unity의 확장 기능을 만들었으므로 소개합니다.

만든 것



Unity의 GameWindow에 좋아하는 이미지를 겹칠 수 있는 기능입니다.


위 이미지처럼 드래그 앤 드롭으로
GameView의 표시에 딱 맞도록 해
수중이 좋아하는 이미지가 겹쳐져
투명도를 변경하여 각 이미지를 볼 수 있습니다.
미리 GameView의 크기를 이미지의 종횡비와 일치시켜야 합니다.

왜 만들었어?



개발을 할 때 UI의 임시 배치를 할 때 맞는 것이 필요합니다.
지금까지는
1. UI 디자인 이미지 가져오기
2. 새롭게 Image 객체를 만든다
3. 크기와 위치, 표시 순서 등 조정
4. UI 이미지 연결
5. 알파 바꾸면서 이미지 보고 조정
6. 다른 아스비로 해도 괜찮거나 3-4를 반복한다
7. 더 이상 필요하지 않은 이미지와 GameObject 삭제
8. 끝!
내가하고 있었지만이 방법으로 많은 수의
임시 이미지를 가득 채우거나 불필요한 GameObject를 남기거나
불편했습니다.

그래서 이번 기능을 만들어 보았습니다.
이것으로
1. Window 열기
2. 이미지 드래그 앤 드롭
3. 알파 바꾸면서 이미지 보고 조정한다
4. 다른 아스비로 해도 괜찮거나 2-3을 반복한다
5. 끝!
느낌으로 그렇게 번거롭지 않고 프로젝트를 더럽히지 않고
확인할 수 있습니다.

사용법


  • GameView를 표시합니다. 표시하지 않으면 움직이지 않습니다. 이유는 후술
  • ImageOverlapWindow를 엽니다.
  • Window가 나오므로 자신이 좋아하는 이미지를 드래그 앤 드롭으로 페쵸합니다. (어른의 사정으로 PNG 밖에 대응할 수 없습니다
  • 아래로 스크롤하면 수상한 슬라이더가 나오므로 움직이면 투명도가 바뀝니다.
  • GameView와 같은 크기로 추종하므로 체크 박스로 전환됩니다.
  • 끝!

  • * 미리 GameView의 크기를 이미지의 종횡비와 맞추어 둘 필요가 있습니다.

    내부 구현 정보


        RenderTexture GetGameTexture()
        {
            var gameMainView = GetMainGameView();
            if (gameMainView == null)
            {
                return null;
            }
    
            var t = System.Type.GetType("UnityEditor.GameView,UnityEditor");
            if (t == null) return null;
            var renderTexture = t.GetField("m_TargetTexture",
                BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField | BindingFlags.FlattenHierarchy |
                BindingFlags.SetField);
            if (renderTexture == null)
            {
                return null;
            }
    
            return (RenderTexture) renderTexture.GetValue(gameMainView);
    
        }
    
        public static EditorWindow GetMainGameView()
        {
            var t = System.Type.GetType("UnityEditor.GameView,UnityEditor");
            if (t == null) return null;
            var getMainGameView = t.GetMethod("GetMainGameView", BindingFlags.NonPublic | BindingFlags.Static);
            if (getMainGameView == null) return null;
            var res = getMainGameView.Invoke(null, null) ?? GetWindow(t);
            return (EditorWindow)res;
    
        }
    

    위와 같이 Reflection에서 얻어 GameView의 RenderTexture를 무리하게 집어 와서 표시하고 있습니다.
    리플렉션으로 GameView를 내고있는 Window를 취득하고
    그 중의 RenderTexture를 취득하고 있는 느낌이 됩니다.
    따라서 탭 전환 등으로 GameView가 숨겨지면 표시가 업데이트되지 않습니다.

    또한 OS에 따라 UV가 반전되기 때문에
    셰이더로 그 근처에 다시 두 장 합성하여 표시하고 있습니다.
    전체 코드는 여기에서 DL 할 수 있습니다.

    반향



    사내에서 디자이너가 UI 배치 조정을하고 있기 때문에
    이 툴을 이용해 꽤 편하게 배치할 수 있는 것 같습니다.
    만들어서 좋았다! 생각합니다.
    패키지로 원하는 사람은 이쪽

    *화상을 거듭할 때에 전용의 쉐이더를 이용하고 있으므로 그쪽도 필요하게 됩니다

    참고로 한 사이트
    htp // d. 하테나. 네. jp/신리요/20140807/p2

    좋은 웹페이지 즐겨찾기