Unity-#8.2D Project

CHO WanGi·2024년 4월 9일

Unity

목록 보기
8/13

2D Project

3D와 큰 차이는 없음
주요 특징으로는

  • 이미지를 스프라이트타입으로 임포트
  • 기본 생성 카메라가 직교(Orthographic) 모드(=두 선이 교차하는것) 사용
  • 라이팅 설정 중 일부가 비활성화
  • 씬 창이 2D 뷰로 보임
  • Vector2 값으로 동작하거나 Vector3 값으로 동작시 z 값 무시

Box Colider 2D

발판에 물리적 표면 추가하기 위해 박스 콜라이더 2D 컴포넌트 사용

DeadZone

사진의 초록색 박스 영역이 바로 DeadZone
Tag를 Dead로 수정하였다.

캐릭터 스프라이트 편집

스프라이트 시트

여러 이미지를 하나의 이미지로 합친 것.
캐릭터가 연속적으로 움직이는 모습을 여러 이미지 파일로 만드는 것 보다, 이렇게 스프라이트 시트 하나로 관리하는 것이 훨씬 더 편함

Unity는 기본적으로 싱글 스프라이트 모드로 가져옴
멀티플 스프라이트 모드로 바꾸어서 하나의 스프라이트를 여러개의 개별 스프라이트로 잘라서 사용 가능

  • Sprite Editor

Rigidbody 2D : Collision Detection

리지드바디 2D 컴포넌트의 충돌 감지 방식에는 두가지가 존재

  • 이산(Discrete)
    일정 시간 간격으로 끊어서 충돌 감지
  • 연속(Continuos)
    움직이기 이전 위치, 움직인 다음 위치 사이에서 예상되는 충돌까지 함께 감지
    -> 더 많은 성능을 요구

AudioSource

Player 컴포넌트에 오디오소스 컴포넌트를 추가.
다만, 이 오디오 소스 컴포넌트는 소리를 재생하는 부품의 역할, 소리를 담은 파일 그 자체가 아님.

  • Play On Awake
    오디오 소스 컴포넌트 활성화시 최초 1회 오디오 자동 재생

  • 오디오 리스터
    오디오 소스 컴포넌트가 소리를 재생해도 소리를 듣는 오디오 리스너 컴포넌트가 없으면 재생되는 소리가 들리지 않음
    오디오 소스 컴포넌트는 소리를 내는 오브젝트의 수 만큼 씬에 존재하지만, 오디오 리스너는 씬에 하나만 있어야 함.
    씬을 추가 하면 자동으로 생성되는 Main Camera에 리스너가 자동으로 달려 있음

Animation

Animation 만들기


애니매이션 편집창에 에셋을 드래그 앤 드롭으로 추가하면 편집 가능

  • Samples
    샘플레이트로, 초당 몇 번 스프라이트를 교체하는지를 나타내는 수치, 수치가 낮으면 애니메이션의 재생속도가 느려짐

애니매이션은 기본값으로 반복 재생되는 루프 재생이 활성화

애니메이터 컨트롤러

유한 상태 머신(FSM)

유한한 갯수의 상태가 존재, 한번에 하나의 상태만 현재 상태가 되도록 프로그램을 설계하는 모델
다른 상태로 전이 하여 현재 상태를 전환

위 애니메이터 컨트롤러는 유한 상태 머신을 사용하는 상태도를 보여줌
애니메이터 컨트롤러 = 에셋
에니메이터 = 컴포넌트
따라서 애니메이션을 재생하려면, 애니메이터 컨트롤러와 애니메이터 컴포넌트 모두가 필요함

  • Entry : 현재 상태가 진입하는 입구
  • Exit : 상태 머신이 동작이 종료되는 출구(버전 업데이트로 사라진듯 하다)
  • Any State : 현재 상태와 상관없이 특정 상태로 즉시 전이하게 허용되는 상태

애니메이터 컨트롤러에서 화살표를 통해 간단히 전이 표현 가능
전이의 조건은 파라미터를 이용
파라미터는 다음과 같음

  • bool
  • float
  • int
  • Trigger : 어떤 이벤트 발생시 전이 일어날때 사용

  • Has Exit Time : 종료 시점을 활성화하는 옵션
    종료시점 = 현재 상태를 탈출하여 다음 상태로 넘어가는 시점.
    이 옵션을 활성화 하게 되면 종료시점이 존재, 전이의 조건을 만족해도 이 종료 시점이 지나야 전이가 이루어짐.
  • Transition Duration
    현재 애니메이션 클립과 다음 클립을 자연스럽게 (부드럽게) 이어주는 블렌딩 시간을 결정
    단, 2D 애니메이션에는 블렌딩이 아닌 전이시점만 지연됨을 유의

Input.GetMouseButtonDown()

f (Input.GetMouseButtonDown(0) && jumpCount < 2)
       {
        jumpCount++;
        playerRigidbody.velocity = Vector2.zero;
        playerRigidbody.AddForce(new Vector2(0, jumpForce));
        playerAudio.Play();
       }
       else if (Input.GetMouseButtonUp(0) && playerRigidbody.velocity.y >0 )
       {
        playerRigidbody.velocity = playerRigidbody.velocity * 0.5f;
       }

마우스 버튼 식별자를 int 타입으로 입력 받음

  • 0: 마우스 왼쪽 버튼
  • 1: 마우스 오른쪽 버튼
  • 2: 마우스 휠 스크롤

playerRigidbody.velocity = Vector2.zero;

점프 구현시 직전 속도에 영향을 받지 않게 순간적으로 속도를 0 으로 만듦
만약 속도를 0으로 만들어놓지 않으면 직전까지의 힘과 상쇄 혹은 점프 높이가 비 일관적이게 됨

Animator Type

       animator.SetBool("Grounded", isGrounded);
       animator.SetTrigger("Die");

Animator Type은 애니메이터의 파라미터값을 변경할 수 있음

  • SetBool(string name bool value)
  • SetInt(string name int value)
  • SetFloat(string name float value)
  • SetTrigger(string name)

OnCollisionEnter2D

  private void OnCollisionEnter2D(Collision2D collision) {
       // 바닥에 닿았음을 감지하는 처리
       if(collision.contacts[0].normal.y > 0.7f)
       {
        isGrounded = true;
        jumpCount = 0;
       }
   }

OnCollision 계열의 충돌 이벤트, 여러 충돌 정보 담는 Collision 타입의 데이터를 입력받음
이 타입은 충돌 지점의 정보를 contacts라는 배열 로 제공.
이 배열의 길이 = 충돌 지점 개수

contacts[0] 은 즉 첫번째 충돌 지점의 값을 가져옴

normal Vector

       if(collision.contacts[0].normal.y > 0.7f)

이후 노말벡터를 사용하여 충돌 표면의 방향을 알려줌
normal.y = 1.0 일 경우 위쪽 방향을 나타냄
0.7f 로 놓아 절벽이나 천장을 바닥을 인식하는 문제를 해결

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

0개의 댓글