프로토타입부터 교육용 애플리케이션, Digital Twins, 인간-기계 인터페이스, 제품 구성 도구에 이르기까지, Unity Industry를 통해 개발하고 출시할 수 있는 애플리케이션의 종류에는 거의 제한이 없습니다.
귀사의 조직에서 Unity를 어떻게 활용할 수 있을지 궁금하신가요? 아니면 신규 구독자이시거나, 기술을 한 단계 더 발전시키고자 하는 숙련된 Unity Industry 개발자이신가요? 에디터를 처음 실행하는 초보자이든, 이미 여러 프로젝트를 성공적으로 출시한 베테랑 개발자이든, Unity의 강력한 기능을 가장 효율적으로 활용하는 방법을 익히는 것은 언제나 유용합니다. 이를 통해 일상적인 작업 효율을 극대화하고, 작업 과정을 더욱 즐겁게 만들 수 있습니다.
CAD-3D 변환, 반응형 UI, 코드 아키텍처 등을 통해 생산성을 높이세요
이 가이드는 Unity Industry 개발자를 위한 새로운 에디터 내 학습 템플릿인 ‘Unity Industry Fundamentals’ 템플릿에 대한 개요를 제공합니다.

‘Industry Fundamentals’ 템플릿은 Unity Industry 구독자 또는 30일 무료 체험 이용자가 Unity Hub에서 이용할 수 있습니다.
‘산업 기초’의 주요 내용
일련의 튜토리얼을 통해 ‘Unity Industry Fundamentals’ 템플릿은 Unity Industry 프로젝트에서 다음과 같은 주요 기능을 구현하는 단계를 안내합니다:
- Asset Transformer Toolkit을 사용하여 CAD 데이터를 실시간 산업 프로젝트에서 바로 사용할 수 있는 3D 자산으로 변환하고 최적화하는 방법
- HMI를 구축하고 UI를 실시간 데이터와 연결하는 방법
- 자동 및 수동 탐색을 모두 지원하는 탐색 시스템을 구현하는 방법
- 복잡하고 방대한 환경의 시뮬레이션에서 유저가 항상 필요한 화면을 볼 수 있도록 가상 카메라를 설정하는 방법
- ScriptableObjects를 사용하여 로봇의 동작, 상태 관리 및 데이터 흐름을 처리하는 C# 스크립트를 설계하여 데이터 계층을 분리하는 방법
‘Industry Fundamentals’의 목표는 여러분의 Unity 개발 경험을 더욱 효율적이고 집중적이며 생산적으로 만드는 데 도움을 드리는 것입니다. 여기서 얻게 될 팁들은 인간-기계 인터페이스(HMI), 교육 시뮬레이션, Digital Twins, 제품 구성 도구 등 다양한 유형의 실시간 3D 산업용 애플리케이션에 폭넓게 적용될 수 있습니다.
‘업계 기초’ 템플릿 다운로드
시작하기 전에, 아직 템플릿을 찾거나 다운로드하지 않으셨다면 다음 단계를 따라 진행해 주세요.
Unity Industry 구독자이신 경우:
1. Unity Hub를 열고 Unity 6.4로 업데이트하세요
2. 새 프로젝트를 생성한 다음 ‘산업 기초’를 검색하거나, ‘학습’ 카테고리로 이동하여 해당 템플릿을 선택하세요.
Unity Industry 구독이 없는 경우:
1. 무료 체험 페이지로이동하여 안내에 따라 무료 체험을 신청하세요.
2. 체험판 사용 기간이 시작되면, ‘Industry’ 구독자와 동일한 절차를 따르십시오.
자유롭게 살펴보고 수정할 수 있는 템플릿

창고의 미니맵이 표시된 자동 모드의 대시보드 UI
이 템플릿은 3D 인터랙티브 산업용 애플리케이션을 제작하는 데 필요한 워크플로우와 단계를 안내하는 4개의 튜토리얼로 구성되어 있습니다. Unity 에디터에서 프로젝트를 열면, ‘Scenes’ 폴더 안에 ‘Warehouse’라는 이름의 완성된 씬을 찾을 수 있습니다. 이 장면은 바닥 곳곳에 여러 대의 로봇이 배치되어 인벤토리를 출고, 입고 및 이동할 준비가 되어 있는, 완벽하게 구축된 창고 환경입니다.
이 데모 씬은 신속한 프로토타이핑을 위해 설계되었습니다. 직접 만든 3D 모델을 씬으로 드래그 앤 드롭하고, 구성 요소 하나를 연결하기만 하면 모든 것이 자동으로 연결됩니다. 해당 자산이 UI에 표시되면 즉시 자율 로봇처럼 작동하여 환경을 이동하고 UI의 입출력에 반응하게 됩니다.
‘게임’ 뷰를 열고 ‘플레이’ 모드로 진입한 후, 각 로봇을 제어하고 모니터링할 수 있는 UI를 통해 시뮬레이션된 창고 내에서 상호작용을 시작하세요. 이 UI에서는 로봇의 배터리 잔량 및 상태와 같은 실시간 데이터가 표시됩니다. 이 UI에는 로봇들이 현재 어디에 있는지 보여주는 축소 지도가 제공됩니다. 또한 자동 모드에서 수동 모드로 전환하여 일부 로봇 설정을 수동으로 변경할 수 있으며, WASD 키를 사용하여 각 로봇의 움직임을 제어할 수 있습니다. 각 로봇의 속도를 조절하고, 슬라이더를 사용하여 ARM의 길이를 늘리거나 줄이세요.
이 창고 시뮬레이션의 주요 기능을 살펴보겠습니다.
영상 보기: 시작하기

자산 변환 툴킷: CAD에서 최적화된 3D 자산으로

‘산업 기초’ 템플릿의 메인 창고 예시 장면에 포함된 로봇 3D 모델 중 하나
CAD 소프트웨어는 모델에서 수학적 정확성과 기하학적 세부 묘사를 최우선으로 하는 반면, 실시간 애플리케이션은 시각적 품질과 관리 가능한 폴리곤 수, 효율적인 텍스처 샘플링, 컬링 및 일괄 처리가 가능한 계층 구조와 같은 실용적인 성능 요소를 균형 있게 고려해야 합니다.
Unity Industry 라이선스에 포함된 Unity Asset Transformer Toolkit은 귀사의 CAD 데이터와 Unity 프로젝트 간의 가교 역할을 합니다. 자동화된 데이터 전처리 워크플로를 통해 기존 데이터를 Unity와 원활하게 연동하여 시간과 노력을 절약해 줍니다. 모든 종류의 3D 또는 CAD 파일을 가져올 수 있으며, 여러 번의 가져오기 작업이나 모델 재작성 과정을 생략할 수 있습니다. 또한 메쉬 크기와 품질을 완벽하게 제어하여 대상 기기에서 최적의 성능을 발휘하도록 데이터를 최적화할 수 있습니다.
‘산업 기초’ 예제에서는 Unity에 새로운 로봇 에셋을 가져오는 방법을 확인할 수 있습니다. 원본 CAD 파일을 기반으로 한 이 로봇 모델은 완성도가 낮아 세련된 프레젠테이션에 적합하지 않은 무거운 자산입니다. Asset Transformer Toolkit은 데스크톱 및 웹과 같은 플랫폼에 적합한 대화형 3D 애플리케이션에서 사용할 수 있도록 모델을 변환하고 최적화하는 데 사용됩니다.
에디터에서 Asset Transformer Toolkit을 설치하고 실행하는 방법은 이 섹션 마지막에 있는 동영상을 참고하세요.
먼저 도구 모음을 살펴보겠습니다.
Asset Transformer Toolkit 도구 모음 살펴보기

Asset Transformer 툴킷용 툴박스
다음은 도구 모음에서 사용할 수 있는 기능에 대한 간략한 설명입니다:
- 수입 모델: 여기를 클릭하여 CAD 데이터를 Unity로 가져오는 과정을 시작하세요.
- 메시 생성 및 최적화: 이 기능을 사용하여 지오메트리를 간소화하고 구멍이나 내부 면과 같은 불필요한 세부 요소를 제거하세요.
- 리메시: 이 기능을 사용하면 고성능이 요구되는 환경에서 지오메트리를 완전히 재구축할 수 있습니다.
- 계층 구조: 이 기능을 사용하여 CAD 어셈블리에서 가져온 복잡한 객체 구조를 정리하십시오.
- 변환: 모델의 피벗 포인트와 정렬 문제를 신속하게 수정하세요.
- 자외선과 충돌기: 이 설정들을 사용하여 Unity에서 텍스처링 및 물리 기반 상호 작용에 필요한 데이터를 생성할 수 있습니다.
가져올 때 모델 설정 및 수정 사항 유지
이 가이드에서는 가져오기 과정을 자세히 다루지 않습니다. 편집기 내 튜토리얼과 이 섹션 마지막에 있는 동영상을 통해 모든 중요한 단계를 단계별로 안내해 드립니다.
여기서 강조할 점은, 가져올 파일을 선택하면 프로젝트 창의 Assets 폴더 내에 모델과 동일한 이름의 ScriptableObject가 생성된다는 것입니다.
이것은 실제 모델이 아닙니다. 여기서 장점은 ScriptableObject에 모델을 불러오는 데 사용할 수 있는 설정 모음이 포함되어 있어, 모델의 설정과 수정 내용을 그대로 유지할 수 있다는 점입니다. CAD 모델에 변경 사항이 생겨 다시 가져와야 할 경우, 모든 설정을 처음부터 다시 할 필요가 없습니다. 이러한 모든 설정은 ScriptableObject에 저장됩니다.

가져올 파일을 선택하면, 프로젝트 창의 Assets 폴더에 모델과 동일한 이름을 가진 ScriptableObject가 생성됩니다. 이 ScriptableObject에는 모델을 가져올 때 사용할 수 있는 설정 모음이 포함되어 있어, 모델의 설정과 수정 내용을 그대로 유지할 수 있습니다.
ScriptableObject를 선택하면 인스펙터 창이 열리는데, 상단에 있는 ‘임포트 모드’ 필드를 ‘프리팹’ 또는 ‘씬’으로 설정할 수 있습니다:
- 조립식: 단일 객체의 경우
- 장면: 수천 개, 심지어 수백만 개의 오브젝트로 구성된 고층 빌딩과 같이 매우 크고 정교한 에셋의 경우
검사기에는 다음 세 가지 탭이 제공됩니다: 모델, 규칙 엔진 및 LOD:
- 모델: 여기에서 모델 가져오기 매개변수를 설정할 수 있습니다. 이 단계에서는 원본 소스 모델을 최적화된 3D 자산으로 변환합니다.
- Rule Engine: 데이터 수집 단계에서 바로 모델의 데이터 전처리 작업을 자동화할 수 있는 규칙 세트를 정의하세요. 규칙 세트는 소스 모델이 변경될 때마다 이를 다시 가져와야 할 때 특히 유용합니다. 규칙 엔진과 규칙 세트에 대한 소개는 다음 섹션을 참조하십시오.
- LOD: LOD를 생성하려면 LOD 규칙을 추가하십시오. 이 규칙들은 모델 가져오기 과정의 마지막 단계에서 직접 생성할 수 있습니다.
설정이 완료되면 ‘가져오기’를 클릭하면 모델 프리팹이 프로젝트 뷰의 Assets > 3DModels 폴더에 추가됩니다. 모델을 씬 뷰로 드래그 앤 드롭하면, 해당 모델이 계층 구조에도 추가됩니다.
영상 보기: Unity Asset Transformer Toolkit 설치하기

3D 에셋 최적화
Asset Transformer Toolkit은 가져온 모델을 정리하여 시각적 충실도와 필요한 메타데이터를 유지한 채 실시간 환경에 적합하도록 준비하는 도구를 제공합니다. 이는 앞서 언급한 규칙 세트를 사용하여 가져오기 과정에서 자동으로 수행하거나, 가져오기 후 자산 변환기 도구 모음의 도구를 사용하여 개별 작업으로 수동으로 수행할 수 있습니다.
계층 구조 정리하기
템플릿에서 새로운 로봇 에셋을 가져오는 단계를 따라가 보면, 히에라르키(Hierarchy) 내의 구조가 지나치게 복잡하다는 것을 알 수 있습니다. ‘body_body_main_01-1’이라는 GameObject와 같은 기본 요소 중 하나를 클릭하면, 인스펙터에서 해당 부품과 관련된 모든 메타데이터가 컴포넌트로 추가된 것을 확인할 수 있습니다. 그러나 그 자식 객체에는 실제 지오메트리와 현재 할당된 머티리얼 정보를 모두 보여주는 메시 필터가 포함되어 있습니다.

body_body_main_01-1 오브젝트의 자식 GameObject로, Mesh Filter 컴포넌트가 추가되어 있습니다.
메타데이터와 함께 모든 세부 정보를 하나의 객체에 통합해 두는 것이 따로 분리해 두는 것보다 더 효율적입니다.
이 문제를 해결하려면 병합 도구를 사용하세요. 기본적으로 병합 도구는 ‘모두 병합’으로 설정되어 있습니다. 이 기능을 적용하면 모든 요소가 하나의 프리팹으로 통합되므로, 적용하지 않는 것이 좋습니다. 모든 객체의 최종 레벨을 유지하고 싶습니다. 드롭다운 메뉴에서 ‘최종 레벨’ 옵션을 선택하면, 병합 도구가 계층 구조 내 목록을 차례로 탐색하여 각 트리의 마지막 오브젝트를 찾아낸 다음, 바로 그 위 오브젝트와 병합하도록 지시합니다.

Asset Transformer Toolkit의 병합 도구
자세한 단계는 이 동영상에서 확인하세요.
데시메이션
모델에서 불필요한 지오메트리를 제거하여 용량을 줄일 수 있습니다. Asset Transformer Toolkit의 ‘통계’ 옵션은 선택한 모델 또는 모델의 일부에 대한 통계를 표시합니다. 이 템플릿 튜토리얼에서 가져올 CAD 모델은 최적화 전 510개의 GameObject와 60만 개 이상의 삼각형으로 구성되어 있어, 매우 복잡한 모델입니다. 이 동영상을 통해 새로운 로봇 모델의 구멍이 어떻게 제거되는지 확인해 보세요.
‘디버그(Debug)’ 메뉴를 활성화하고 뷰를 ‘버텍스 비율(Vertex ratio)’로 변경하여 모델의 밀도를 확인하십시오. 이것은 장면 내의 다른 모든 요소에 비해 밀도가 매우 높은 오브젝트가 있는 위치를 빨간색으로 표시합니다. 이는 모델 최적화를 위해 디시메이션 기법을 적용할 수 있는 부분을 파악하는 데 유용한 지표입니다.

대규모로 몰살시키다
이번 사례처럼 모델에 지오메트리가 많다면 디시메이션 작업은 꽤 지루할 수 있습니다. 따라서 대규모로 데이터를 축소할 수도 있습니다.
디시메이션 도구의 ‘기준(Criterion)’ 옵션을 ‘품질 / 퀄리티(Quality)’로 설정하고 계층 구조(Hierarchy)에서 CAD 모델의 최상위 레벨을 선택하면, 목표 품질 수준을 지정한 후 도구를 실행하여 모든 요소에 디시메이션을 적용할 수 있습니다.
품질 설정을 ‘낮음’으로 한 상태에서 이 액션을 로봇 에셋에 적용한 결과, 삼각형 수가 65% 감소하여 현재 20만 개 미만이 되었으며, 이로써 모바일 환경에서 실행하기에 최적화되었습니다.
법선 조정
이와 같은 과도한 최적화를 진행할 때 흔히 발생하는 문제 중 하나는 모델의 부드러움이 깨질 수 있다는 점입니다. 조명을 받았을 때의 외관과 느낌이 디시메이션 처리 후 달라질 수 있는데, 갑자기 아티팩트가 나타나거나 이전보다 모서리가 더 날카로워 보일 수 있습니다. 모델의 노멀을 조정하면 이 문제를 해결할 수 있습니다. Asset Transformer Toolkit은 모델의 노멀을 조정하거나 재설정할 수 있는 다양한 도구를 제공합니다.
영상 보기: CAD 모델 최적화

규칙 세트를 사용하여 자산을 다시 가져올 때 시간을 절약하세요
CAD 모델은 설계 과정에서 수차례의 수정 과정을 거치는 경우가 많으며, CAD 애플리케이션에서 변경 사항을 적용한 후 모델을 다시 불러올 때마다 위의 모든 작업을 반복해야 한다면 비효율적일 수 있습니다.
디자인 과정의 어느 단계에 있는지, 그리고 몇 번의 수정 과정을 거칠지에 따라 이는 지루한 과정이 될 수 있습니다.
바로 그 점에서 규칙 집합이 큰 장점을 발휘합니다. Unity Asset Transformer Toolkit의 Rule Engine에서 설정하는 ‘규칙 세트(Rule Sets)’는 Unity가 임포트 과정에서 따르거나 사용자가 수동으로 적용할 수 있는 일련의 명령어(‘액션’이라고 함)로, CAD 모델에 일반적으로 적용하고자 하는 다양한 작업을 자동화해 줍니다.
규칙 세트 생성
규칙 세트는 기본적으로, Asset Transformer Toolkit이 주어진 기준에 따라 특정 오브젝트를 찾아낸 다음 사용자가 지정한 작업을 적용하도록 지시하는 일종의 지침서입니다. 예를 들어, CAD 파일에서 이 머티리얼 이름을 발견하면, 이를 이 Unity 머티리얼에 매핑하십시오. 이 패턴으로 이름이 지정된 부품을 발견하면, 이를 한데 묶어주세요. 다각형 수가 이 임계값을 초과하면 LOD 레벨을 생성합니다. 이 규칙들을 활용하면, 그렇지 않으면 지루한 수작업이 될 일을 자동화할 수 있습니다.
‘산업 기초’ 템플릿의 ‘규칙 세트’ 폴더에는 여러 가지 미리 정의된 규칙 세트가 포함되어 있습니다. 이것들은 단순히 어떤 기능을 하는지뿐만 아니라, 최적화의 우선순위를 어떻게 정해야 할지 고민하게 만든다는 점에서 연구해 볼 가치가 있습니다. 이 템플릿에서는 하나의 규칙 세트가 로봇 모델을 처리하는데, 유저가 주로 주목하는 팔 관절 부분은 높은 디테일이 필요하지만, 잘 보이지 않는 베이스 부분은 디테일 수준을 낮춰도 무방합니다. 또 다른 모델은 창고 환경을 담당하는데, 이곳은 기하학적 구조는 단순하지만 그 수가 많기 때문에, LOD를 적극적으로 생성하는 것이 합리적입니다.
가져오기 과정에서 디시메이션 및 계층 구조 정리 작업을 자동화된 프로세스로 적용하는 규칙 세트가 있습니다. 이 템플릿에는 모델의 시각적 완성도를 높이기 위해 앰비언트 오클루전을 버텍스 데이터에 자동으로 적용하는 또 다른 규칙 세트도 포함되어 있습니다. 마지막으로, 가져오기 과정에서 재료와 오브젝트를 교체하는 방법을 알려주는 규칙 세트가 있습니다
규칙 집합을 생성하려면:
1. 프로젝트 폴더에서 마우스 오른쪽 버튼을 클릭한 다음, ‘생성’ > ‘애셋 변환기’ > ‘규칙 세트’를 선택합니다.
2. 규칙 집합의 이름을 지정하세요.
3. 전용 탭에서 규칙 세트를 편집하세요(인스펙터 옆에 자동으로 열립니다).
4. 시퀀스에 항목을 추가합니다(예: 필터, 작업, 추가 규칙 등). 규칙은 위에서 아래로 순차적으로 적용됩니다.
아래 이미지를 보시면, 오른쪽에 규칙 세트가 열려 있습니다. 첫 번째 동작은 기본적으로 'Get'으로 설정되어 있습니다. 이렇게 하면 씬 내의 오브젝트 하나가 선택되며, 그 이후에 이어지는 모든 작업은 선택된 해당 오브젝트에 적용됩니다.

로봇 모델 중 하나에 대한 규칙 세트(오른쪽)
“Get” 액션은 로봇 모델 전체를 선택하며, 이후의 모든 액션은 로봇 모델 전체에 적용되므로, 후속 액션을 적용하고자 하는 모델 내의 특정 요소를 찾아낼 방법이 필요합니다. 이를 위해 이 규칙에 ‘필터 작업’을 추가하고, 작업을 ‘메타데이터 필터링’으로 설정하여 CAD 모델과 함께 가져온 메타데이터를 사용하도록 하십시오.
자산을 효율적으로 다시 가져오기
위와 같은 규칙 집합은 다음 방법 중 하나로 수동으로 실행할 수 있습니다:
- 적용할 개체를 선택합니다
- 규칙 세트를 선택한 다음 ‘실행’ 버튼을 클릭합니다
하지만 가져오기 과정의 일부로 규칙 세트가 자동으로 적용되도록 설정할 수도 있습니다. 이를 설정하려면 Assets > 3DModel 폴더에 생성된 임포트 설정 ScriptableObject를 선택하면, 인스펙터에서 ‘Import’ 버튼의 이름이 ‘Re-import’로 변경된 것을 확인할 수 있습니다.
‘규칙 엔진’ 버튼을 선택한 다음, 가져오기 과정에서 실행할 규칙 세트를 지정합니다.
이 설정을 완료한 후 ‘다시 가져오기’ 버튼을 선택하면, CAD 모델을 다시 가져올 때마다 지정한 규칙이 해당 모델에 적용됩니다. 또한 가져오기 규칙 내에 여러 규칙과 규칙 세트를 중첩하여, 가져오기 과정에서 이 모든 규칙이 적용되도록 할 수 있습니다.
영상 보기: 규칙 세트

영상 보기: 고급 규칙 세트

템플릿에 새로운 로봇 추가하기
데이터를 가져오고 최적화한 다음 이 전체 과정을 자동화하는 방법을 살펴보았다면, 이제 시뮬레이션 내에서 이 CAD 데이터를 기능적인 데이터 기반 로봇으로 구현할 차례입니다.
이 템플릿에는 작업 과정을 따라가는데 필요한 모든 구성 요소가 포함되어 있습니다. 여기에는 모델을 UI에 연결하고, 다양한 로봇 변형 간에 전환할 수 있도록 설정하며, 로봇의 동작을 실시간으로 테스트할 수 있게 해주는 C# 스크립트도 포함되어 있습니다.
템플릿에 설명된 워크플로우 중 하나를 살펴보겠습니다.
창고 장면에는 여러 대의 로봇이 있으며, 새로 추가할 로봇 모델도 다른 로봇들과 동일한 기능을 갖도록 설정해야 합니다. 이를 위해 모델을 다시 가져오면 되는데, 이제 규칙 세트가 마련되어 있으므로 이 과정은 효율적이고 예측 가능합니다. 다음은 단계별 안내입니다:
1. ‘프로젝트 > 3D 모델’에서 이전에 설정해 둔 모든 옵션이 포함된 ScriptableObject 애셋을 가져올 수 있습니다. 인스펙터를 열고, ‘Rule Engine’ 탭에서 가져오기 규칙이 설정되어 있는지 확인하십시오.

이 모델에 대해 이전에 설정된 규칙 세트가 표시된 ‘규칙 엔진’ 탭(오른쪽)
2. ‘모델’ 탭에서 ‘메타데이터 가져오기’ 설정이 선택되어 있는지 확인하십시오. 이는 필터와 모든 규칙 세트가 정상적으로 작동하기 위해 필수적입니다.
3. 모델을 다시 가져온 후에는 ‘Assets > 3DModels’에서 해당 모델을 찾을 수 있으며, 거기서부터 씬 뷰로 드래그 앤 드롭할 수 있습니다.
4. 계층 구조에서, 씬에 있는 기존 로봇들이 부모 Robots GameObject 아래에 중첩되어 있음을 확인할 수 있습니다. 이 항목을 펼친 다음 하위 로봇 오브젝트 중 하나를 선택하면, 각 로봇에 대한 모든 정보가 포함된 ‘Robot Data ScriptableObject’와 함께 ‘Robot’ 스크립트가 연결되어 있는 것을 확인할 수 있습니다.

각 로봇에 대한 모든 정보를 포함하는 Robot Data SO ScriptableObject
5. ‘Assets > Warehouse > RobotData’ 폴더를 살펴보면, 현재 씬에 있는 네 대의 로봇이 각각 고유한 RobotDataSO ScriptableObject를 가지고 있음을 확인할 수 있습니다. 새 로봇에도 동일한 ScriptableObject를 연결해야 합니다.
6. 그러려면 Assets 폴더를 마우스 오른쪽 버튼으로 클릭한 다음, ‘만들기’ > ‘산업용 템플릿’ > ‘로봇 데이터’를 선택하세요. 로봇 모델 번호와 일치하도록 이름을 지정하십시오.
7. 추가한 새 로봇을 클릭하여 인스펙터를 연 다음, ‘컴포넌트 추가’를 클릭하고 드롭다운 메뉴에서 ‘Robot.cs’라는 로봇 스크립트를 찾아 추가하세요.
8. 새 로봇 ScriptableObject를 새 스크립트의 Data 필드로 드래그하면, 이 로봇이 다른 로봇들과 동일하게 작동하는 데 필요한 나머지 스크립트와 컴포넌트가 자동으로 추가됩니다.
템플릿에 포함된 튜토리얼을 따라가며, CAD 데이터를 가져와 실시간 애플리케이션에 적용하여 Digital Twins를 생성하고, UI를 통해 로봇을 모니터링할 수 있도록 제어 기능을 설정하는 각 단계를 확인해 보세요.
영상 보기: 사용자 인터페이스 및 상호작용

UI 툴킷을 사용하여 모니터링 대시보드 만들기
Unity에는 사용자 인터페이스(UI)를 제작하기 위한 두 가지 시스템이 있습니다: Unity UI(uGUI) 및 UI 툴킷. Industry Fundamentals는 UI Toolkit을 사용합니다.
UI 툴킷은 최적의 성능과 다양한 플랫폼에서의 호환성을 위해 설계되었으며, 표준 웹 기술에서 영감을 받았습니다. 웹 페이지나 애플리케이션 개발 경험이 있다면, UI 툴킷의 핵심 개념은 이미 익숙하실 것입니다. UI 툴킷은 사용자가 이미 알고 있는 마크업 언어와 스타일 시트에 대한 지식을 활용할 수 있는 강력한 도구와 워크플로를 제공합니다.
UI 툴킷: 표준 웹 기술에서 영감을 받아
UI 툴킷을 사용하면 HTML, CSS, JavaScript를 활용할 때와 마찬가지로 UI의 구조, 스타일, 동작을 분리할 수 있습니다.
UXML은 HTML과 XML에서 영감을 받아 개발된 마크업 언어로, UI 구조와 재사용 가능한 템플릿을 정의합니다. C#으로도 UI를 제작할 수 있지만, UXML을 사용하면 Unity UI 빌더 창 내에서 UI 레이아웃을 작업할 수 있어 시각적인 제작 환경을 제공합니다.
CSS는 UI에 시각적 스타일과 레이아웃 규칙을 적용하는 스타일 시트입니다. CSS와 마찬가지로, USS는 표준 CSS 속성의 일부를 지원합니다. C#에서 스타일을 직접 정의할 수도 있지만, USS를 사용하는 것이 권장됩니다. USS를 사용하면 UI 전반에서 스타일을 재사용할 수 있어 일관된 디자인을 구현하고 관리도 간편해지기 때문입니다.

UI Builder에서 대시보드 UI 만들기
UI 툴킷은 UI 요소의 속성을 데이터 원본에 연결할 수 있는 데이터 바인딩 시스템을 지원합니다. 즉, 데이터가 변경되면 UI가 자동으로 업데이트되고, 그 반대의 경우도 마찬가지입니다.
이 섹션에서는 대시보드의 설계와 데이터 바인딩과의 연동 방식을 살펴보겠습니다.
‘산업 기초’에서 계기판 배선 작업

왼쪽에는 로봇 목록이, 오른쪽에는 상세 정보와 제어 기능이 표시된 대시보드 UI
대시보드는 상단에 개요 정보, 왼쪽에 로봇 목록, 오른쪽에 세부 정보 및 제어 기능이 배치된 별도의 섹션으로 구성되어 있습니다. 대시보드의 USS 파일에는 색상 및 간격 변수와 같은 전체 디자인 시스템과, 버튼 및 상태 표시기와 같은 반복되는 요소를 위한 클래스가 정의되어 있습니다.
각 로봇에는 표준, 경고, 심각의 세 가지 상태가 있으며, 이를 시각적으로 표시해야 합니다. USS는 ‘상태-표준’, ‘상태-경고’, ‘상태-비상’의 세 가지 등급을 정의하며, 각 등급마다 고유한 배경색이 지정되어 있습니다. C# 스크립트는 로봇의 상태에 따라 이러한 클래스를 추가하거나 제거합니다. 로봇의 배터리 잔량이 임계치 이하로 떨어지면 체력이 점차 감소하며, 배터리 잔량이 적을수록 체력 감소 속도가 빨라집니다. 로봇의 상태나 배터리 잔량이 경고 또는 위험 수준에 도달하면 상태 등급이 그에 따라 업데이트되어, 운영자가 대시보드에서 즉시 시각적 신호를 확인할 수 있습니다.

각 로봇에는 표준, 경고, 심각의 세 가지 상태가 있으며, 이를 시각적으로 표시해야 합니다.
실제 프로젝트에서 이러한 분리는 디자이너가 코드를 수정하지 않고도 경고 색상을 조정할 수 있게 해주며, 프로그래머는 CSS를 알지 못해도 새로운 상태 유형을 추가할 수 있게 해줍니다.
UIController 스크립트
UIController 스크립트가 모든 요소를 하나로 묶어줍니다. 시작 시 UI 요소에 대한 참조를 캐시하고, 버튼과 슬라이더에 대한 이벤트 콜백을 등록하며, Robot Manager의 이벤트를 구독하고, 상태가 변경되면 UI를 업데이트합니다. 이 템플릿은 UI 업데이트에 대한 두 가지 접근 방식을 모두 보여줍니다. 배터리 잔량과 같은 연속적인 값에 대한 데이터 바인딩과, 로봇 선택과 같은 이산적인 이벤트에 대한 명시적인 코드가 그것입니다.
데이터 바인딩

UI 툴킷의 데이터 바인딩
모든 레이블과 진행률 표시줄을 수동으로 업데이트하는 코드를 작성하는 대신, UXML에서 바인딩을 선언하여 UI 요소의 속성을 데이터 원본의 속성과 연결합니다. 데이터가 변경되면 UI가 자동으로 업데이트됩니다.
이 템플릿은 UI 요소를 각 로봇의 RobotDataSO ScriptableObject에 직접 바인딩합니다. 여기에는 배터리 잔량, 상태, 온도 및 속도가 표시됩니다. UXML은 “이 레이블의 텍스트는 이 데이터 원본의 Battery 속성을 백분율 형식으로 표시해야 한다”와 같은 바인딩을 정의합니다.
이 바인딩은 양방향입니다. 예를 들어, ARM 범위 슬라이더는 단순히 값을 표시할 뿐만 아니라 해당 값을 설정하기도 합니다. 사용자가 슬라이더를 드래그하면 바인딩된 속성이 업데이트되어 로봇 ARM이 움직입니다. UI는 단순한 디스플레이가 아닌 제어 패널로 변모합니다.
변환기는 데이터 바인딩의 핵심 요소로, 데이터 유형과 표시 형식 간의 차이를 처리합니다. 데이터 원본에서 battery는 0에서 100 사이의 float 값이지만, “75.0”이 아닌 “75%”로 표시하고 싶습니다. 이 템플릿에는 서식 지정 함수를 등록하는 변환기 리소스가 포함되어 있습니다. 바인딩에서 이러한 변환기를 참조하면, 데이터가 표시되는 과정에서 값이 변환됩니다.
미니맵

대시보드의 미니맵; 미니맵의 배경은 상공 카메라에서 가져온 렌더 텍스처입니다
이 미니맵은 UI 툴킷 내부의 사용자 정의 렌더링 기능을 보여줍니다. 미니맵 배경은 상공 카메라에서 가져온 렌더 텍스처입니다. 로봇 위치 표시점은 월드 좌표를 UI 공간으로 변환하여 배치된 UI 요소입니다. 코드는 매 프레임마다 각 로봇의 실제 위치를 읽어와 미니맵 요소상의 해당 위치를 계산한 뒤, 점의 위치를 업데이트합니다. 이는 공간적 관계를 보여주는 간단하지만 효과적인 기법입니다.
영상 보기: UI 심층 분석

자동 및 수동 내비게이션 설정

창고에 미리 구워진 내비메시
로봇들은 어디로 움직일 수 있는지 어떻게 알까요? 창고에는 선반, 팔레트, 다른 로봇 등 장애물이 가득하며, 각 로봇은 이 장애물들을 피해 이동할 경로를 찾아야 합니다. 이것이 바로 Unity의 AI 내비게이션 시스템이 담당하는 역할입니다.
에디터에서 창고 씬을 열고 상단 도구 모음으로 이동하여 ‘Toggle Visibility’ 토글 버튼을 클릭하면, NavMesh가 씬에 파란색 오버레이 형태로 표시됩니다. NavMesh는 경로 탐색 및 AI 기반 이동을 위해 환경 내 이동 가능한 구역과 장애물을 근사화하기 위해 Unity가 생성한 메시입니다.
실행 시점에 NavMesh를 생성하는 것보다, 이를 씬에 미리 렌더링해 두는 것이 더 성능이 우수합니다. 베이킹 과정에서 내비게이션 시스템은 씬을 분석하고, 사용자가 설정한 매개변수를 바탕으로 에이전트(이 경우 로봇)가 이동할 수 있는 모든 영역을 찾아냅니다.

Unity의 AI 내비게이션 시스템은 자율 주행 및 수동 제어 시의 이동 로직을 처리합니다.
템플릿에서 각 로봇은 NavMesh Agent 컴포넌트가 연결되어 있기 때문에 자신의 경로를 알고 있습니다. 또한 속도, 가속도 매개변수, 회피 반경, 높이 등 조정할 수 있는 몇 가지 사전 설정도 포함되어 있습니다.

Nav Mesh Agent 컴포넌트
이동 로직의 상당 부분은 NavMesh 시스템에서 처리되지만, Assets > Warehouse > Scripts 경로에는 목적지 설정을 담당하는 RandomAgentMovement 스크립트도 있습니다. 이 장면에는 미리 정의된 특정 목적지가 있습니다. 실행 시 이 스크립트는 로봇 중 하나에 해당 목적지 중 하나를 할당하고, 그 후 해당 로봇이 목적지에서 얼마나 떨어져 있는지 지속적으로 확인합니다. 로봇이 그 목적지에 도착하면, 그곳에서 몇 초 동안 멈춰 서 있습니다. 그러면 스크립트가 새로운 목적지를 지정하면, NavMesh 덕분에 로봇이 자동으로 최적의 경로를 파악하여 목적지로 향합니다.

RandomAgentMovement 스크립트
로봇과 같은 자율 에이전트와 함께 임의의 수의 객체를 수동으로 제어해야 하는 애플리케이션에서는 문제가 발생할 수 있습니다. 로봇은 문이 열리고 닫히는 것이나 움직이는 상자와 같은 움직이는 물체를 감지할 수 있어야 합니다. 로봇이 이러한 움직임을 인식할 수 있도록 하려면, 이를 NavMesh 설정에 반영해야 합니다.
‘Industry Fundamentals’에서 이를 처리하기 위해 NavMesh 시스템에 NavMeshObstacle 컴포넌트가 추가됩니다. 이는 NavMesh가 로봇 주변의 지정된 영역을 분리하도록 지시합니다. 로봇이 움직이면 해당 구역도 함께 이동하므로, 로봇이 선반 같은 장애물을 통과하거나 다른 로봇과 충돌하는 것을 방지할 수 있습니다.
로봇을 제어하기 위해 수동 모드로 전환하면 NavMeshObstacle 컴포넌트가 할당되고 활성화되는 반면, NavMeshAgent 컴포넌트는 비활성화됩니다.

NavMesh 위를 이동하는 창고 로봇

모드 전환은 로봇의 ScriptableObject 데이터를 통해 이루어집니다. OperationMode 속성은 Auto 또는 Manual 중 하나이며, 여러 구성 요소가 이 값을 확인하여 수행할 작업을 결정합니다. UI에는 모드를 토글하는 버튼이 있으며, 이 버튼을 누르면 데이터 자산이 업데이트되어 컴포넌트가 반응하게 됩니다. 이러한 데이터 기반 접근 방식 덕분에 새로운 모드를 추가하거나 모드 동작을 변경할 때 여러 스크립트를 일일이 수정할 필요가 없습니다.
영상 보기: NavMesh 튜토리얼

Cinemachine을 활용한 가상 카메라 시스템
‘Industry Fundamentals’ 템플릿은 Cinemachine 가상 카메라 시스템(패키지로 다운로드 가능)을 다음 세 가지 방식으로 활용합니다:
- 작동 중인 로봇을 따라가는 카메라를 생성하고, 카드를 선택할 때마다 서로 다른 로봇들 사이의 화면 전환이 자연스럽게 이루어지도록 하기 위해
- 로봇이 창고 안을 이동할 때 카메라가 로봇을 계속 따라가도록 하고, 물체들을 뚫고 지나가는 현상이 발생하지 않도록 하려면
- 3D 뷰를 대시보드 UI로 직접 전송하려면
핵심 개념은 간단합니다: 씬에는 Cinemachine Brain 컴포넌트로 관리되는 Unity 카메라 GameObject가 하나 있고, 가능한 샷을 정의하는 여러 가상 카메라가 있습니다. Brain 구성 요소는 가상 카메라의 우선순위에 따라 카메라를 전환합니다. 가장 우선순위가 높은 활성화된 가상 카메라만이 화면에 표시되는 내용을 제어합니다.
‘산업 기초’에 등장하는 카메라들
창고 장면을 열면 여기저기에 흩어져 있는 로봇 몇 대가 보이는데, 이 로봇들을 활용해 작업할 수 있는 요소들을 제공해 주며, 이후에는 직접 만든 로봇을 추가할 수 있습니다. 장면에 직접 만든 로봇을 추가할 때는 해당 로봇에도 가상 카메라가 할당되어 있는지 확인해야 합니다.
계층 구조에서 기본 샷을 제공하는 ‘Cinemachine Shots’ 게임 오브젝트를 찾으세요.

창고 내 Cinemachine 가상 카메라
‘재생’을 누르면 각 로봇마다 런타임 시 스크립트를 통해 추가된 고유한 “추적” 카메라가 활성화됩니다. 해당 스크립트는 새로 추가된 로봇을 포함해 씬에 있는 로봇의 수를 확인한 뒤, 각 로봇에 대해 Cinemachine Camera 컴포넌트와 Third-Person Follow 컴포넌트를 생성합니다. '3인칭 추적' 컴포넌트를 사용하면 이동하는 오브젝트 뒤에 위치하는 카메라를 생성할 수 있으며, 이 카메라는 추적 대상으로 지정된 오브젝트를 따라갑니다.

Cinemachine 컴포넌트가 부착된 RobotFollowCam 게임 오브젝트, 여기에는 다음이 포함됩니다.
대시보드 UI의 경우, Cinemachine은 두 가지 다른 방식으로 구현됩니다: 현재 렌더링된 카메라를 표시하는 3D 카메라와 미니맵용 카메라. 미니맵은 별도의 카메라를 사용하는 렌더 텍스처를 활용하는데, 이 카메라는 상단 시점을 렌더링한 후 그 화면을 렌더 텍스처로 출력합니다. 3D 카메라는 텍스처를 사용하지 않고, 실행 중인 애플리케이션의 실제 카메라 시점을 렌더링하지만, UI에 있는 직사각형 창을 통해 표시합니다.
Cinemachine을 사용하면 유연한 카메라 시스템을 구축할 수 있으며, Cinemachine의 핵심 모듈이 서로 다른 카메라 간 전환에 필요한 모든 논리를 처리하여, 실제 메인 카메라의 위치를 대신하는 가상 카메라를 생성합니다. 마지막으로, 이 라이브러리는 실시간 애플리케이션 개발에 수반되는 복잡한 작업의 상당 부분을 대신 처리해 주는 3인칭 추적 카메라와 같은 추가 구성 요소를 제공합니다.
영상 보기: Cinemachine 플레이 가이드

유니버설 렌더 파이프라인을 사용하여 조명 최적화하기
유니버설 렌더 파이프라인(URP)은 확장 가능한 렌더링을 위한 Unity의 솔루션입니다. 이 제품은 고성능 데스크톱부터 모바일 기기 및 웹 브라우저에 이르기까지 모든 환경에서 효율적으로 구동되면서도 고품질 화질을 구현하도록 설계되었습니다. 산업용 응용 분야에서 이러한 유연성은 매우 중요합니다. 동일한 애플리케이션을 무역 박람회 현장에서는 키오스크 디스플레이로, 원격 고객에게는 웹 앱으로, 현장 기술자에게는 태블릿 앱으로 각각 실행해야 할 수도 있습니다.
템플릿의 URP 설정은 Settings 폴더에 있습니다. 렌더 파이프라인 애셋은 전체적인 렌더링 설정을 제어합니다. 이러한 설정의 기능을 이해하면 자신의 프로젝트에 맞춰 현명하게 조정할 수 있습니다.

‘산업 기초’ 템플릿의 창고 장면에 등장하는 로봇 중 하나
Forward+ 렌더링
이 템플릿은 Forward+ 렌더링을 사용하며, 이는 다양한 하드웨어와의 호환성을 유지하면서 여러 개의 조명을 효율적으로 처리합니다. Forward+는 화면 공간에서 조명을 클러스터링하는 방식으로 작동하므로, 기존 포워드 렌더링과 달리 씬에 조명을 더 추가하더라도 성능에 부정적인 영향을 미치지 않습니다.
앤티앨리어싱은 지오메트리와 배경이 만나는 부분에 나타나는 거친 가장자리를 부드럽게 다듬어 줍니다. 이 템플릿은 고품질 설정에서는 4배 MSAA를, 중간 품질 설정에서는 2배 MSAA를, 저품질 설정에서는 MSAA를 적용하지 않습니다. MSAA는 최신 GPU에서 처리 속도가 빠르지만 메모리 사용량이 많기 때문에, 계층적 접근 방식을 통해 대상 기기에 맞춰 성능을 조절할 수 있습니다.
그림자 캐스케이드 사용
음영은 시각적 품질을 높여주지만, 연산 비용이 많이 들 수 있습니다. 이 템플릿은 섀도 캐스케이드를 사용하며, 이를 통해 카메라 근처에는 고해상도 그림자를, 멀리 떨어진 곳에는 저해상도 그림자를 표현합니다.
구운 조명과 라이트 프로브의 조합
이 템플릿의 조명은 하이브리드 방식을 사용합니다. 창고 바닥, 벽, 선반과 같은 정적 지오메트리는 베이킹된 조명을 사용합니다. 로봇과 같은 동적 오브젝트는 실시간 조명과 라이트 프로브를 사용합니다.
라이트 프로브는 씬 내에 위치한 보이지 않는 점으로, 베이킹된 조명을 샘플링합니다. 동적 오브젝트가 라이트 프로브 근처로 이동하면, 해당 위치의 주변 조명을 반영합니다. 이 설계도에는 창고 곳곳에 조명 센서가 설치되어 있어, 로봇들이 단순히 창고 위에 놓여 있는 것이 아니라 환경과 자연스럽게 어우러져 있는 듯한 느낌을 줍니다.
LightRig 시스템은 또 다른 차원을 더합니다. 각 로봇에는 해당 로봇이 선택되면 켜지는 스포트라이트 세트가 있습니다. 이를 통해 고가의 전역 조명 기술 없이도 작동 중인 로봇에 시선을 집중시킬 수 있습니다. 이 구현은 선택 상태에 따라 조명을 켜고 끄는 기능을 제공하는 단순한 구성 요소입니다.

각 로봇에는 해당 로봇이 선택되면 켜지는 스포트라이트 세트가 있습니다.
환경 조명은 HDRI 이미지를 통해 구현되며, 이는 그림자를 채워주고 금속 표면에 반사될 빛을 제공하는 미묘한 주변광을 만들어 냅니다. 이 템플릿에는 여러 가지 HDRI 옵션이 포함되어 있어, 다양한 조명 환경이 장면의 분위기에 어떤 영향을 미치는지 확인할 수 있습니다.
C# 스크립트
템플릿에서 사용되는 스크립트와 ScriptableObject를 살펴보겠습니다.
앞서 설명한 바와 같이, 로봇의 움직임, 고장 발생 방식, UI에 결과를 보고하는 방법 등 로봇과 관련된 모든 세부 사항은 ScriptableObject에 포함되어 있습니다. 프로젝트 보기로 이동한 다음, ‘Assets > Warehouse > RobotData’로 이동하면 각 로봇의 ScriptableObject를 확인할 수 있습니다. 이 중 하나의 인스펙터를 열면 로봇의 이름, 현재 작동 모드, 현재 상태, 활성화된 변형, 배터리, 상태, 작동 온도, 속도 등과 같은 세부 정보를 확인할 수 있습니다. ScriptableObject는 그 자체로는 아무런 동작도 수행하지 않습니다. 이 맥락에서 볼 때, 이는 단순히 해당 모델에 특화된 모든 데이터를 담는 컨테이너에 불과합니다.
또한 전체 로봇 군단의 데이터를 관리하는 ScriptableObject가 있는데, 여기에는 모든 로봇의 평균 배터리 잔량, 현재 이동 중인 로봇의 수, 그리고 각 상태 범주에 속한 로봇의 수가 포함됩니다. 이 모든 정보는 대시보드 UI에 표시됩니다.
스크립트는 이러한 모든 데이터를 실제 로봇과 연결하고, 이동이나 다양한 변형 간 전환과 같은 기능을 부여하는 데 사용됩니다. 템플릿 내에서는 ‘Warehouse scripts’ 폴더에서 찾을 수 있습니다. 로봇을 제어하고 모든 ScriptableObject를 실제 모델과 연결하는 스크립트가 있습니다. 이 중 하나를 선택하면 ‘로봇’, ‘시뮬레이터’, ‘변형’ 스크립트가 표시됩니다.
RobotManager
RobotManager 스크립트는 시작 시 모든 데이터를 활성화합니다. 이 스크립트는 싱글톤이므로, 전체 씬에 이 스크립트의 인스턴스가 하나만 존재합니다. 응용 프로그램이 시작되면, 해당 장면 내의 모든 로봇을 탐지한 후 이를 목록에 저장합니다. 이 스크립트에는 두 가지 중요한 이벤트가 포함되어 있습니다: ActiveRobotChanged는 유저가 다른 로봇을 선택할 때마다 발생하며, RobotListChanged는 목록에서 로봇이 추가되거나 제거될 때 발생합니다.
이 스크립트는 전체 프로젝트의 핵심 통신 체계입니다. 다른 스크립트들을 살펴보시면, 그중 상당수가 이러한 이벤트에 구독되어 있음을 알 수 있을 것입니다.

RobotManager 스크립트
OverallDataUpdater 스크립트는 매 프레임마다 실행되어 OverallData ScriptableObject에 각 로봇의 데이터를 순차적으로 처리하고, 수치를 합산한 뒤 함대 요약 정보를 업데이트하도록 지시합니다. 따라서 전체 데이터에는 모든 정보가 포함되어 있지만, 실제로 이를 작동하게 하는 것은 바로 이 스크립트입니다.

OverallDataUpdater 스크립트
각 로봇은 NavMesh를 사용하여 이동할 수 있는 곳과 이동할 수 없는 곳을 파악합니다. 하지만 로봇에게는 나아가야 할 목표도 필요하며, 앞서 설명했듯이 각 로봇은 자동 모드나 수동 모드로 작동할 수 있습니다. 이 모든 것을 관리하기 위해, 템플릿에는 ‘Assets > Warehouse > Scripts > Editor’ 경로를 통해 접근할 수 있는 RobotEditor 스크립트가 포함되어 있습니다. 이 스크립트는 ScriptableObject를 로봇 프리팹에 할당할 때 필요한 모든 요소를 자동으로 추가합니다.
로봇이 자동 모드에 있을 때 RandomAgentMovement 스크립트가 활성화됩니다. 이 스크립트에는 여러 개의 대상이 있습니다. 스크립트가 시작되면 무작위로 하나를 선택하고 에이전트를 그쪽으로 보냅니다. 매 프레임마다 에이전트가 도착했는지 확인합니다. 남은 거리, 경로 계산이 진행 중인지 여부, 그리고 에이전트가 이동을 멈췄는지 여부를 확인합니다. 이 세 가지 조건이 모두 충족되면, 로봇은 무작위 시간(1~3초) 동안 대기한 뒤 새로운 대상을 선택하고 전체 과정을 다시 시작합니다.
시뮬레이션에서 보시다시피, 로봇들은 창고 안을 돌아다니며 각 목적지에 도착할 때마다 마치 무언가를 하는 것처럼 잠시 멈춰 서 있다가, 몸을 돌려 다음 목적지로 이동합니다.
그리고 기억하시겠지만, 수동 모드로 전환하면 Robotscript가 NavMesh Agent 컴포넌트를 비활성화하고, 카빙(carving) 기능이 활성화된 NavMesh Obstacle 컴포넌트를 활성화합니다. 해당 구성 요소가 활성화된 로봇은 내비메시 위를 이동하며, 주변 내비메시에 통로를 뚫어냅니다. 자동 모드에 있는 다른 로봇이 이 구조물에 가까이 다가오면, 내비메시에 빈 공간이 있기 때문에 통과할 수 없으며, 대신 그 주위를 돌아가는 새로운 경로를 찾게 됩니다. 자동 모드로 다시 전환하면 해당 Nav Mesh Obstacle 컴포넌트가 제거되고 NavMeshAgent가 다시 활성화됩니다.
RobotDataSimulator 스크립트는 로봇이 이동하면서 배터리가 방전되거나, 고장이 발생하는 등 실제 환경에서 일어날 수 있는 상황을 시뮬레이션합니다. 이 스크립트는 ScriptableObject에도 업데이트 내용을 기록하며, 이를 통해 UI 대시보드에 표시할 내용을 전달합니다.
마지막으로, 각 모델에 대해 ‘Variant’ 스크립트에서 다양한 변형과 그 동작을 지정할 수 있습니다. 변형 간을 전환하는 버튼을 선택하면, 이 스크립트가 해당 변형을 활성화하거나 비활성화합니다.
영상 보기: C# 아키텍처와 ScriptableObjects

성능 최적화
산업용 애플리케이션은 대개 다양한 하드웨어 기기에서 원활하게 작동해야 하므로, 사용자 경험을 어떻게 최적화할지 신중하게 고려해야 합니다. 다음은 이 템플릿에서 사용된 몇 가지 전략입니다.
- 업데이트 빈도 관리: 모든 것이 매 프레임마다 일어날 필요는 없습니다. 텔레메트리 시뮬레이터는 매 프레임마다 업데이트되는데, 이는 유저가 수동 주행 시 즉각적인 피드백을 기대하기 때문입니다. 전체 통계는 1초에 한 번씩 업데이트됩니다. 함대 전체의 평균값은 그보다 더 빠르게 의미 있게 변하지 않기 때문입니다. 이 템플릿을 사용하면 해당 설정을 조정할 수 있으므로, 반응 속도와 CPU 사용량 간의 균형을 조절할 수 있습니다.
- UI 쿼리 캐싱: UI 툴킷의 Q 메서드는 이름이나 클래스를 통해 요소를 찾아주는데, 이는 편리하지만 어느 정도 대가가 따릅니다. 매 프레임마다 Q를 호출하여 동일한 요소를 찾는 것은 처리 능력을 낭비합니다. 이 템플릿은 시작 시 한 번 쿼리를 실행하여 필드에 참조 정보를 저장한 후, 이후에는 해당 캐시된 참조 정보를 사용합니다.
- NavMesh 쿼리 최적화: A에서 B까지의 전체 경로를 계산하는 완전 경로 탐색은 계산 비용이 많이 들지만, 단일 지점을 검증하는 것은 계산 비용이 적게 듭니다. 수동 컨트롤러는 전체 경로가 아닌 다음 단계가 유효한지만 확인하면 되기 때문에 CalculatePath 대신 NavMesh.SamplePosition을 사용합니다.
- LOD: 이 로봇 모델은 화면 크기에 따라 자동으로 선택되는 여러 세부 표현 수준을 제공합니다. 가까이서 보면 모든 세부 사항을 확인할 수 있는 반면, 멀리 있는 로봇은 형상이 단순화되어 있지만 여전히 명확하게 식별됩니다. 이 템플릿의 LOD 임계값은 웨어하우스 환경에 맞춰 조정되어 있으므로, 사용자의 씬에서 주로 사용되는 시야 거리에 따라 이를 조정해야 합니다.
- 텍스처 렌더링 해상도: 이는 품질과 GPU 메모리 및 필레이트 간의 균형을 맞춥니다. 보안 카메라와 미니맵은 고해상도가 필요하지 않으므로 더 작은 텍스처로 렌더링됩니다. 이를 통해 GPU가 채워야 하는 픽셀 수와 해당 텍스처가 차지하는 메모리 용량이 줄어듭니다.
- 물리 계층 필터링: 이 템플릿은 로봇을 “Bot” 레이어에 배치하고, 관련 레이어끼리만 충돌하도록 물리 설정을 구성합니다. 로봇은 지면이나 다른 로봇과 충돌하지만, UI 레이캐스트 대상이나 물리 시뮬레이션이 아닌 목적으로 콜라이더를 사용하는 다른 시스템과는 충돌하지 않습니다.
- 품질 등급: 이 템플릿은 단계적으로 설정이 줄어드는 세 가지 단계를 정의합니다. 실행 시에는 기기 사양을 확인하거나 유저 설정을 지정한 다음, QualitySettings.SetQualityLevel을 호출하여 전환합니다. URP 렌더 파이프라인 에셋은 티어별 오버라이드를 지원하므로, 고사양 기기에는 영향을 주지 않으면서 저사양 기기에서 그림자 해상도를 낮출 수 있습니다.
마지막으로, Unity의 프로파일링 도구는 병목 현상을 찾아내는 데 필수적입니다. 대상 하드웨어에 대한 프로파일링을 수행하고, 병목 지점을 찾아낸 다음, 모든 부분을 성급하게 최적화하기보다는 해당 부분만을 집중적으로 최적화하십시오.
Unity Industry 생태계
Unity Industry는 멀티플랫폼 애플리케이션을 제작, 관리 및 확장하는 데 필요한 제품과 지원을 포함합니다. 업계 크리에이터들을 위해 설계된 이 솔루션은 데이터 통합부터 배포에 이르기까지 모든 단계를 아우릅니다.
제조, 자동차, 소매 등 다양한 분야의 선도 기업들과 함께 실시간 3D 기술을 활용해 경쟁 우위를 확보하고, 제품 출시 기간을 단축하며, 자원을 최적화해 보세요. 제품 시각화부터 시뮬레이션에 이르기까지, Unity Industry는 몰입감 넘치는 경험을 선사합니다.
‘업계 기초’ 템플릿 다운로드
Unity Industry 구독자이신 경우:
1. Unity Hub를 열고 Unity 6.4로 업데이트하세요
2. 새 프로젝트를 생성한 다음 ‘산업 기초’를 검색하거나, ‘학습’ 카테고리로 이동하여 해당 템플릿을 선택하세요.
Unity Industry 구독이 없는 경우:
1. 무료 체험 페이지로이동하여 안내에 따라 무료 체험을 신청하세요.
2. 체험판 사용 기간이 시작되면, ‘Industry’ 구독자와 동일한 절차를 따르십시오.
전자책 다운로드
양식을 작성하고 업계 전문가들이 전하는 인사이트와 솔루션을 확인해 보세요



