* 해당 글은 유니티 게임 개발 수업 후 정리한 글입니다
https://bootcamp.likelion.net/school/kdt-ugm-5th
유니티 게임 개발 5기 : 멋사 부트캠프
개발부터 출시까지! 나만의 게임을 세상에 선보이는 유니티 부트캠프
bootcamp.likelion.net
2025.05.26(월)
* Transform
게임 오브젝트의 위치(position), 회전(rotation), 크기(scale)를 제어하는 가장 핵심적인 컨포넌트
* 회전은 내부적으로 쿼티니언(Quaternion)으로 저장되며,
오일러 각도(Euler angles)를 입력하면 자동으로 쿼티니언으로 변환된다
오일러 각도는 짐벌락(Gimbal Lock) 문제가 발생할 수 있으므로, 유니티는 기본적으로 쿼터니언 방식으로 회전을 계산한다
public class StudyTransform : MonoBehaviour
{
public float moveSpeed = 10f;
public float rotateSpeed = 70f;
void Update()
{
// 월드 방향으로 이동 /////////////////////////////////////////////////////////////////
transform.position += Vector3.forward * moveSpeed * Time.deltaTime;
// 로컬 방향으로 이동
transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
// 월드 방향을 이동
transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime, Space.World);
////////////////////////////////////////////////////////////////////////////////////
// 월드 방향으로 회전////////////////////////////////////////////////////////////////
transform.rotation = Quaternion.Euler(0f, transform.eulerAngles.y + rotateSpeed * Time.deltaTime, 0f);
// 로컬 방향으로 회전
transform.Rotate(Vector3.up, rotateSpeed * Time.deltaTime); // Space.Self 생략
// 월드 방향으로 회전
transform.Rotate(Vector3.up, rotateSpeed * Time.deltaTime, Space.World);
////////////////////////////////////////////////////////////////////////////////////
// 특정 위치의 주변을 회전 ///////////////////////////////////////////////////////////
transform.RotateAround(Vector3.zero, Vector3.up, rotateSpeed * Time.deltaTime);
////////////////////////////////////////////////////////////////////////////////////
// 특정 위치를 바라보며 회전 /////////////////////////////////////////////////////////
transform.LookAt(Vector3.zero);
////////////////////////////////////////////////////////////////////////////////////
}
}
* 폴리곤(Polygon)
세 개 이상의 선분이 닫힌 경로를 이용해 만든 2차형 도형
삼각형은 가장 단순한 폴리곤의 형태
유니티에서는 폴리곤을 삼각형 단위로 분할하여 렌더링한다
* 메쉬(Mesh)
3D 또는 2D 모델의 형태(모양)를 정의하는 데이터 집합
꼭짓점(Vertex)과 삼각형(Triangle)으로 구성되며, Unity에서 모델의 외형을 구성하는 기본 단위
2025.05.27(화)
* Time.deltaTime
프레임 간의 시간 간격
매 프레임마다 달라지며, 성능에 따라 값이 달라질 수 있음
* Time.fixedDeltaTime
고정된 시간 간격
물리 연산용, 항상 일정한 값
* 머티리얼(Material)
게임 오브젝트가 입는 옷에 해당함
색연필, 질감, 스케치 같은 시각적 표현의 집합
적용된 셰이더에 따라 표현 방식(화법)이 달라짐
* 셰이더(Shader)
게임 오브젝트의 피부 화장법
GPU에서 실행되는 그래픽 처리 코드
* 렌더 파이프라인에 따라 호환하는 셰이더가 다르고, 표현력과 성능도 차이가 난다
대표적으로 렌터 파이브라인에 Built-in, URP, HDRP가 있다
* UV 딴다 = 3D 표면의 UV 좌표를 설정한다
마치 도형의 평면도를 펼치는 것과 같은 개념이다
평면도 | UV 맵 | |
정의 | 입체 도형을 종이에 펼친 것 | 3D 모델 표면을 2D 평면으로 펼친 것 |
용도 | 종이에 도안을 그리고 재조립하기 위해 | 텍스처를 정확히 입히기 위해 |
결과 | 전개도 (전개한 평면) | UV 레이아웃 (U-V 좌표 평면) |
예시 |
종이 상자를 자른 도면 | 얼굴을 펼쳐 평면으로 놓은 UV 맵 |
정육면체의 평면도 ㄴ 6면이 십자 모양으로 펼쳐진 전개도 |
캐릭터 얼굴의 UV 맵 ㄴ 머리, 코, 볼, 귀 등이 펼쳐진 평면 이미지 |
* 2D 횡스크롤 무한 맵 구현 방법
(1) 트랜스폼 이동 방식
배경 오브젝트 자체를 계속 왼쪽으로 이동시키고, 일정 위치에 도달하면 다시 처음 위치로 되돌리는 방식
장점
Collider, Trigger와 자연스럽게 연동 가능
충돌, 물리 연산, 이벤트 처리 등 게임 플레이 요소와 연결 쉬움
단점
매 프레임 오브젝트 위치 갱신 → CPU 부하
Collider, Transform 연산, Rigidbody 등 물리 처리까지 포함되면 성능 부담이 커질 수 있음
예시
지형(땅), 장애물, 벽 등 실체가 있는 배경
(2) 텍스처 오프셋 방식(UV Offset)
배경 오브젝트는 고정하고,
머티리얼의 UV 좌표만 계속 이동시켜 텍스처가 계속 움직이는 것처럼 보이게 하는 방식
→ 반복 텍스처를 활용한 무한 배경 효과에 적합
장점
GPU에서 처리 → 성능 부담 거의 없음
매우 부드러운 스크롤 연출 가능
충돌 없는 단순 배경에 적합
단점
텍스처만 이동하기 때문에 오브젝트 자체는 정지 상태
따라서 Collider, Trigger 연동 불가능
→ 충돌 영역이 필요한 경우 별도 Collider를 스크립트로 움직여야 함
예시
구름, 하늘, 먼 배경 등 장식용 텍스처
* 픽셀 크랙(Pixel Gap)
두 스프라이트나 타일 사이에 생기는 실선 또는 틈 현상
2025.05.28(수)
* 콜라이더(Collider)
충돌을 감지하거나 트리거를 감지하는 컨포넌트
ㄴ 충돌(Collision) - 실제 물리 반응이 발생(예: 벽에 부딛힘)
ㄴ 트리거(Trigger) - 물리 반응 없이 이벤트만 감지(예: 영역 진입 감지)
* 리지드바디(Rigidbody)
물리 연산을 적용받는 컨포넌트
중력, 관성, 힘(Force) 등의 영향을 받아 움직임
Rigidbody가 있어야 Collider 간의 물리 이벤트 발생
ㄴ 반드시 두 물체 중 하나에는 반드시 존재해야 함
ㄴ 트리거는 필요 없음
* 물리 이벤트 (Physics Events)
OnCollisionEnter, OnCollisionStay, OnCollisionExit
OnTriggerEnter, OnTriggerStay, OnTriggerExit
* 터널링(Tunneling) 문제
이동 속도가 너무 빠르면 충돌을 스킵할 수 있다
ㄴ 충돌 감지가 누락되는 이유는 프레임 단위로 이동하기 때문이다
강의상으로는 프레임 간격을 줄이라고 했으나,
공식 문서상으로는 CollisionDetectionMode.Continuous를 사용하라고 명시되어 있음
// 빠른 속도의 충돌체에 터널링 방지 설정
rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous;
https://docs.unity3d.com/ScriptReference/Rigidbody-collisionDetectionMode.html
https://docs.unity3d.com/ScriptReference/CollisionDetectionMode.html
모드 | 설명 | 대상 |
Discrete | 기본값. 프레임 사이 충돌 예측 없음 | 대부분의 느린 물체 |
Continuous | 빠른 물체의 충돌 감지 전용 | 총알, 투사체 |
ContinuousDynamic | 빠른 물체가 다른 Continuous 물체에 미치는 영향까지 계산 | 빠르고 무거운 물체 (예: 차, 로켓) |
* 유니티 2D 캐릭터 충돌 시 기울어짐(회전) 방지
Rigidbody2D에서 Freeze Rotation 옵션을 설정하여 캐릭터가 물체에 부딪혀 쓰러지는 문제를 해결한다
(1) 유니티 에디터에서 설정
(2) 스크립트에서 설정
Rigidbody2D catRigidbody;
void Start()
{
catRigidbody = GetComponent<Rigidbody2D>();
catRigidbody.freezeRotation = true;
// 또는 catRigidbody.constraints = RigidbodyConstraints2D.FreezeRotation;
}
'게임프로그래밍 > Unity_C#' 카테고리의 다른 글
[MMORPG 게임 개발(C#, Unity)] Part 4. 멀티스레드 프로그래밍 (0) | 2025.05.26 |
---|---|
[멋쟁이사자처럼부트캠프] 유니티 게임 개발 5기(2025.05.20-2025.05.23) (0) | 2025.05.25 |
[멋쟁이사자처럼부트캠프] 유니티 게임 개발 5기(2025.05.15-2025.05.19) (0) | 2025.05.19 |
[MMORPG 게임 개발(C#, Unity)] Part 4. 개론 (0) | 2025.05.17 |
[MMORPG 게임 개발(C#, Unity)] Part 3. 미니 RPG: 에러 해결 과정 메모(64-마지막 강의) (0) | 2025.05.16 |