오늘 학습 키워드

FlappyPlane 클론 코딩

오늘 학습 한 내용을 나만의 언어로 정리하기

개념

  • 씬 : Unity 에서 한 장면. 게임 요소를 배치하고 구성하는 기본 단위

프로젝트 세팅

카메라

  • Projection : Orthographic (원근감 없는 평면 뷰)
  • 카메라 사이즈 : Orthographic 카메라에서, 화면에 표시되는 세로 범위를 결정
    • 세로 범위 : 중심에서 위/아래로 보이는 유닛 길이. (ex. 사이즈 = 4 = 위로 4유닛 /아래로 4유닛 = 도합 8유닛)

스프라이트

  • Sprite Mode : Multiple (이 이미지를 여러 이미지의 합으로 인식하겠다는 뜻)
  • Filter Mode : Point (필터 적용 안해서 뭉개지지 않음)
  • Sprite Editor에 들어가서 원하는 이미지를 드래그하여 슬라이스 함. 이후 Apply하면 잘린 스프라이트가 생김
  • PPU : Pixel Per Unit. 1 Unit에 몇 픽셀이 들어가냐는 의미. 클 수록 텍스쳐가 작게 보임.
  • Order In Layer : 클 수록 앞에 나옴
    • 같은 Sorting Layer에 있는 스프라이트들은 Sorting Order 값을 기준으로 렌더링 순서를 결정
    • 스프라이트는 Sorting Layer를 기준으로 그룹화 한 뒤, 한 그룹 내에서 Sotring Order 값으로 순서가 조정됨

애니메이션

  • Has Exit Time : 이전 애니메이션 클립이 끝난 뒤에 변경된 애니메이션을 재생할 것인지 여부
  • 애니메이터 : 애니메이션 상태를 관리하고 전환하는 도구.
    • 애니메이션 상태 관리
    • 조건에 따른 전환
    • 부드러운 연결

배경

  • V를 눌러 모서리를 드래그하고 붙이고싶은 곳에 대면 딱 붙음

캐릭터 움직임 구현

RigidBody

  • 물리 처리를 위한 컴포넌트.
    • 중력 적용
    • 힘과 속도
    • 충돌 처리
    • RigidBody 속성들
      • Mass : 무게
      • Drag : 공기 저항 시뮬레이션
      • Constraints : 특정 축 움직임/회전 제한

Collider

  • 충돌 감지를 위한 컴포넌트.
  • Collision 충돌 : 실제 힘이 가해지면서 충돌. 튕겨져 나온다던가 할 수 있음
  • Trigger 충돌 : 물리적 충돌을 하진 않음. 다만 통보는 해줌.
  • 충돌 처리 함수
    • OnCollisionEnter : 충돌 시작 시 호출
    • OnCollisionStay : 충돌이 유지되는 동안 호출
    • OnCollisionExit : 충돌이 끝났을 때 호출
    • OnTriggerEnter/Stay/Exit : Trigger Collider와의 상호작용 처리

유니티 라이프사이클

공식 문서

  • 주요 단계들
    • Awake : 스크립트가 활성화 될 때 호출
    • Start : 오브젝트가 활성화되고 첫 프레임 전에 한 번 호출
    • Update : 매 프레임마다 호출
    • FixedUpdate : 물리 연산이 필요할 때 일정 간격으로 호출
    • LateUpdate : Update 완료된 후 호출. 카메라 추적 등에 사용

장애물 반복 생성

장애물 프리팹 생성

  • local position과 position 의 차이
    • local position : 부모 오브젝트를 기준으로 한 오브젝트의 배치
    • position (= world position) : 전역 공간에서의 위치
  • Prefab : 게임 오브젝트를 재사용 가능한 형태로 저장한 에셋

따라오는 카메라 생성

  • 처음 카메라 위치 - 플레이어 시작위치를 저장해서 카메라와 플레이어간의 거리를 기억함
void Update()
{
    if(target == null) return;
 
    Vector3 pos = transform.position;
    pos.x = target.position.x + offsetX; // offsetX = 카메라-플레이어 거리
    transform.position = pos;
}

장애물 반복 구현

  • 플레이어를 계속 따라오는 카메라 밑에다가 BgLooper를 달아줌
  • 그러면 그 BgLooper와 마주친 장애물들은 다시 맨 뒤에 소환되도록 구현

재시작과 점수

재시작

  • 게임매니저 싱글톤 만들기
public class GameManager : MonoBehaviour
{
    static GameManager gameManager;
 
    public static GameManager Instance { get { return gameManager; } }
 
    private void Awake()
    {
        gameManager = this;
    }
}
  • 최초의 한 번만 gameManager로 저장함
  • 장점 : 메모리와 객체를 일관되게 유지 가능. 메모리 낭비 방지. 관리 용이
  • 단점 : 전역 상태로 인해 코드 테스트와 유지보수 어려움. 의존성 강해지면 확장성 떨어짐
  • 싱글톤 설정을 Awake에서 하니까, 접근은 가능하면 start에서 하는게 좋음

UI

캔버스

  • UI를 그리는 큰 도화지
  • Canvas Scaler UI Scale Mode : Scale With Screen Size 1920*1080 설정

빌드

윈도우

  • Windows, Mac, Linux 선택

  • Company name과 product name 설정
  • Resolution 1920*1080 으로 설정

안드로이드

  • Android 선택 (모듈 필요)

  • potrait : 세로
  • Landscape : 가로

  • 자동 회전 여부

  • WebGL 선택
  • Compression Format은 Brotli 권장 (파일 크기 축소 및 로딩 최적화)
  • 웹은 Build And Run 안하고 그냥 Build 해서 따로 실행이 안됨
  • 만약에 그러고 싶으면 웹 호스팅 플랫폼에 업로드해야됨 (itch.io 추천)

잊지 말자

  1. Vector3은 Struct기 때문에 값 복사다. 따라서 위치값을 가져온다고 끝이 아니고 적용을 해줘야 함
  2. 회전을 줄 때에는 Quaternion.Euler를 사용한다. (그게 우리가 아는 360도 체제라서)
  3. Time.deltaTime : 이전 프레임과 현재 프레임 사이의 시간을 반환함.

내일 학습 할 것은 무엇인지

The Stack + 2D TopDown Shooting 끝내기