ABOUT ME

Today
-
Total
-
  • [유니티로 만드는 게임 개발 총론]2장. 실세계 매커니즘
    도서 정리/유니티로 만드는 게임 개발 총론 2023. 8. 25. 15:28
    본문의 모든 내용과 이미지의 저작권은 '페니 드 빌' 저자의 유니티로 만드는 게임 개발 총론 도서에 있습니다.

    2-1. 게임에 작용하는 힘

    • 게임을 이해하려면 운동(Motion)과 그것에 작용하는 힘에 대해 알아야 함
    • 게임의 대부분의 오브젝트는 움직이며 게임 환경은 움직임을 멈추지 않음
    • 게임에서는 위치, 속도, 가속도, 방향, 3D 모델의 UV 텍스처, 라이트 속성, 기타 특수 효과 등 광범위한 범위에 벡터를 활용

    1. 벡터

    • 길이(크기)와 방향(화살표로 표시)을 가진 선, 게임에서 이동, 속도, 가속 등 양을 나타내는데 사용
    • 유니티의 모든 오브젝트는 다양한 벡터를 트랜스폼 컴포넌트 안에 가지고 있다.
      • 위치(Position): 대개 y축은 위(초록색), x 축은 옆(빨간색), z 축은 앞(파란색) 방향을 가리킴
      • 회전(Rotation): 양(+)의 각도 값은 반 시계 방향으로서의 회전을 의미
      • 크기(Scale): 오브젝트의 크기를 의미

    • 오브젝트들은 고유의 방향을 가지며 게임 창에서의 방향은 카메라의 방향에 따라 달라짐
    • 유니티에는 게임 오브젝트의 위치, 방향, 스케일 값을 저장하는 Vector2와 Vector3라는 두 가지 벡터 클래스가 있음
      • Vector2: 2D 벡터 정보(x, y)를 저장
      • Vector3: 3D 벡터 정보(x, y, z)를 저장

    2-2. 2D와 3D 공간의 정의

    • 2D에서나 3D에서나 벡터의 원리는 동일, 단 하나의 값 차이
    • 유니티에서는 카메라의 시점을 이용해서 2D와 3D를 구분, 2D에서도 z좌표를 설정 가능
      • 2D에서의 z좌표는 오브젝트간의 앞, 뒤 위치(깊이)를 설정하는데 사용

    1. 카메라

    • 플레이어에게 액션을 전달하는 핵심 요소, 게임 속 세계는 카메라를 통해 펼쳐지기 때문에 카메라를 어떻게 이동하고 무엇을 비출지에 대한 이해가 필수
    • 화면에 보이는 영역을 규정하고 뷰의 폭과 높이를 정의하며 보이는 대상의 깊이를 설정
    • 카메라 뷰는 눈(뷰어)의 위치, 근거리 클리핑 평면, 화면, 원거리 클리핑 평면으로 구성
    • 카메라가 비추는 전체 공간을 뷰 볼륨(View volume)이라고 하며 두 가지 형태가 있음
      • 카메라의 Projection 속성으로 변경 가능

    카메라의 Projection 속성

    • 직교(Orthographic): 원근감을 없앤 카메라 형태, 평행한 클리핑 평면 사이에 있는 3D 오브젝트의 모든 점을 화면에 투영
    • 원근(Perspective): 원근감을 넣은 카메라 형태, 클리핑 평면 사이에 있는 3D 오브젝트의 모든 점을 눈으로 돌려 투영, 근거리 클리핑 평면이 화면이 됨

    직교 투영과 원근 투영

    직교 형태

    직교 형태 카메라

    • 카메라 뷰 볼륨이 사각형 프리즘 형태, 게임 화면에서 원근감이 느껴지지 않음

    원근 형태

    원근 형태 카메라

    • 카메라 뷰 볼륨이 피라미드 형태, 게임 화면에서 원근감이 느껴짐

    2. 로컬과 월드 좌표계

    • 게임 환경에는 로컬과 월드라는 두 가지 좌표계가 작동
      • 로컬 시스템: 단일 게임 오브젝트를 기준으로 지정
      • 월드 시스템: 전체 월드의 방향과 좌표를 지정
    • 게임 오브젝트는 자신의 로컬 좌표계 또는 월드 좌표계를 기준으로 이동하거나 회전할 수 있음

    로컬과 월드 좌표계

    3. 이동과 회전, 스케일링

    • 오브젝트에는 이동, 회전, 스케일링 이라는 세 가지 변형을 가할 수 있음
      • 이동(Translation): 오브젝트를 움직이는 것, 오브젝트의 x, y, z 값을 수정
      // 오브젝트를 x 방향으로 3, y 방향으로 5, z 방향으로 8만큼 움직이는 코드
      this.transform.position.x += 3;
      this.transform.position.y += 5;
      this.transform.position.z += 8;
      
      // 또는
      this.transform.Translate(3, 5, 8);
      • 회전(Rotation): 주어진 축을 중심으로 주어진 각도만큼 방향을 변경
      // 오브젝트를 x축을 기준으로 1만큼 회전
      this.transform.Rotate(new Vector3(1, 0, 0));
      // 또는
      this.transform.Rotate(Vector3.up, 1);
      
      // 오브젝트를 y축을 기준으로 1만큼 회전
      this.transform.Rotate(new Vector3(0, 1, 0));
      // 또는
      this.transform.Rotate(Vector3.right, 1);
      
      //오브젝트를 z축을 기준으로 1만큼 회전
      this.transform.Rotate(new Vector3(0, 0, 1));
      // 또는
      this.transform.Rotate(Vector3.forward, 1);
      • 스케일링(Scaling): 오브젝트 자신의 축을 따라 크기를 변경
        • 스케일 값은 오브젝트의 원래 크기에 곱해지는 방식
        • -1로 설정 시 오브젝트가 해당 축 기준으로 뒤집힘
      // 오브젝트의 크기를 (3, 0.5, 10)으로 설정
      this.transform.localScale.x = 3;
      this.transform.localScale.y = 0.5;
      this.transform.localScale.z = 10;
      
      // 또는
      this.transform.localScale = new Vector3(3f, 0.5f, 10f);
      

    2-3. 물리학 법칙

    • 게임에서 물리는 오브젝트가 환경과 상호 작용하는 방법과 오브젝트가 움직이는 방법을 결정
    • 게임 환경에서는 뉴턴의 운동 3법칙중력 법칙이 주로 사용

    1. 중력

    • 유니티에서는 오브젝트의 Rigidbody 컴포넌트에서 중력을 기본 지원
    • 유니티 에디터에서 Edit > Project Settings > Physics를 확인해보면 기본 중력 가속도인 약 9.81로 설정 되어있음

    유니티 프로젝트 설정에 있는 중력 가속도

    2. 운동 제 1법칙

    💡 정지 상태이든 직선으로 일정하게 움직이고 있든, 모든 물체는 외부에서 힘이 가해지지 않는 이상 현 상태를 유지하려고 한다.
    • Rigidbody 컴포넌트를 가진 오브젝트 둘이 부딪히면 튕겨나감

    3. 운동 제 2법칙

    💡 특정 힘에 의해 생성돼 물체에 가해지는 가속도는 힘의 크기에 정비례하고, 물체의 질량에 반비례한다.
    • 오브젝트의 속도가 빠르면 빠를수록 다른 오브젝트에 가하는 힘이 세짐
    • Rigidbody 컴포넌트의 Mass 옵션이 질량, 질량이 높을수록 가해지는 힘이 세짐

    4. 운동 제 3법칙

    💡 모든 작용에 대해서는 언제나 반작용이 있다. 즉 서로에게 영향을 미치는 두 물체의 상호작용은 언제나 동일하며, 상대되는 부분에 작용된다.
    • 달리던 오브젝트가 다른 오브젝트에 부딪히면 속도가 느려진다.

    2-4. 게임 공간 최적화를 위한 2D와 3D 기법

    • 게임 내 모든 오브젝트를 세세하게 구현하면 프레임률이 떨어짐
    • 게임 개발자들은 여러 기법을 사용하여 플레이어가 알아차리지 못하게 연산량을 줄임

    1. 폴리곤 줄이기

    • 폴리곤은 메시의 가장 작은 부분이지만 씬 처리에 부하를 줌
    1. 필요한 만큼만 사용
      • 모델을 제작할 때, 메시에서 남는 폴리곤이 있는지 검토하고 줄이도록 해야함
    2. 백페이스 컬링
      • 오브젝트 표면의 보이지 않는 부분을 그리지 않는 방법, 유니티에서 기본 제공
    3. 세밀도 조정
      • 카메라와 가까운 오브젝트는 최고 품질로, 먼 오브젝트는 최저 품질로 그리는 방법

    2. 카메라 뷰 볼륨 조정

    • 카메라의 뷰 볼륨을 줄여 화면에 표시되는 오브젝트의 개수를 줄이는 방법

    3. 안개

    • 카메라로부터 일정 거리에 안개를 설정하여 오브젝트가 가려지게 함으로써 부자연스러운 연출을 막음과 동시에 연산량을 줄이는 방법

    4. 빌보딩(Billboarding)

    • 평면을 활용하여 다양한 가짜 배경을 구현하는 방법
    • 정사각형이 아닌 다른 모양처럼 보이기 위해 부분적으로 투명한 텍스처를 가진 평면을 말하며 잔디, 구름, 멀리 떨어진 나무 등에 많이 활용
    • 모든 각도에서 볼 수 있다는 느낌을 주기 위해 항상 플레이어를 바라보도록 끊임없이 회전
Designed by Tistory.