개요

본인은 파이썬에서 학습한 딥러닝 모델들을 유니티에서 돌려보는 작업을 목표로 Unity를 공부하고 있다. GPT-4o와 공식 문서를 이용하여 유니티 내에서 카메라를 다루는 예제를 작성해보려한다.

프로젝트 만들기

  • 유니티 허브(Unity Hub) 창에서 좌측에 Projects 선택 후 우상단의 New project를 클릭하였다.
  • GPT-4o는 카메라 다루는 예제를 작성하기 위해선 2D, 3D 상관없다고 해서 2D (Built-In Render Pipeline)을 선택하고 Project name, location을 설정.
  • 좌하단의 Create project 버튼을 눌러 프로젝트를 생성하였다.

2D 프로젝트에서 카메라 화면 표시하기

씬 설정(Setting Scene)

  • 기존 프로젝트를 만들고 나면 좌측 Hierarchy에는 Main Camera 만 있는 상황이다.
  • Hierarchy 창에서 빈 공간을 우클릭하여 UI > Canvas를 클릭하여 Canvas 오브젝트를 추가한다.
    • Canvas가 추가되면 MainCamera와 같은 레벨에 Canvas가 추가된 것을 확인할 수 있다.
    • Canvas를 클릭하면 우측에 Inspector 창(세부 요소를 볼 수 있는)이 뜬다. 여기서 Render Mode 항목이 Screen Space - Overlay로 되어있는지 확인한다.
  • 방금 추가한 CanvasHierarchy 창에서 선택 후 해당 Canvas를 마우스 우클릭하여 UI > RawImage를 선택한다.
    • Tree 구조 상 Canvas 하단으로 RawImage가 들어가게 된다.
    • RawImage는 카메라 영상을 표시하는데에 사용된다.
  • RawImage를 클릭하고 Inspector 창의 하단의 Add Component 버튼을 눌러 AspectRatioFitter를 검색하여 추가한다.
    • 추가하면 Inspector 창 하단에 해당 요소가 나타나며 Aspect ModeFit In Parent로 설정한다.

스크립트 작성

UI 요소가 빌드되고 앱 실행 시 작동할 액션을 코드로 정의한다. 유니티는 주로 C# 언어로 작성된다. 본인은 대학생 시절 유니티를 전공과목으로 1과목 딱 해봤지만, 요즘엔 공식 문서를 보는 능력과 GPT에게 물어보는 능력이 있다면 적절한 스크립트를 알아낼 수 있다.

  • 프로젝트의 Assets 폴더 내에 Scritps 폴더를 생성(마우스 우클릭)하고 CameraFeed.cs라는 새 C# 스크립트를 작성한다.
  • CameraFeed.cs을 열고 아래 코드를 작성
    • 본인의 경우 Visual Studio Code가 설치되어 있어 바로 연동되어 열렸다.
using UnityEngine;
using UnityEngine.UI;

public class CameraFeed : MonoBehaviour
{
    private WebCamTexture webCamTexture;
    public RawImage rawImage;
    public AspectRatioFitter aspectRatioFitter;

    void Start()
    {
        // 연결된 카메라를 찾기
        WebCamDevice[] devices = WebCamTexture.devices;
        if (devices.Length > 0)
        {
            webCamTexture = new WebCamTexture(devices[0].name);
            rawImage.texture = webCamTexture;
            webCamTexture.Play();
        }
    }

    void Update()
    {
        // 카메라 비율 조정
        if (webCamTexture != null)
        {
            float aspectRatio = (float)webCamTexture.width / (float)webCamTexture.height;
            aspectRatioFitter.aspectRatio = aspectRatio;
        }
    }
}
  • 기본 클래스의 구조, Start(), Update() 메소드의 원형은 구축되어있고 내용만 채우면 된다.

스크립트 컴포넌트 추가 및 변수 연결

  • Canvas를 선택하고 Inspector 창에서 Add Component를 클릭하여 CameraFeed를 검색하여 추가한다.
    • 우리가 작성해준 C# 스크립트가 컴포넌트로 추가되는 것으로 보인다. 아래와 같이 컴포넌트가 추가되고 코드에 작성되어있는 변수들(RawImage, Aspect Ratio Fitter)이 보인다.

  • Hierarchy 창의 Canvas 아래에 있는 RawImage를 드래그 앤 드롭으로 끌고와 Inspector 창의 Camera Feed(Script) 안에 있는 Raw Image에 연결 시켜준다.
  • 이어서 RawImageAspectRatioFitter를 동일하게 Camera Feed(Script) 안에 있는 Aspect Ratio Fitter에 연결시킨다.
    • 본인은 여기서 처음에 해맸는데 Hierarchy 창의 RawImage를 마우스 우클릭하여 Properties... 창을 띄우면 팝업으로 Inspector 창을 볼 수 있다. 이러면 두 요소간 드래그 앤 드롭이 가능해진다.
  • 각 요소를 연결하면 아래와 같이 컴포넌트 항목에 변수들이 채워진 걸 볼 수 있다.

프로젝트 빌드

빌드는 빌드 설정을 열어서 한다. 본인은 지금 다루고 있는 Ubuntu 에서 바로 실행해보도록 Linux 환경 빌드를 해본다.

  • File > Build Settings로 이동
  • Platform 목록에서 Linux를 선택하고 Switch Platform버튼을 클릭
    • 기본으로 선택되어 있다면 해당 버튼 대신 Build로 떠있을 것이다. 그러면 클릭하지 말고 필요한 셋팅을 잡아준다.

부가 셋팅 설정

추가적인 셋팅은 Build Settings 창 하단의 Player Settings 버튼을 클릭하여 해당 창에서 실시한다.

  • 기본 설정 확인
    • Product Name: 프로젝트의 이름을 입력.
    • Company Name: 회사 또는 개발자의 이름을 입력.
    • Version: 버전을 설정. 예: 1.0.0
  • Resolution and Presentation
    • 기본 해상도 설정 및 풀스크린 모드를 지정한다.
    • 본인의 경우 Fullscreen ModeWindowed로 설정하고 아래의 Resizable Window를 체크하여 크기를 자유롭게 조정할 수 있도록 했다.

  • Other Settings
    • 해당 파트의 셋팅은 GPT-4o가 알려주는 내용대로 해보았다. 상세 내용은 다음과 같다.(친절하게 존댓말로 차근차근 알려주시는 GPT 선생님)
    • Rendering:
      • Color Space: Linear 또는 Gamma 중 하나를 선택합니다. 대부분의 경우 Linear를 권장합니다.
      • Auto Graphics API for Linux: 기본적으로 활성화되어 있어야 합니다. 특정 API (예: OpenGL)만 사용하고자 할 경우 비활성화하고 API 목록을 설정할 수 있습니다.
    • Configuration:
      • Scripting Backend: Mono 또는 IL2CPP 중 하나를 선택합니다. 일반적으로 Mono를 사용하지만 성능 최적화를 위해 IL2CPP를 사용할 수도 있습니다.
      • API Compatibility Level: 대부분의 경우 NET Standard 2.0을 사용합니다.
    • Optimization:
      • Managed Stripping Level: Low 또는 Medium으로 설정합니다. 더 높은 수준의 스트리핑은 빌드 크기를 줄이지만, 호환성에 영향을 줄 수 있습니다.

이 이후 Project Settings 창을 닫고 나와 빌드를 수행한다.

  • Build Settings 창의 상단 Scenes In Build에 내가 작업한 씬이 제대로 포함되어 있는지 확인한다.
  • 지금까지 한 설정에서 변경한 것이 없다면 Build 버튼을 클릭.
  • 빌드 파일 경로 및 파일명을 설정하면 빌드가 시작된다.

빌드 결과 확인

본인의 경우 설정한 경로에 Sample2DProject0_Linux_v1.0.0_240806_Data, Sample2DProject0_Linux_v1.0.0_240806.x86_64, UnityPlayer.so 과 같이 3개 혹은 Sample2DProject0_BurstDebugInformation_DoNotShip 어쩌고 파일까지해서 4개의 파일이 생성되었다. 해당 파일들의 역할을 GPT에게 물어보니 다음과 같이 말해준다.

  1. Sample2DProject0_Linux_v1.0.0_240806_Data 폴더
    • 역할: 게임의 리소스와 데이터 파일들이 포함된 폴더입니다. 이 폴더에는 씬 데이터, 에셋, 스크립트, 셰이더, 텍스처 등이 포함되어 있습니다.
    • 사용 방법: 이 폴더는 빌드된 실행 파일과 함께 있어야 하며, 실행 파일이 이 폴더를 참조하여 게임 데이터를 로드합니다.
  2. Sample2DProject0_Linux_v1.0.0_240806.x86_64 파일
    • 역할: 빌드된 실행 파일입니다. 이 파일은 64비트 리눅스 운영 체제에서 실행될 수 있는 게임의 실행 가능한 바이너리 파일입니다.
    • 사용 방법: 리눅스 터미널에서 이 파일을 실행하여 게임을 시작할 수 있습니다. 파일에 실행 권한을 부여한 후, 터미널에서 파일을 실행합니다.
  3. UnityPlayer.so 파일
    • 역할: 유니티 플레이어 라이브러리 파일입니다. 이 파일은 게임 실행에 필요한 유니티 엔진의 동적 라이브러리입니다.
    • 사용 방법: 실행 파일이 이 라이브러리를 참조하여 게임을 실행합니다. 이 파일도 실행 파일과 같은 디렉토리에 있어야 합니다.
  4. Sample2DProject0_BurstDebugInformation_DoNotShip 파일 이 파일은 유니티에서 Burst 컴파일러를 사용할 때 생성되는 디버그 정보 파일입니다. Burst 컴파일러는 유니티의 고성능 C# 잡 시스템을 위해 만들어졌으며, 코드를 네이티브 기계어로 컴파일하여 실행 속도를 크게 향상시킵니다.
    • 역할 및 용도
      • 디버그 정보 포함: 이 파일에는 Burst 컴파일러로 생성된 네이티브 코드를 디버그하는 데 필요한 정보가 포함되어 있습니다.
      • 디버깅 목적으로만 사용: 이름에서도 알 수 있듯이, 이 파일은 디버깅 목적으로만 사용되며, 실제 배포 시에는 포함시키지 않아야 합니다.
    • 배포 시 주의사항
      • Do Not Ship: 이 파일은 최종 사용자에게 제공되는 빌드에 포함하지 않도록 주의해야 합니다. 파일명에 포함된 “DoNotShip”이라는 문구는 배포용 빌드에 이 파일을 포함시키지 말라는 의미입니다.
      • 보안: 디버그 정보는 보안상의 이유로 배포 시 제거되어야 합니다. 디버그 정보가 포함된 파일이 사용자에게 제공될 경우, 잠재적으로 악의적인 사용자가 내부 구조를 분석하는 데 도움이 될 수 있습니다.

그래서 결론적으로 다른 파일들을 삭제하지 않은 채 실행 파일을 터미널에서 실행하였다.

$ ./Sample2DProject0_Linux_v1.0.0_240806.x86_64

프로그램이 실행되며 처음에 유니티 로고가 뜨고 다음과 같이 내 PC에 연결되어 있는 웹캠의 화면이 정상적으로 받아와지는 것을 확인하였다. (얼굴 스티커는 후처리)

Leave a comment