오늘 학습 키워드
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 추천)
잊지 말자
- Vector3은 Struct기 때문에 값 복사다. 따라서 위치값을 가져온다고 끝이 아니고 적용을 해줘야 함
- 회전을 줄 때에는 Quaternion.Euler를 사용한다. (그게 우리가 아는 360도 체제라서)
- Time.deltaTime : 이전 프레임과 현재 프레임 사이의 시간을 반환함.
내일 학습 할 것은 무엇인지
The Stack + 2D TopDown Shooting 끝내기