Search Unity

Spotlight Team은 열정이 넘치는 유니티 개발자들과 함께 유니티 기반 게임의 지평을 넓히고자 합니다. 그 과정 속에서 그래픽, 성능, 디자인과 관련된 복잡한 문제를 해결할 수 있는 혁신적인 아이디어를 모색하는 가운데, 똑같은 문제와 해결책을 몇 번이고 반복해서 경험하기도 합니다.

이 블로그 시리즈는 저희 팀이 클라이언트와 작업을 진행하며 가장 자주 경험하는 문제들을 다룹니다. 지금껏 유능한 팀들과 협업하는 과정에서 겪은 시행착오를 통해 얻어낸 결과를 모든 분들께 공유할 수 있어 뿌듯함과 기쁨을 느낍니다.

여기에서 소개하는 문제들 중 다수는 콘솔이나 휴대폰에서 게임을 테스트하거나 방대한 양의 게임 콘텐츠를 다루어 보아야만 비로소 발견하게 되는 문제입니다. 저희가 발견한 문제와 해결책을 개발 초기 단계부터 참고한다면, 시간과 열정을 들인 만큼 값진 성과를 거둘 수 있을 것입니다.

오브젝트 이동과 관리를 더욱 용이하게

오브젝트 이동은 유니티에서 가장 흔히 이용하는 기능이지만, 많은 팀이 이 기능을 효과적으로 활용하는 데 어려움을 겪습니다. 특히, 오브젝트를 적절히 배치하여 캐릭터를 월드에 위치시키고, 경로를 알맞게 구축하고, 각각의 물리 오브젝트를 조화롭게 배치하는 것은 쉽지 않을 것입니다.

유니티는 이러한 작업을 용이하게 해주는 몇 가지 도구를 제공하며, 각각의 도구는 서로 다른 역할을 합니다. 일관성이 필요한 다수의 콘텐츠를 제작하거나 위와 같이 동적 물리 오브젝트가 빼곡히 들어찬 씬을 구성하기 위해서는 각 도구의 기능을 필히 숙지해야 합니다.

작업에 적합한 기즈모 사용

유니티는 이동(Translation), 회전(Rotation), 스케일링(Scaling) 도구를 제공하며 2017.3 버전부터는 이 세 가지 기능을 합친 유니버설 도구를 제공합니다. 이러한 각각의 기즈모를 활용하여 게임 오브젝트의 변환(transform) 프로퍼티를 3D 수준에서 변형할 수 있습니다. 또한, 사각 트랜스폼(Rect Transform) 도구를 사용하면 2D로도 작업이 가능합니다.

각각의 기즈모에는 모드 토글이 딸려 있습니다. 기즈모를 ‘중앙 정렬(Center)’로 설정하면 오브젝트의 경계면을 기준으로 산출한 중심부가 작업 기준이 됩니다. 이 중앙값은 근사치이므로, 복잡한 오브젝트의 경우에는 중심에서 다소 벗어나 보일 수도 있습니다. 기즈모를 ‘피벗(Pivot)’으로 설정하면 오브젝트 자체 레퍼런스 프레임의 (0,0,0) 지점이 작업 기준이 됩니다. 피벗 포인트는 에셋을 처음으로 생성한 사용자가 작업하기 용이한 지점으로 설정되어 있을 수 있습니다. 일반적으로 오브젝트 각각의 상대적인 위치를 기반으로 정렬할 때에는 피벗 모드에서 작업하되, 에셋을 생성할 때 해당 피벗 위치를 항상 염두에 두는 것이 좋습니다. 두 번째 토글은 ‘전역/로컬(Global/Local)’로, 작업 공간을 설정하는 기능입니다. ‘전역’으로 설정하면 기즈모가 월드의 (x,y,z) 축을 기준으로 정렬되며, ‘로컬’로 설정하면 오브젝트 자체의 (x,y,z) 축이 기준이 됩니다. 제 경우에는 ‘로컬’ 공간에서 대부분의 작업을 진행합니다. 하지만, 오브젝트의 상대적인 위치를 기준으로 다수의 오브젝트를 알맞게 정렬하려 할 때는 종종 ‘전역’ 좌표를 기준으로 하는 그리드 스냅 기능도 활용합니다.

스냅 기능

유니티에서 가장 직관적인 위치 설정 도구는 그리드 스냅 기능으로, Windows에서는 CTRL 키, OSX에서는 Command 키를 길게 누르고 있으면 해당 기능이 활성화됩니다. 축 핸들(적색, 청색, 녹색 기즈모)을 드래그하여 오브젝트를 이동할 때 이러한 스내핑 키를 누르고 있으면 현재 설정된 그리드 크기에 따라 오브젝트가 맞춰지며, 원하는 경우 그리드 크기도 변경할 수 있습니다.

스냅 설정(Snap Settings) 메뉴를 사용하면 그리드 크기에 따라 축 값을 설정할 수 있으며, 이에 따라 회전 및 스케일에도 스내핑을 사용할 수 있습니다. 또한, 오브젝트의 현재 변환 지점을 가장 가까운 그리드 라인과 일치시켜 줄 수도 있습니다.

‘모든 축 스냅(Snap All Axes)’ 버튼은 임의의 콘텐츠를 정렬하는 데 특히 유용합니다. 여러 오브젝트를 선택하고 모든 축의 그리드를 기준으로 스내핑 한 다음, 완벽하게 정렬하도록 위치를 재설정할 수 있습니다. 다음 예시를 참고하세요.

이러한 기능은 일반 지오메트리, 대규모 레벨의 레이아웃, 그리고 충돌하는 블록 배치 시 유용합니다. 더욱 복잡한 오브젝트 배치의 경우에는 다음 내용을 참조하세요.

버텍스 스내핑

버텍스 스내핑

 

V 키를 길게 누르면 변환(Transform) 기즈모가 버텍스 스내핑 모드로 전환되며, 작은 정사각형 형태로 표시됩니다. 그런 다음 선택한 오브젝트 메시의 버텍스를 클릭하고, 포인터 아래 원하는 버텍스로 드래그하여 스내핑할 수 있습니다. 이 기능은 특히 복잡하거나 존재하지 않는 충돌이 있는 임의의 메시를 정렬하는 데 유용합니다. 위 동영상에서 전선이나 램프에는 조밀한 충돌 메시가 없으며, 정육면체와 유사한 형태도 아니므로 그리드 스내핑 또는 충돌 스내핑으로는 배치하기가 어렵습니다.

버텍스 스내핑 모드를 활성화하면 다수의 게임 오브젝트를 이러한 방식으로 배치할 수 있습니다. 해당 모드는 Ctrl+Shift+V로 활성화하고 Ctrl+V로 비활성화할 수 있습니다. 이렇게 하면 작업하는 내내 V 키를 누르고 있지 않아도 버텍스 스내핑 기능을 활용할 수 있습니다.

충돌 스내핑

CTRL + SHIFT 키를 길게 누르고 있으면 충돌(Collision) 스내핑 기능이 활성화됩니다. 그런 다음 축 조정 핸들 대신 변환(Transform) 기즈모 중앙에 있는 노란색 정사각형을 클릭하여 드래그합니다. 이렇게 하면 선택된 오브젝트가 자신의 충돌을 커서 위치에 있는 충돌과 정렬하게 됩니다.

정적 지오메트리에는 버텍스 스내핑 또는 그리드 스내핑 기능을 사용하여 메시를 정렬하는 방식이 적합하지만, 접촉했을 때 서로 관통하며 공간으로 이동하는 동적 오브젝트의 경우에는 눈에 보이는 메시가 아닌 메시 주변의 콜라이더를 기준으로 스내핑할 수 있습니다.

충돌 안정화

동적 물리 오브젝트가 많거나 조인트 시스템이 복잡한 경우, 충돌 스내핑 기능을 사용하면 모든 물리 반응을 온전히 구현하기 어려울 수 있습니다. 다행히도, 이제는 에디터에서 피즈엑스(PhysX)를 실행할 수 있어 이와 같은 어려움을 극복할 수 있습니다. PhysX를 실행하여 물리 반응이 중지될 때까지 몇 초간 게임 시뮬레이션을 진행한 다음, 그 위치를 저장하면 됩니다.

여기를 클릭하면 디버그 드로잉 및 메뉴 아이템을 비롯하여 상세한 코멘트가 첨부된 예제 코드를 확인하실 수 있습니다. 프로젝트에서 “에디터(Editor)” 폴더에 해당 파일을 붙여 넣으면 게임 메뉴(GameMenu)->물리 안정화(Settle Physics)라는 메뉴 항목이 생성됩니다.

그리드, 버텍스 스내핑, 충돌 스내핑 기능을 사용해야 하는 경우와 그 이유를 이해하려면 많이 경험해봐야 합니다. 이러한 도구를 비롯하여 피벗/중앙 정렬 및 전역/로컬 토글을 다양하게 사용해 보고 콘텐츠와 상황에 적절한 도구를 찾으세요. 오브젝트를 효율적으로 정렬할 수 있으면 그만큼 더욱 혁신적이고 생산적인 작업에 시간을 투자할 수 있습니다. 마지막으로, 이번 포스팅에서 예제를 사용하도록 흔쾌히 허락해 주신 Campo Santo 팀에 감사의 말씀을 전합니다.

9 코멘트

코멘트 구독

댓글 남기기

사용할 수 있는 HTML 태그 및 속성: <a href=""> <b> <code> <pre>

  1. To anyone struggling with Unity’s gizmo especially when placing colliders, I am currently developing a plugin for Unity, that intoduces blender’s gizmo into the Unity’s editor. It basically allows you to positions objects and collisions at least three to five time faster than with the standard Unity tools. Everything the author talked about in this post (local space / global space, pivot / custom pivot, vertex snapping) is present, but it is augmented with things like the ability to only move/rotate/scale (and vertex snap) the object on X axis (global/local) and around a custom 3d cursor/pivot. Did you know you can vertex snap when rotating objects? And when scaling? And that it’s super useful (esp. with colliders)? With my plugin you can!

    The plugin is ready and I will soon post a video on my YouTube channel about it: https://www.youtube.com/user/cubrman/videos?view=0&sort=dd&view_as=subscriber&shelf_id=0 or you can just watch any blender video to get an idea of how their gizmo works.

    If you want to try a beta version of the plugin, contact me at cubrman [at] gmail [dot] com

  2. the physics settler is simple yet great & has many useful tips & tricks to use, Thx for sharing

  3. I am sorry but this is not a “best practice” post, there is only one way to use the tool therefore is a tutorial.
    Could you please keep this series of posts focused on more advanced topics?

    1. William Armstrong

      1월 4, 2018 8:04 오후 응답

      Thank you for your feedback. This post is, certainly, mostly tutorial and information sharing in nature.

      Make sure to take a look at the Physics Settler example code, https://drive.google.com/file/d/1a-aHTP_c2vNk0VBLHbYqVNwIxCZIHjof/view?usp=sharing . I see many users struggling with the best way to hook their own code into the Editor update loop. If this is basic information for you, you have been paying very close attention here, so keep up the good work.

      1. That Collision Settling script is pure gold :D Thank you for it!

        Earlier Spotlights ended with two cliffhangers:

        “We will be back next time with lessons learned working with Realtime Global Illumination and multi-scene editing.”

        and

        “Our next blog will be a little bit different. We will be sharing several small editor tools written in-house that will hopefully improve your productivity and show you how to customize Unity yourself.”

        Are those posts still in works, or did I miss something?

  4. Cool deal. Why not use the same key to toggle the vert snap mode on and off? Why use a key that’s already used for “paste”? Or is that Ctrl on mac and Alt on windows?

    1. William Armstrong

      1월 4, 2018 7:57 오후 응답

      Turns out you can just hit V to toggle off and Shift+V to toggle on. I have been stressing my little finger out for no reason!

  5. Thanks for the excellent post.

    Would the new Physx Editor support allow you to pre-settle cloth objects?

    Several years (and Unity versions) ago, I attempted to write my own tool that would do this. I got the cloth to simulate successfully in Editor, and the resulting settled cloth states to save as part of the scene. But the tension values for the cloth vertices were never successfully saved. As a result, the cloth wouldn’t behave correctly at runtime. The cloth would always sag a bit more when the game started.

    Since then, there’s been a new Physx version, and all the Unity cloth code has been written, I believe. Maybe things are different now!

    So, would the physics settling example at the bottom of this post also allow you to settle and save cloth the same as Rigidbodies?

    Thanks for any info.

    1. William Armstrong

      1월 4, 2018 7:59 오후 응답

      Cloth is updated separately from the new Physics.Simulate call. This solution won’t work for Cloth pre-settling. I will ask our Physics team about best practices there. Thanks for the question!