[ 게임 엔진 ]
게임 엔진이란 게임 개발에 필요한 여러 기능들을 제공하는 프로그램이다. 그래픽, 사운드, 애니메이션 등과 같은 다양한 요소들을 관리하고 통합한다.
[ 스크립트 ]
컴포넌트는 Monobehavior를 상속받고 있는 것들이다.
Monobehaviour를 상속 받는 클래스는 유니티 이벤트 함수를 활용할 수 있고, 게임 오브젝트에 있는 이벤트 함수들은 특정 순서에 따라 호출되는 라이프 사이클을 가지고 있다.
[ PPU ]
Pixels Per Unit의 약자로, 스프라이트 픽셀 수 / 해당 스프라이트의 값이 게임 세계에서 차지하는 공간이다. 따라서 PPU 값이 클수록 스프라이트의 크기는 작아진다. 예를 들어 100 PPU는 1단위의 공간에 100개의 픽셀이 배치됨을 의미한다. 500 PPU는 1단위의 공간에 500개의 픽셀이 배치되는 것이므로, 동일한 스프라이트를 생성한다면 500 PPU의 스프라이트 크기가 더 작다.
PPU 값이 클수록 스프라이트가 작아져 정교한 표현이 가능하고 높은 해상도의 물리 시뮬레이션이 가능하다. 하지만 더 많은 연산을 필요로 하기 때문에 성능에 문제가 생길 수 있으므로, 필요한 수준으로 설정해야 한다. 또한 모든 스프라이트 간 일정한 PPU 값을 사용해야 크기 비율이 일정하게 유지되고 물리적 행동의 일관성을 보장할 수 있다.
[ 계층 구조 ]
계층 구조는 Transform 구조라고도 불리는데, 게임 오브젝트는 위치, 회전, 크기를 정의하는 Transform 컴포넌트를 가지고 있다. 오브젝트는 하나의 부모 오브젝트와 1개 이상의 자식 오브젝트로 구성될 수 있다. 예를 들어 자동차라는 부모 오브젝트에 차체, 창문, 핸들, 바퀴라는 여러 개의 자식 오브젝트가 있을 수 있다. 부모 오브젝트의 Transform이 변경되면, 자식 오브젝트의 Transform도 그에 맞춰 변경된다. 이처럼 계층적인 관계에서 자식 오브젝트는 부모 오브젝트에 대한 변환을 나타내기 때문에 Transfrom 구조라고 불리며, 트리 구조라고도 불린다.
로컬 좌표계는 부모에 대한 상대적인 좌표이다. 스크립트에서는 localPosition, localRotation, localScale로 참조한다.
월드 좌표계는 게임 세계에 대한 전역적인 좌표이다. 스크립트에서는 position, rotation, lossyScale로 참조한다. 근데 왜 scale에만 lossy가 붙을까?
lossy는 '손실이 있는'이라는 뜻을 가지고 있다. 위치와 회전은 다른 객체에 영향을 받지 않는 절대적인 값이다. 하지만 크기는 부모 객체의 변형에 의해 자식 객체가 변화하므로, 값이 변화할 때 계산이 일어난다. 이때 복잡한 계산으로 인해 손실된 값이 발생하게 되는데, 이 사실을 'lossy'라는 단어를 통해 개발자가 알 수 있도록 표현하고 객체의 실제 크기를 파악할 수 있게 한다.
local에 대한 내용은 아래 글의 '왜 크기는 scale이 아닌 localScale을 사용할까?' 목차에서 확인할 수 있다.
2024.04.16 - [Coding/Unity] - [내일배움캠프 2일차 TIL] 오브젝트 중력, 충돌, 파괴, 랜덤, 반복, 클래스
[ Input.GetAxis ]
void Update()
{
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector2 movement = new Vector2(moveHorizontal, moveVertical);
}
Input.GetAxis는 마우스, 키보드와 같은 입력 장치의 외부 입력을 받아오는 메서드이다. x축은 Horizontal, y축은 Vertical 키워드를 사용한다. 입력된 값의 범위는 -1부터 1까지이며, 양수 값은 양 방향, 음수 값은 음 방향, 값이 없으면 0을 나타낸다. 입력 값을 변수에 할당해서 플레이어의 움직임을 처리할 수 있다.
[ 직렬화 ]
직렬화는 객체의 상태를 저장할 수 있는 형태로 변환하는 것이다. 게임 오브젝트의 데이터를 저장하고, 게임이 다시 로드될 때 저장된 데이터를 불러와서 원래의 상태를 유지한다. Unity에서 직렬화된 필드는 인스펙터 창에서 접근할 수 있다. public 필드는 자동으로 직렬화가 이루어지고, 인스펙터 창에서 보고 수정할 수 있다. 하지만 private은 내부 코드를 보호하기 때문에 외부에서 접근이 불가능하다. 그렇다면 private 필드는 사용할 수 없는 것일까?
public class Player : MonoBehaviour
{
[SerializeField]
private int health = 100;
}
private 필드 앞에 [SerializeField]를 붙이면 내부 코드는 보호하면서도 인스펙터 창에 접근해서 보고 수정할 수 있다. 이는 객체의 세부 내용은 외부로부터 숨기고 기능만 노출시키는 캡슐화를 유지할 수 있다. 또한 개발자가 편리하게 관리하고 유지 보수가 가능한 장점이 있다.
[ 회고 ]
Transform에 대해서 부모 객체와 자식 객체에 차이가 있다는 것은 초기에 찾아봐서 알고 있었는데, 좀 더 깊이 공부하니 오류가 있었음을 발견할 수 있었다. 월드 좌표계에서는 position, rotation, scale인 줄 알았는데, lossyscale이라는 이름으로 사용되고 있었다.
이외에도 저번 프로그래밍 심화 주차에서 추가 구현 기능 중 게임 데이터를 저장하는 기능을 구현하기 위해서 JSON 직렬화를 하라는 안내문과 다른 수강생분들이 질문하는 것을 몇 번 봤었다. 하지만 나는 선택 구현 기능을 많이 해보지 못해서 게임 저장은 쳐다도 보지 않았기 때문에 직렬화라는 단어만 들어보고 어떤 것인지에 대해서는 전혀 몰랐다. 강의에서는 직렬화에 대한 설명이 안 되어 있어서 직접 찾아봤는데, 데이터 저장 기능뿐만 아니라 Unity에서 인스펙터 창에 접근할 수 있도록 하는 역할도 있었다. 직렬화에 대해서 알게 됐으니 다음번에는 이를 이용한 게임 데이터 저장 기능 구현에도 도전해 봐야겠다.
'Coding > Unity' 카테고리의 다른 글
[내일배움캠프 19일차 TIL] New Input System, 이벤트 처리 (0) | 2024.05.10 |
---|---|
[내일배움캠프 18일차 TIL] 쿼터니언, 아크탄젠트 (0) | 2024.05.09 |
[내일배움캠프 5일차 TIL] 복습, 체력바, isKinematic, isTrigger, 레벨 (1) | 2024.04.19 |
[내일배움캠프 4일차 TIL] 복습, 마우스 포인터 추적, 점수 저장 (1) | 2024.04.18 |
[내일배움캠프 3일차 TIL] UI, 싱글톤, 점수 적용, 게임 오버, 다시 시작 (0) | 2024.04.17 |