Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

Luna

[TIL Day 27] Unity 입문 강의 완강! 본문

🎮 Unity_7 TIL WIL

[TIL Day 27] Unity 입문 강의 완강!

fociend 2025. 2. 17. 12:58

 

오늘의 학습 키워드

- 유니티 1주차 강의 완강


공부한 내용 본인의 언어로 정리하기

[The Stack 프로젝트 시작]

📌 Lerp란?

Lerp"Linear Interpolation"(선형 보간)의 줄임말
두 값 사이를 일정한 비율로 자연스럽게 변화시키는 기능🎯

🔹 주요 사용법

  • Mathf.Lerp(a, b, t): 숫자 값을 선형 보간
  • Vector3.Lerp(start, end, t): 위치(Vector3) 값을 선형 보간

🔹 t 값의 역할

  • t = 0 → 시작 값 그대로
  • t = 1 → 끝 값 그대로
  • t = 0.5 → 중간값! (50% 진행)

주로 자연스러운 움직임, 애니메이션, 카메라 이동 같은 데 많이 씀!🎥✨

기본공식

  • a: 시작 값
  • b: 끝 값
  • t: 보간 비율 (0 ~ 1)

📌 PlayerPrefs란?

Unity에서 PlayerPrefs는 간단한 데이터를 저장하고 불러오는 기능
설정값, 점수, 볼륨 조절 등 작은 데이터를 보관할 때 주로 사용

🔹 저장할 수 있는 데이터 타입
- String (문자열)
- Int (정수)
- Float (소수)

🔹 운영체제별 저장 위치
- Windows → 레지스트리(HKEY_CURRENT_USER)
- MacOS → ~/Library/Preferences/
- iOS/Android → 내부 저장소

🔹 간단한 사용법

PlayerPrefs.SetInt("HighScore", 100);  // 점수 저장
int score = PlayerPrefs.GetInt("HighScore", 0); // 점수 불러오기

 

🎯 주의할 점!
암호화 안됨 → 중요한 정보 저장 ❌
큰 데이터 저장 비추천 → JSON이나 데이터베이스 사용 추천!

작은 설정값 저장할 때는 정말 유용한 기능! 😉✨

 

📌 파티클 시스템(Particle System)이란?

Unity에서 파티클 시스템연기, 불꽃, 폭발, 빛, 눈, 비 같은 시각 효과(VFX)를 만드는 데 사용됨 🌟✨
작은 이미지(파티클)를 생성하고, 다양한 속성으로 조절해서 멋진 효과를 연출할 수 있음 🎇

🔹 파티클 시스템의 주요 요소
 Emission → 파티클 생성 속도 조절
 Shape → 파티클이 퍼지는 형태(원형, 원뿔, 박스 등)
 Color over Lifetime → 파티클 색상 변화를 설정
Velocity over Lifetime → 파티클 이동 방향과 속도 조절
 Lifetime → 파티클이 존재하는 시간 설정

 

파티클 시스템을 잘 활용하면 게임의 퀄리티가 한층 더 업그레이드될 수 있음.🚀💖

 

📌 포스트 프로세싱(Post-Processing)이란?

게임 화면의 렌더링이 끝난 후 추가적인 그래픽 효과를 적용하여 더 멋지고 사실적인 화면을 만드는 기술 🎨✨
게임의 분위기를 확 바꿔주고, 퀄리티를 높이는 데 필수적인 요소! 🚀


🎥 🔹 주요 포스트 프로세싱 효과

🌟 Bloom (블룸) → 빛 번짐 효과 ✨ (예: 태양광, 마법 이펙트)
🎨 Color Grading (색 보정) → 색감과 분위기 조절  (예: 공포 게임의 어두운 톤)
📷 Depth of Field (초점 효과) → 초점이 맞은 부분만 선명하게! 🔍 (예: 카메라 초점)
💨 Motion Blur (모션 블러) → 빠른 움직임에 잔상 효과 🏎️💨 (예: 레이싱 게임)
🕶️ Vignette (비네트) → 화면 가장자리를 어둡게  (예: 집중감과 몰입감 UP!)
🌈 Chromatic Aberration (색수차) → 렌즈 왜곡 효과  (예: 사이버펑크 느낌)


🔥 포스트 프로세싱의 장점

- 그래픽 퀄리티 업! → 심플한 그래픽도 더 멋지게!
- 분위기 연출 → 색감과 효과로 감정을 극대화! 
- 유연한 조합 가능 → 여러 효과를 섞어서 개성 있는 스타일 연출!

⚠️ 주의할 점

- 성능 저하 가능 → GPU 부담을 줄이려면 최적화 필수!
- 과도한 효과 주의 → 너무 많으면 화면이 어수선할 수도 있음

 

[TopDown 프로젝트 시작]

📌 타일맵(Tilemap)이란?

2D 게임에서 격자(Grid) 기반의 맵을 쉽게 만들고 관리할 수 있도록 도와주는 기능! 🎮
작은 타일(Tile) 들을 조합해서 큰 맵을 만들 수 있어서, RPG, 퍼즐, 플랫포머 게임 같은 2D 게임 개발에 자주 쓰임! ✨


🧩 🔹 타일맵의 주요 구성 요소

1️⃣ Tile (타일) 🟦
→ 맵을 구성하는 가장 작은 단위! 스프라이트 이미지, 충돌 정보, 이펙트 등을 포함할 수 있음

2️⃣ Tilemap (타일맵) 🗺️
→ 여러 개의 타일을 모아서 하나의 2D 격자(Grid) 형태로 관리하는 시스템
→ 타일을 쉽게 배치하고, 수정하고, 삭제할 수 있음

3️⃣ Grid (그리드) 📏
→ 타일맵을 배치하는 격자 기반의 틀
→ 여러 개의 타일맵을 같은 Grid에 배치 가능 (예: 배경 타일맵, 충돌 타일맵 따로 관리 가능)


🌟 타일맵의 장점

빠르고 효율적인 맵 제작 → 드래그해서 맵을 쉽게 만들 수 있음! 🖌️
충돌 및 물리 적용 가능 → 캐릭터가 지나갈 수 있는 곳과 없는 곳을 설정할 수 있음! 🚧
최적화에 유리 → GPU 리소스를 절약하면서도 넓은 맵을 쉽게 만들 수 있음!


타일맵을 활용하면 복잡한 2D 맵도 쉽게 구현할 수 있음! 😆

 

📌 코루틴(Coroutine)이란?

코루틴은 Unity에서 시간 기반 작업이나 비동기적 작업을 처리할 때 사용하는 기능 ⏳✨
일반적인 함수와 다르게 실행을 중단했다가 나중에 다시 실행할 수 있어서, 애니메이션, 대기, 반복 실행 같은 작업을 할 때 유용함


🛠️ 코루틴의 특징

1️⃣ 비동기적 실행 가능 🚀
→ 한 프레임에서 모든 작업을 처리하지 않고, 여러 프레임에 걸쳐 실행 가능!
→ 게임이 끊기지 않고 자연스럽게 동작할 수 있음!

2️⃣ yield return을 사용해 흐름 제어 
→ 특정 조건이나 시간만큼 기다렸다가 실행 재개 가능!
→ 프레임마다 반복하거나, 일정 시간 후 실행되는 기능을 쉽게 만들 수 있음!


코루틴에서 사용되는 yield return 종류

1️⃣ yield return null;
다음 프레임까지 대기

IEnumerator WaitForNextFrame()
{
    Debug.Log("현재 프레임 실행");
    yield return null; // 다음 프레임까지 대기
    Debug.Log("다음 프레임에서 실행");
}

2️⃣ yield return new WaitForSeconds(시간);
일정 시간(초) 대기

IEnumerator WaitForSecondsExample()
{
    Debug.Log("작업 시작");
    yield return new WaitForSeconds(2f); // 2초 대기
    Debug.Log("2초 후 작업 실행");
}

3️⃣ yield return new WaitForSecondsRealtime(시간);
실제 시간 기준으로 대기 (Time.timeScale 영향을 받지 않음!)

IEnumerator WaitForSecondsRealtimeExample()
{
    Debug.Log("작업 시작");
    yield return new WaitForSecondsRealtime(2f); // 2초 대기
    Debug.Log("2초 후 작업 실행");
}

4️⃣ yield return new WaitUntil(조건);
특정 조건이 참(true)이 될 때까지 대기

IEnumerator WaitUntilExample()
{
    Debug.Log("조건을 기다리는 중...");
    yield return new WaitUntil(() => Input.GetKeyDown(KeyCode.Space)); // 스페이스 키 입력 대기
    Debug.Log("스페이스 키 입력됨");
}

5️⃣ yield return new WaitWhile(조건);
특정 조건이 거짓(false)이 될 때까지 대기

IEnumerator WaitWhileExample()
{
    Debug.Log("조건이 참인 동안 대기...");
    yield return new WaitWhile(() => Time.time < 5f); // 게임 시간이 5초 미만인 동안 대기
    Debug.Log("5초 경과");
}

6️⃣ yield break;
코루틴을 즉시 종료

IEnumerator CoroutineWithBreak()
{
    Debug.Log("작업 시작");
    yield return new WaitForSeconds(1f);
    Debug.Log("코루틴 종료");
    yield break; // 코루틴 강제 종료
}

🎮 코루틴의 활용 예시

애니메이션과 함께 특정 동작 실행
NPC 이동, 공격 패턴 같은 이벤트 처리
시간이 걸리는 작업(예: 다운로드, 로딩 등) 실행
게임에서 일정 시간마다 반복 실행(예: 체력 회복, 몬스터 스폰 등)


🌟 코루틴을 활용하면 더 자연스럽고 효율적인 게임 동작을 구현할 수 있음

 

📌 UI 앵커(UI Anchor)란?

Unity에서 Canvas 내부의 UI 요소가 해상도나 화면 크기가 변해도 일정한 위치를 유지하도록 설정하는 기능

 

앵커를 설정하면?
✅ 해상도가 달라져도 UI가 이상한 위치로 이동하지 않음!
✅ 화면 크기에 맞춰 자동으로 크기와 위치를 조정할 수 있음!
✅ 다양한 디바이스에서 일관된 UI 배치가 가능함!


🎯 UI 앵커의 기본 개념

🔹 앵커 포인트(Anchor Point)
→ UI 요소가 기준으로 삼는 앵커 지점을 설정하는 것!
→ 기본적으로 Rect Transform 컴포넌트에서 설정 가능

🔹 앵커 프리셋(Anchor Presets)
→ Unity에서 제공하는 기본적인 앵커 설정을 빠르게 선택 가능!
→ Rect Transform의 좌측 상단 앵커 버튼을 클릭하면 설정 가능

🔹 Pivot(피벗)과의 차이점
앵커(Anchor): 부모(Canvas)와의 상대적 위치를 설정
피벗(Pivot): UI 요소 자체의 기준점을 설정


🏗️ UI 앵커의 주요 설정

앵커 위치 설명

Top Left (좌상단) 부모의 왼쪽 상단을 기준으로 고정
Top Right (우상단) 부모의 오른쪽 상단을 기준으로 고정
Bottom Left (좌하단) 부모의 왼쪽 하단을 기준으로 고정
Bottom Right (우하단) 부모의 오른쪽 하단을 기준으로 고정
Stretch (확장) 부모의 크기에 맞춰 UI 크기 조정

📌 Tip!
Alt + 클릭 → UI 요소의 위치와 앵커를 한 번에 설정 가능!


UI 앵커 활용 예시

반응형 UI 만들기
→ 해상도에 맞춰 버튼, 패널 등의 위치를 자동 조정!

화면 상단/하단에 고정된 UI 만들기
→ Top 또는 Bottom 앵커를 사용해 상단 바, 하단 메뉴 설정

전체 화면을 채우는 UI
→ Stretch 앵커를 활용해 패널이 화면 크기에 맞게 조정

좌우 정렬된 UI 배치
→ Left, Right 앵커를 사용해 해상도에 맞게 위치 조정

 

📌 UI 렌더링 순서: Hierarchy와 Canvas의 관계

Unity에서 UI가 렌더링되는 순서는 Canvas와 Hierarchy(계층 구조)에 의해 결정됨 


1️⃣ Canvas의 레이어 순서

 Canvas가 UI 렌더링의 기준
Hierarchy에서 위쪽에 있는 요소가 먼저 그려짐
아래쪽 요소가 위쪽 요소를 덮음(Overlapping)

즉, 계층 구조에서 아래쪽에 있는 UI 요소일수록 앞에 표시! (Z축 개념)


2️⃣ UI 렌더링 규칙

📌 기본 규칙

  • Hierarchy에서 위쪽 요소 → 먼저 렌더링
  • 아래쪽 요소 → 위쪽 요소를 덮음

📌 동일한 부모 아래에서의 순서

  • 부모(Parent) → 자식(Child) 순서로 렌더링됨
  • 같은 부모 아래에 있는 경우, 위쪽 요소가 먼저 그리고, 아래쪽 요소가 위를 덮음

3️⃣ Hierarchy 예시

Canvas
├── Panel A
│   ├── Text A1
│   └── Button A2
├── Panel B
│   ├── Text B1
│   └── Button B2

🖼️ 렌더링 순서
1️⃣ Panel A 먼저 렌더링 → 그 안의 Text A1, Button A2가 표시됨
2️⃣ Panel B가 Panel A 위에 렌더링됨 → Text B1, Button B2가 Panel A를 덮음

4️⃣ UI 렌더링 순서 제어하는 방법

Hierarchy에서 요소 순서 조정
→ 아래쪽에 있는 요소일수록 화면에서 위쪽에 보이게 됨

Canvas의 Sort Order 값 변경
→ Canvas의 Sort Order 값이 높을수록 위쪽에 렌더링됨
→ 여러 개의 Canvas가 있을 때 사용

Canvas Override Sorting 사용
→ Canvas의 Override Sorting 옵션을 체크하면 수동으로 정렬 가능

Z-축 위치 조정 (Rect Transform → Pos Z)
→ Z 값이 작을수록 뒤쪽, 클수록 앞쪽에 위치

5️⃣ UI 렌더링 순서 조정 예시

Panel B를 Panel A 뒤로 보내고 싶다면?

  1. Hierarchy에서 Panel A를 아래로 이동
  2. 또는 Panel B의 Pos Z 값을 더 낮게 설정
  3. 여러 Canvas가 있다면 Sort Order 값을 조정

📌 Hierarchy 순서 변경 & Canvas 추가 설정 

 

1️⃣ Hierarchy에서 직접 순서 변경

드래그 앤 드롭으로 요소 이동
아래쪽 요소일수록 화면에서는 위쪽에 보임

 

📌 예시

  • Panel B를 Panel A 위로 올리면 Panel B가 Panel A보다 뒤쪽(앞쪽)에 배치됨

2️⃣ Sibling Index 변경 (스크립트 제어)

🔹 SetSiblingIndex(int index)를 사용하면 UI 요소의 순서를 코드로 조정할 수 있음!

// Panel B를 Hierarchy의 맨 위로 이동
GameObject panelB = GameObject.Find("Panel B");
panelB.transform.SetSiblingIndex(0); // 가장 아래로 이동 (즉, 가장 위에 렌더링됨)

// Panel B를 맨 뒤로 (즉, 가장 아래에 렌더링)
panelB.transform.SetAsLastSibling();

// Panel B를 Panel A 위로 배치
GameObject panelA = GameObject.Find("Panel A");
panelB.transform.SetSiblingIndex(panelA.transform.GetSiblingIndex() + 1);

📌 Sibling Index란?
Hierarchy에서 0이 가장 먼저 그려지는 요소(가장 아래),
숫자가 클수록 위쪽으로 올라가면서 다른 UI 요소를 덮음


3️⃣ Canvas의 추가 설정

🔹 Sorting Order 변경

Canvas의 Sort Order 값을 조정하면 Canvas 간의 렌더링 순서를 변경할 수 있어!

Sort Order 값이 클수록 위쪽에 렌더링됨
✔ 여러 개의 Canvas를 사용할 때 어떤 Canvas가 위쪽인지 정할 때 유용

Canvas canvas = panelB.GetComponent<Canvas>();
canvas.sortingOrder = 5; // 높은 값일수록 위쪽

 

📌 Unity Input System 🎮

Unity의 새로운 Input System은 기존의 Legacy Input Manager보다 더 유연하고 강력한 입력 처리 방식을 제공함

 

1️⃣ 특징

다양한 입력 장치 지원 🎮

  • 키보드, 마우스, 게임패드, 터치스크린, VR 컨트롤러 등 지원
  • 다중 입력 장치도 쉽게 통합 가능

이벤트 기반 구조

  • Update()에서 입력을 체크하는 방식이 아니라 이벤트 방식으로 입력을 처리

키 매핑 변경이 간편 🎛

  • 게임 내에서 동적으로 키를 변경할 수도 있음

패키지 형태로 제공 📦

  • Package Manager에서 설치해야 사용 가능

2️⃣ 구조

🔹 1. Input Actions Asset 🎯

  • 입력 처리를 설정하는 에셋 파일 (.inputactions)
  • 키보드, 마우스, 게임패드, 터치스크린 등 다양한 입력을 한 곳에서 설정 가능
  • Unity UI에서 드래그 & 드롭으로 쉽게 조정 가능

🔹 2. Player Input 컴포넌트 

  • PlayerInput 컴포넌트를 추가하면 쉽게 입력을 적용할 수 있음
  • 이벤트 기반 입력 처리가 가능 (ex: 버튼 클릭 시 특정 함수 실행)

3️⃣ 사용 방법

🔹 1. Input System 패키지 설치

  1. Window → Package Manager 열기
  2. "Input System" 검색 후 설치(Install)
  3. 프로젝트 재시작 (Unity가 기존 Input Manager를 Input System으로 변경하겠냐고 물어봄 → 확인 후 재시작)

🔹 2. Input Actions 설정

  1. 프로젝트 창에서 "Create → Input Actions" 선택
  2. 생성된 .inputactions 파일을 열어 새로운 Action Map 추가
  3. 필요한 Action(Key, Button, Axis 등)을 설정
  4. 입력 장치(Device) 연결
  5. 저장 후 C# 코드에서 불러와 사용

🔹 3. 스크립트로 Input 처리하기

using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerController : MonoBehaviour
{
    private PlayerInput playerInput;
    private InputAction moveAction;

    private void Awake()
    {
        playerInput = GetComponent<PlayerInput>();
        moveAction = playerInput.actions["Move"]; // "Move" 액션 가져오기
    }

    private void Update()
    {
        Vector2 moveInput = moveAction.ReadValue<Vector2>(); // 입력값 가져오기
        Debug.Log("이동 입력: " + moveInput);
    }
}

📌 설명

  • PlayerInput 컴포넌트를 통해 Move 액션의 값을 가져와 이동 입력을 처리
  • ReadValue<Vector2>()로 2D 방향 입력을 가져옴

에러사항

오늘은 2개의 프로젝트를 직접 만들면서 모르거나 궁금했던 사항을 구글링 한 것을 위주로 정리해서 적어보았다. 

🔹 Animation 창에서 Sample 창 안 뜰때 해결방법

우측 Show Sample Rate를 누르면 나옴.

 

오늘의 회고

사실 강의 내용이 점점 가면 갈 수록 코딩 속도도 빠르고 개념 설명도 전에 했던 거다보니 덜 해지고 이래서 조금 이해하는데 시간이 걸리길래 일단 스택 게임은 엄청 빨리 훑어보기 느낌으로 갔던 것 같다.


내일 공부할 것

개인 프로젝트 시작하기

자격증 공부 같이 하기