ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 14장. 좀비 서바이버 : 레벨 아트와 플레이어 준비
    Unity/레트로의 유니티 게임 프로그래밍 에센스 2021. 2. 12. 10:05

    - 다루는 내용

    <패키지 매니저>

    <라이트 설정으로 씬의 전반적인 색 분위기를 조절하는 방법>

    <라이트맵과 글로벌 일루미네이션>

    <여러 애니메이션 클립을 섞어 사용하는 방법>

    <애니메이션을 특정 신체 부위에만 적용하는 방법>

    <플레이어의 입력과 플레이어 캐릭터의 움직임 구현>

    <시네머신으로 자동 추적 카메라 만들기>

     

    14.1 프로젝트 구성

    14.2 레벨 아트와 라이팅 설정

        14.2.1 레벨 아트 추가하기

        14.2.2 라이트맵

            - 라이팅은 연산 부담이 큼. 라이팅 데이터 에셋(Lighting Data Asset)을 사용해서 씬의 변화가 감지될 때마다 매번 새로운 라이팅 데이터 에셋을 생성.

            - 라이트맵 : 오브젝트가 빛을 받았을 때 어떻게 보일지를 미리 그려둔 텍스쳐

            - 라이트맵을 생성 -> 라이트맵을 굽는다

        14.2.3 라이팅 설정하기

        14.2.4 글로벌 일루미네이션

            - 글로벌 일루미네이션(Global Illumination)은 물체 표면에서 직접 들어오는 빛뿐만 아니라 다른 물체의 표면에서 반사되어 들어온 간접광까지 표현

            - 실시간 글로벌 일루미네이션 : 라이트맵을 여러 방향에 대해 생성. 여러 경우에 대해 빛의 반사 방향과 광원의 예상 이동 경로 등의 정보를 미리 계산. 미리 계산해야 하는 정보가 있으므로 라이팅 데이터 에셋을 구워야함.

            - 베이크된 글로벌 일루미네이션 : 고정된 빛에 대한 간접광을 라이트맵으로 구워서 사용.

            - 1x1x1 크기의 큐브에 라이트맵에서 지정한 텍셀 개수만큼 텍셀이 존재함.

    14.3 플레이어 캐릭터와 애니메이션 구성

        14.3.1 플레이어 캐릭터 준비하기

            - 3D 모델 에셋(FBX 파일)을 하이어라키 창으로 드래그&드롭하여 해당 3D 모델을 사용하는 게임 오브젝트 생성

            - 3D 모델로부터 생성된 게임 오브젝트는 애니메이터 컴포넌트를 가짐.

            - 또한 3D 모델의 계층 구조나 본(Bone)구조가 유지되어 함께 추가됨 -> ??????

            - Angular Drag(각 항력) : 회전에 대한 마찰력

        14.3.2 애니메이터 설정

            - 루트 모션 적용(Apply Root Motion) : 게임 오브젝트의 위치와 회전을 애니메이션이 제어하도록 허용

            => 움직임을 만들 수 있지만, 스크립트로 움직임을 제어하기 힘듦

        14.3.3 애니메이터 레이어

            - 유한 상태 머신에서는 하나의 상태만 현재 상태가 될 수 있지만 여러 개의 유한 상태 머신을 병렬로 실행하는 방식으로 여러 상태가 동시에 현재 상태로 중첩되게 할 수 있음

        14.3.4 Base Movement 레이어

        14.3.5 블렌드 트리

            - 특수한 종류의 모션(움직임을 나타내는 에셋)을 상태에 할당하는 것도 가능. 그 중 하나가 애니매이션 클립을 혼합하는 블렌드 트리(Blend Tree)모션

            - 애니메이션 재생속도가 음수이면 애니메이션이 거꾸로 재생됨(되감기처럼)

        14.3.6 Upper Body 레이어

        14.3.7 애니메이터 레이어 나누기

            - 애니메이터 컨트롤러에 레이어를 두 개 이상 만들면 각 레이어에서 재생하는 애니메이션은 위에서 아래 순서로 덮어쓰기(override) 방식으로 적용

            - 위의 애니메이션 위에 아래 애니메이션이 그려짐

        14.3.8 아바타 마스크

            - 애니메이터의 레이어별로 부위를 다르게 적용하려면 아바타 마스크(Avatar Mask)를 설정해야함

            - 휴머노이드 릭(Humanoid Rig) : 사람 형태의 3D 모델은 대부분 휴머노이드 타입으로 리깅(Rigging)

            - 유니티에서 휴머노이드 타입으로 리깅된 3D 모델은 체형이 달라도 애니메이션 클립이 호환됨

            - 아바타 마스크 : 휴머노이드 타입의 3D 모델에서 특정 신체 부위에만 애니메이션을 적용할 때 사용

            - IK Pass : Body 레이어의 애니메이션에 IK(Inverse Kinematics)를 적용

    14.4 캐릭터 이동 구현

        14.4.1 입력과 액터 나누기

            - 플레이어의 입력을 행위마다 받아 줄 필요 없음. 입력을 한 번 받고 그에 따라 행동.

        14.4.2 PlayerInput 스크립트

        14.4.3 프로퍼티

            - 변수에 행위를 더했다?

            - 프로퍼티(Property)는 변숫값을 읽거나 쓰는 과정에서 유연한 처리를 삽입할 수 있는 클래스 멤머.

            - 변수처럼 보이지만 변수가 아닌 특수한 형태의 메서드

            + 자동 반환 : getter에 기능을 정의하면 원하는대로 동작하고 반환 가능.

            + 안정성 증가

            + 접근자 개별 설정 : getter, setter에 접근 권한을 각각 다르게 부여 가능.

            + 자동구현 프로퍼티 : getter와 setter의 접근 권한을 분리하는 것 이외의 처리가 필요하지 않을 때 사용

                public float move {get; private set;}    // 일반 클래스 필드. 하지만 읽기와 쓰기에 다른 접근 권한 부여 가능

     

        14.4.4 PlayerInput의 Update() 메서드

        14.4.5 PlayerMovement 스크립트

        14.4.6 PlayerMovement의 Start() 메서드

        14.4.7 PlayerMovement의 FixedUpate() 메서드

            - Update()는 화면 갱신 주기에 맞춰 주기적으로 자동 실행.

            - FixedUpdate() 물리 정보 갱신주기에 맞춰 실행

            - FixedUpdate()가 오차가 날 확률이 더 낮음

            - FixedUpdate() 내부에서 Time.detaTime의 값에 접근하면 자동으로 Time.fixedDeltaTime의 값을 출력함.

        14.4.8 PlayerMovement의 Move() 메서드

            - moveDistance = playerInput.move * transform.forward * moveSpeed * Time.deltaTime; transform.forward.

                => 물체의 방향에 따라 같은 입력이라도 다르게 이동함.

            - Rigidbody 이용 : playerRigidbody.MovePosition(playerRigidbody.position + moveDistance);

            - MovePosition() 메서드는 전역 위치를 사용. (0, 0, 3)이면 전역 위치 (0, 0, 3)으로 이동

            - Transform 이용 : transform.position = transform.position + moveDistance;

            - Trasform을 이용하면 물리 처리를 무시하고 위치를 덮어쓰기 때문. 막힌 벽 등을 무시하고 벽 반대쪽으로 이동할 수 있음.

        14.4.9 PlayerMovement의 Rotate() 메서드

            - Rotate() 메서드는 플레이어 회전에 관한 입력값 playerInpu.rotate를 사용하여 캐릭터를 회전.

            - transform.rotation를 사용하면 물리처리를 무시하고 회전하는 사고가 발생할 수 있음.

        14.4.10 PlayerMovement 스크립트의 전체 코드

     

    14.5 시네머신 추적 카메라 구성

     

        14.5.1 시네머신 소개

        14.5.2 시네머신의 원리

            - 브레인 카메라 : 시네머신으로 카메라 추적을 구현하려면 브레인 카메라를 만들어야함. 게임 월드를 촬영하는 진짜 카메라이며 씬에 하나만 존재  

            - 가상 카메라 : 브레인 카메라의 분신 역할을 하며, 씬에 여러 개 존재할 수 있음.

            - 브레인 카메라는 여러 가상 카메라 중 하나를 골라 현재 활성화된 카메라로 사용. 브레인 카메라가 어떤 가상 카메라를 현재 활성화된 카메라로 설정하면 브레인 카메라는 해당 가상 카메라의 위치로 이동.

        14.5.3 추적 카메라 만들기

            - Main Camera 게임 오브젝트 클릭 > add Component > Cinemachine > Cinemachine Brain

            - 상단 메뉴 Cinemachine > Create Virtual Camera

            - Follow : 자신의 위치를 변경해가며 필드에 할당된 게임 오브젝트를 따라다님.(게임 오브젝트 따라다님)

            - Look At : 자신의 회전을 변경해가며 필드에 할당된 게임 오브젝트를 주시함.(게임 오브젝트를 바라보겠끔.)

        14.5.4 데드존, 소프트존, 하드 리밋

            - Look At 필드에 할당하는 순간, 게임 창에 붉은 색과 푸른 색으로 그려진 영역과 안내선이 생김.

            - 데드존 : 물체가 화면의 데드존에 있는 동안에는 카메라가 회전하지 않음.

            - 소프트존 : 물체가 화면의 조준점에 오도록 카메라가 브드럽게 회전. 물체가 소프트존을 벗어나 하드 리밋에 가려하면 카메라가 격하게 회전함

        14.5.5 Body와 Aim 설정

            - Field of View : 시야각

                > Body : Follow에 할당된 추적 대상을 어떻게 따라다닐지.

                > Binding Mode - World Space : 카메라와 몸체 사이의 간격을 전역 공간을 기준으로 계산.

                > Follow Offset : 추적 대상과 카메라 사이의 거리.

                > Damping : 부드럽게 이어주는 비율. 값이 커지면 카메라의 위치의 급격한 변화는 줄어들지만 위치가 느리게 변함. 카메라 위치 변경에 대한 Damping 값.

            - Aim : 카메라가 조준하는 지점. 기본적으로 Look At에 할당된 게임 오브젝트를 항상 조준하도록 회전.

                > Tracked Object Offset : 추적 대상을 기준으로 얼마큼 떨어진 지점으로 카메라를 조준할지

                > Horizontal  Damping, Vertical Damping : 카메라 회전에 대한 Damping 값.

                > Soft Zone : 소프트존 영역 값.

     

     

    14.6 마치며

     

     

     

     

     

     

     

     

     

     

     

    댓글

Designed by Tistory.