Unity-#11. 배경아트 및 플레이어

CHO WanGi·2024년 4월 12일

Unity

목록 보기
11/13

라이트맵

오브젝트가 빛을 받았을 때 어떻게 보일지 미리 그려둔 텍스쳐
-> 생성하는 것을 "굽는다" 라고 표현

라이트맵을 미리 구워두면, 옵젝이 빛 받았을때 실시간으로 연산하는 것이 아닌,
옵젝 표면에 라이트 맵을 씌워서 빛 효과 표현 => 런타임에 컴퓨터 연산량 감소

환경광(Environment Lightning)

씬에 가장 기본으로 깔리는 빛
모든 게임 옵젝에 적용되며, 모든 방향에서 같은 세기로 들오옴 -> 그림자, 명암 만들지 않음
환경광 변경시 겜 전체 색 분위기가 바뀜

글로벌 일루미네이션(GUI)

물체의 표면에 직접 들어오는 빛 + 다른 물체서 반사되어 오는 간접광

  • 실시간 글로벌 일루미네이션 = Prepared GI
    빛의 세기와 방향 변경시 그 변화를 간접광에 실시간으로 반영
  • 베이크된 글로벌 일루미네이션
    게임 도중 실시간으로 변치 않음
    - 베이크된 간접 모드 : 간접광만 구워서 미리 계산, 직사광 & 그림자 실시간처리
    - 섀도우 마스크 모드 : 간접광을 위한 라이트 맵, 그림자 맵을 추가로 구워서 사용
    - 감산 모드 : 간접광, 직사광, 그림자까지 하나의 라이트맵에 구움

모두 고정된 오브젝트(Static)에만 적용 -> 즉 두 가지 설정 모두 옵젝이 고정되어야지 빛이 입혀짐

라이트 컴포넌트 모드

  • Baked : 빛을 미리 라이트 맵에 구움
    이 모드로 설정시 런타임 도중 밝기, 컬러 변경 불가, 강제 변경도 불가
  • Realtime: 실시간으로 빛을 연산
    baked 에 비해 품질은 떨어지지만, 실시간 반영이 가능
  • Mixed: 혼합모드
    가볍거나 동적 게임 옵젝에는 실시간을, 무겁거나 정적 게임 옵젝에는 베이크된 라이트로 동작
    또한 런타임에 설정 변경 가능

섀도우 마스크 모드 기준 옵젝이 받는 빛 효과

  • 동적 게임 오브젝트
  1. 실시간 직사광
  2. 실시간 그림자
  3. 그림자 맵 활용한 실시간 그림자
  • 정적 게임 오브젝트
  1. 실시간 직사광
  2. 라이트 맵 활용하여 미리 구운 간접광
  3. 미리 구워진 그림자
  4. 그림자 맵 활용한 실시간 그림자

라이트 맵 굽기

  • Direct Samples -> 직사광 연산 샘플링 횟수
  • InDirect Samples -> 간접광 연산 샘플링 횟수
  • Environtment Samples -> 환경광
  • Indirect Resolution -> 간접광 텍스쳐 해상도
  • LightMAp Resolution -> 라이트맵 텍스쳐 해상도

3D Model 게임 오브젝트

3D 모델로 부터 생성된 게임 옵젝 -> 애니메이터 컴포넌트 + Bone구조 가짐

RigidBody - Angluar Drag


회전에 대한 마찰력, 값이 높을 수록 물체가 잘 회전하지 않거나, 회전해도 금방 멈춤

Animator Component

  • Apply Root motion : 게임 옵젝의 위치와 회전을 애니메이션이 제어하도록 허용
    이를 허용하면 아티스트의 의도에 맞는 움직임 만들 수 있지만 스크립트로 움직임을 제어하기 힘듦

Animator Layer

Base Movement 는 걷고 뛰는 기본 움직임, Upper Body 레이어는 상체에만 적용될 애니메이션 제공

Parameter

파라미터를 통해 애니메이터에 구성된 상태들 사이 전이 조건을 사용

Blend Tree

애니메이터의 상태에는 애니메이션 클립이 할당, 특수한 종류의 모션을 할당하는 것도 가능

블렌드 타입은 파라미터를 하나만 사용하는 1D, 파라미터로 Move 를사용

  • Threshold : 임곗값 = 클립이 100% 섞이는 지점,
    만약 move의 값이 1.0이라면 100% 사용, 0.75라면 4번과 5번클립이 반반씩 섞임
  • Animation Speed : 재생속도

애니메이터 레이어 나누기

각 레이어에서 재생하는 애니매이션은 위에서 아래 순서로 덮어쓰기 방식 적용
Base Movement 먼저 캐릭터에 반영 후 그다음 Upper Body 의 레이어 애니메이션이 이를 덮어쓰면서 반영

레이어를 나눔으로써 새로운 애니메이션 클립을 만들 필요 없이 각각 클립을 재생하고 합쳐서 재싱하는 것이 가능

아바타 마스트

애니메이터의 레이어별로 부위를 다르게 적용하려면 아바타 마스크를 설정 필요

휴머노이드 릭(Rig)

사람형태의 3D 모델인 휴머노이드 타입으로 리깅(3D 모델의 골격, 움직임 정의하는 계층구조 만드는 것)

초록생은 애니메이션을 적용할 부위, 붉은 색은 적용하지 않을 부위

UpperBody의 mask에 적용하여 이 레이어에서 재생되는 애니메이션들은 3D모델의 상체에만 적용

  • IK Pass 옵션
    레이어의 애니메이션의 IK 를 적용한다는 의미

입력과 액터 나누기

액터 = 입력에 의한 행위
입력감지는 PlayerInput 컴포넌트에서 수행
다른 컴포넌트에선 입력 감지 관련 내용 코드를 작성할 필요가 없음 -> 코드 양 감소 및 유지보수 용이

즉 PlayerInput 에서 입력을 감지하고 다른 컴포넌트로 뿌리는 형식

프로퍼티

변수값을 읽거나 쓰는 과정에서 유연한 처리를 삽입할 수 있는 클래스 멤버
변수가 아닌 메서드 개념

	public float move { get; private set; } // 감지된 움직임 입력값
    public float rotate { get; private set; } // 감지된 회전 입력값
    public bool fire { get; private set; } // 감지된 발사 입력값
    public bool reload { get; private set; } // 감지된 재장전 입력값

FixedUpdate();

물리 정보 갱신 주기에 맞추어 업데이트(defalut = 0.02s)

Player 회전

private void Rotate() {
        float turn = playerInput.rotate * rotateSpeed * Time.deltaTime;
        playerRigidbody.rotation =
        playerRigidbody.rotation * Quaternion.Euler(0, turn, 0f);
    }

playerInput.rotate * rotateSpeed * Time.deltaTime 을 turn 변수에 저장,
현재 회전에 turn 값을 더해 Y축 기준으로 더 회전
벡터 값아니고 쿼터니언 값 활용하는 것 유의

시네머신 추적 카메라

시네머신

카메라의 움직임 손쉽게 제어하는 유니티 공식 패키지

제공 카메라는 두가지

  • 브레인 카메라 : 진짜 카메라, 씬에 하나만 존재
  • 가상 카메라 : 브레인 카메라의 분신 역할, 여러 가상 카메라 중 하나를 골라 현재 활성화된 카메라로 사용

즉 브레인 카메라가 어떤 가상카메라를 활성화 하면, 그 가상 카메라의 위치로 이동하고, 설정값을 그대로 받아서 사용

가상카메라

  • Follow 필드 : 할당된 게임 오브젝트를 따라다님
  • Look At 필드 : 할당된 게임 오브젝트를 주시

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

  • 데드존: 카메라가 주시하는 물체가 화면의 데드존에 있다면 카메라 회전 X
  • 소프트존: 물체가 화면의 조준점(Aim)에 오도록 카메라가 부드럽게 회전
  • 하드리밋 : 물체가 너무 빠르게 움직여 하드리밋에 도달하면 카메라가 격하게 회전

Field of View

시야각을 설정하는 옵션

  • FOV : 20
  • FOV : 40

시네머신 - body

가상 카메라의 body 파라미터, 카메라가 Follow 된 추적 대상을 어떻게 따라다닐지 결정

  • Damping: 제동, 급격한 변화를 꺾어서 이전과 이후를 부드럽게 연결하는 값

시네머신 - Aim

가상 카메라의 Look At 파라미터에 할당된 게임 오브젝트를 항상 조준하도록 회전

profile
제 Velog에 오신 모든 분들이 작더라도 인사이트를 얻어가셨으면 좋겠습니다 :)

0개의 댓글