나는 Unity를 접해본 경험이 있어서 강의를 들으면서 확실하게 아는 내용보단 까먹고 있었던 내용이나 새로 알게된 사실 위주로 정리하려고 한다.
먼저 스프라이트(Sprite)란, 이미지나 그림을 나타내는 2D 그래픽 오브젝트이다. 게임 내에서 캐릭터, 배경, 아이템 등을 화면에 보여주기 위해 사용되는 것들 이라고 생각하면 된다.
Unity는 리소스 관리와 성능적인 측면 때문에 이 스프라이트를 하나의 이미지 파일로 합쳐서 관리하는데 이것이 스프라이트 시트이다.
이 스프라이트 시트를 클릭해서 Inspector창에 들어가면 Sprite Mode 라는 항목이 있는데 이 항목을 Multiple로 변경하면 스프라이트 시트를 잘라서 사용할 수 있다. 이 스프라이트 시트를 잘라서 개별적인 스프라이트로 만드는 것이 스프라이트 슬라이싱 이다.

스프라이트 슬라이싱은 위 사진과 같이 Sprite Mode가 Multiple일 때 Sprite Editor 를 클릭하여 할 수 있다.
Sprite Editor에 들어가면 아래 이미지와 같이 왼쪽위에 Slice라는 탭이 있는데, 클릭하면 어떤 방식으로 스프라이트를 슬라이싱할 지 선택할 수 있다.

<AutoMatic>
자동으로 스프라이트를 인식하여 자른다. 스프라이트가 불규칙적으로 배치되어 있을 경우 사용한다.
<Grid By Cell Size>
픽셀 단위로 높이와 폭을 결정하여 자른다. Pixel Size를 수정하여 타일의 높이와 폭을 결정할 수 있다. 규칙적인 배치가 되어 있을 때 사용한다.
<Grid By Cell Count>
열과 행의 수를 결정하여 자른다. 이 방법도 규칙적인 배치가 되어 있을 때 사용한다.
<Isometric Grid>
주로 Isometric(등각 투영) 스타일의 게임에서 사용된다. 이 기능을 사용하면 스프라이트 시트를 다이아몬드 형태로 절반 높이의 간격으로 자른다. 타일맵을 제작할 때 사용한다.
<싱글턴 패턴이란?>
싱글턴 패턴(Singleton Pattern)은 클래스의 인스턴스를 하나만 생성하도록 보장하는 디자인 패턴이다. Unity에서는 static 키워드를 사용해 쉽게 구현할 수 있다.
클래스의 인스턴스는 프로그램 전역에서 하나만 존재하도록 제한하며, 클래스의 static 변수나 속성을 통해 어디서든 동일한 인스턴스에 접근할 수 있다.
클래스 내에서 static 변수를 사용해 인스턴스를 저장하면 static 변수는 클래스 단위로 메모리를 공유하므로, 인스턴스가 하나만 유지되도록 보장한다.
[장점]
- 데이터와 객체를 일관되게 공유할 수 있다.
- 메모리 낭비를 방지하며 관리가 용이하다.
[단점]
- 전역 상태로 인해 코드 테스트와 유지보수가 어려울 수 있다.
- 의존성이 강해지면 코드 확장성이 떨어질 수 있다.
<예시> : 싱글톤으로 만든 GameManager
public class GameManager : MonoBehaviour { public static GameManager instance { get { if (m_instance == null) { m_instance = FindObjectOfType<GameManager>(); } return m_instance; } } private static GameManager m_instance; private void Awake() { if (instance != this) { Destroy(gameObject); } } }
<포스트 프로세싱이란?>
게임에서 렌더링이 완료된 화면에 추가적인 그래픽 효과를 적용하여 더 생동감 있고 시각적으로 풍부한 화면을 만드는 기술이다.
포스트 프로세싱은 렌더링 파이프라인의 마지막 단계에서 이루어지며, 화면의 전반적인 분위기를 변경하거나 시각적인 품질을 개선하는 데 사용한다.
[주요 기능]
- Bloom (블룸)
- 밝은 영역에서 빛이 번지는 효과를 추가하여 더 화려하고 빛나는 느낌을 연출.
- ex) 판타지 게임의 마법 효과, 태양의 빛 표현
- Color Grading (색 보정)
- 화면 전체의 색상, 채도, 명도를 조정하여 특정 분위기를 연출.
- ex) 따뜻한 색조로 아늑한 느낌, 차가운 색조로 긴장감 있는 느낌 표현.
- Depth of Field (초점 효과)
- 특정 영역에만 초점을 맞추고 나머지 영역은 흐릿하게 처리.
- ex) 카메라가 가까운 물체에 초점을 맞추고 배경을 흐리게 처리.
- Motion Blur (모션 블러)
- 빠르게 움직이는 물체 주변에 잔상을 남겨 더 자연스럽고 역동적인 연출.
- ex) 레이싱 게임에서 차량의 속도감을 강조.
- Ambient Occlusion (환경 광 차폐)
- 표면 간의 좁은 공간에서 빛이 닿지 않는 어두운 영역을 추가하여 더 사실적인 그림자 표현.
- ex) 벽과 바닥의 모서리에서 미세한 어두움 표현.
- Vignette (비네트)
- 화면 가장자리를 어둡게 하여 중앙에 집중도를 높이는 효과.
- ex) 긴장감 있는 장면에서 플레이어의 시선 유도.
- Chromatic Aberration (색수차)
- 렌즈의 왜곡 효과를 추가하여 화면 가장자리에 색 번짐을 연출.
- ex) 과장된 스릴이나 혼란스러운 장면에서 사용.
- Lens Distortion (렌즈 왜곡)
- 화면을 렌즈로 보는 것처럼 굴곡을 추가하여 독특한 시각적 효과를 만듦.
[장점]
- 시간적 품질 향상
- 단순한 그래픽에서도 포스트 프로세싱을 통해 더 사실적이고 몰입감 있는 화면을 구현할 수 있다.
- 감정과 분위기 전달
- 색 보정이나 비네트 효과를 사용하여 게임의 특정 감정을 더 잘 전달할 수 있다.
- 유연성
- 다양한 효과를 조합하여 게임의 독특한 스타일과 분위기를 연출할 수 있다.
[단점과 주의점]
- 성능 문제
- 포스트 프로세싱은 추가적인 GPU 리소스를 요구하므로, 과도한 효과 사용은 성능 저하를 유발할 수 있다.
- 특히 모바일 환경에서는 최적화를 철저히 고려해야한다.
- 과도한 사용 주의
- 너무 많은 효과를 한 화면에 적용하면 오히려 시각적 혼란을 초래할 수 있다.
- 효과의 우선순위
- 여러 개의 Volume을 사용할 경우, 우선순위를 설정하여 충돌을 방지하자.
Object를 생성할 땐 무조건 Transform 값을 Reset하자. 항상 0,0,0에서 생성되진 않기 때문
V를 누른 상태로 모서리를 드래그 앤 드롭하면 정확히 다른 오브젝트랑 연결된다.
Ctrl + D 를 누르면 바로 복사된다. (굳이 Ctrl + C, Ctrl + V 할 필요 없음)
GetComponentInChidren<>을 사용하면 자식객체에서 컴포넌트를 찾는다.
Mathf.Clamp를 사용하면 최소값 최대값을 설정하여 flaot 값이 설정한 범위를 넘지 않도록 한다.
Mathf.Lerp(a,b,t)를 사용하면 a와 b사이의 값 중 t(0~1) 비율의 값을 반환한다. ex) a=0, b=10, t=0.5 라고 가정하면 return 값은 5이다.
Lerp(a,b,t)=a+(b−a)×t
GameObject.FindObjectOfType<>을 사용하면 Hierachy창에 존재하는 오브젝트들 중 <>안에 들어가는 type과 동일한 오브젝트를 찾는다.