게임프로그래밍/Unity_C#

[멋쟁이사자처럼부트캠프] 유니티 게임 개발 5기(2025.05.26-2025.05.28)

shine94 2025. 5. 28. 17:56

해당 글은 유니티 게임 개발 수업 후 정리한 글입니다

   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;
}