Quick Reference

Unity

게임 오브젝트 구조부터 입력, 물리, 데이터 에셋, UI와 연출까지 Unity 개발의 기본 축을 대학 수준으로 다시 볼 수 있게 구성합니다.

43 cards

제목, 요약, 태그, 섹션 제목 기준으로 찾습니다.

섹션

시작과 컴포넌트

3 cards

시작과 컴포넌트

GetComponent와 캐싱

csharp
private Rigidbody body;

private void Awake()
{
    body = GetComponent<Rigidbody>();
}

private void FixedUpdate()
{
    body.AddForce(Vector3.forward * 4f);
}

`GetComponent`를 어디서 호출하고 언제 캐싱해야 하는지, 가장 자주 쓰는 참조 패턴을 정리합니다.

시작과 컴포넌트

SerializeField와 인스펙터 연결

csharp
[SerializeField] private float moveSpeed = 5f;
[SerializeField] private Transform target;

필드를 `public`으로 열지 않고 인스펙터에서 연결하는 `SerializeField` 기본 패턴을 정리합니다.

시작과 컴포넌트

Transform local vs world 좌표

csharp
transform.position = new Vector3(0f, 1f, 0f);
transform.localPosition = new Vector3(0f, 0f, 2f);

부모 기준 좌표와 월드 기준 좌표가 어떻게 다른지, `position`과 `localPosition` 중심으로 정리합니다.

라이프사이클과 타이밍

5 cards

라이프사이클과 타이밍

실행 순서

csharp
private void Awake()
{
    cache = GetComponent<Rigidbody>();
}

private void Start()
{
    target = FindObjectOfType<Player>();
}

private void FixedUpdate()
{
    cache.AddForce(moveDirection * moveForce);
}

Awake, Start, Update, FixedUpdate가 언제 실행되는지 한 번에 정리한 Unity 실행 순서 치트시트입니다.

라이프사이클과 타이밍

코루틴 기본

csharp
private IEnumerator FlashDamage()
{
    indicator.SetActive(true);
    yield return new WaitForSeconds(0.15f);
    indicator.SetActive(false);
}

private void OnHit()
{
    StartCoroutine(FlashDamage());
}

시간차가 있는 게임 로직을 여러 프레임에 나눠 처리할 때 자주 쓰는 Unity 코루틴 기본 패턴입니다.

라이프사이클과 타이밍

Update vs FixedUpdate

csharp
private void Update()
{
    LookAround();
    ProcessInput();
}

private void FixedUpdate()
{
    ApplyPhysics();
}

Unity에서 `Update`와 `FixedUpdate`를 언제 쓰고 Input/Physics를 어떻게 분리할지 간단히 정리합니다.

라이프사이클과 타이밍

OnEnable / OnDisable

csharp
private void OnEnable()
{
    SomeSystem.OnNotify += HandleNotify;
}

private void OnDisable()
{
    SomeSystem.OnNotify -= HandleNotify;
}

컴포넌트가 활성화/비활성화될 때 이벤트를 등록하거나 정리하는 기본 패턴을 정리합니다.

라이프사이클과 타이밍

Time.deltaTime 기본

csharp
transform.Translate(Vector3.forward * speed * Time.deltaTime);

프레임 속도와 무관하게 이동과 타이머를 계산하기 위한 `Time.deltaTime` 핵심 패턴을 정리합니다.

입력과 물리

4 cards

입력과 물리

충돌과 Trigger 구분

csharp
private void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Player"))
    {
        Debug.Log("Player entered");
    }
}

`OnCollision`과 `OnTrigger`를 언제 쓰는지, Rigidbody와 Collider 설정 차이를 함께 정리합니다.

입력과 물리

입력 읽기 기본

csharp
private void Update()
{
    float x = Input.GetAxisRaw("Horizontal");
    float z = Input.GetAxisRaw("Vertical");

    moveDirection = new Vector3(x, 0f, z).normalized;

    if (Input.GetButtonDown("Jump"))
    {
        Jump();
    }
}

기존 Input Manager 기준으로 이동 입력, 버튼 입력, 프레임별 읽기 위치를 빠르게 정리합니다.

입력과 물리

Rigidbody 이동 기본

csharp
private void FixedUpdate()
{
    body.MovePosition(body.position + moveDirection * moveSpeed * Time.fixedDeltaTime);
}

물리 객체를 직접 Transform으로 옮기지 않고 `Rigidbody`를 통해 다루는 기본 이동 패턴을 정리합니다.

입력과 물리

Raycast 기본

csharp
if (Physics.Raycast(origin, direction, out RaycastHit hit, distance))
{
    Debug.Log(hit.collider.name);
}

시선, 클릭, 거리 감지처럼 직선 방향 검사에 자주 쓰는 `Physics.Raycast` 기본 흐름을 정리합니다.

오브젝트와 프리팹

3 cards

오브젝트와 프리팹

Instantiate와 Destroy

csharp
[SerializeField] private GameObject bulletPrefab;
[SerializeField] private Transform firePoint;

private void Fire()
{
    GameObject bullet = Instantiate(bulletPrefab, firePoint.position, firePoint.rotation);
    Destroy(bullet, 3f);
}

프리팹을 복제하고 일정 시점에 제거하는 `Instantiate` / `Destroy` 기본 흐름을 정리합니다.

오브젝트와 프리팹

프리팹 연결과 생성 흐름

csharp
[SerializeField] private GameObject enemyPrefab;

Instantiate(enemyPrefab, spawnPoint.position, Quaternion.identity);

프리팹을 인스펙터에 연결하고 런타임에 복제해 쓰는 Unity 기본 워크플로우를 정리합니다.

오브젝트와 프리팹

오브젝트 풀링 기본

csharp
GameObject item = pool[index];
item.SetActive(true);

총알, 이펙트처럼 자주 생성과 제거가 반복되는 오브젝트를 재사용하는 Unity 풀링 기본 패턴입니다.

씬과 데이터

4 cards

씬과 데이터

씬 전환 기본

csharp
using UnityEngine.SceneManagement;

public void LoadGameScene()
{
    SceneManager.LoadScene("Game");
}

`SceneManager.LoadScene`로 씬을 바꾸고, 빌드 세팅과 비동기 로딩을 함께 이해하는 기본 카드입니다.

씬과 데이터

DontDestroyOnLoad 기본

csharp
private void Awake()
{
    DontDestroyOnLoad(gameObject);
}

씬이 바뀌어도 유지되어야 하는 매니저나 음악 오브젝트를 다룰 때 쓰는 `DontDestroyOnLoad` 기본 패턴입니다.

씬과 데이터

ScriptableObject 기본

csharp
[CreateAssetMenu(menuName = "Data/Weapon Data")]
public class WeaponData : ScriptableObject
{
    public string weaponName;
    public int damage;
}

씬 오브젝트가 아닌 에셋 형태로 설정과 데이터를 분리할 때 유용한 Unity `ScriptableObject` 기본 패턴입니다.

씬과 데이터

PlayerPrefs 기본

csharp
PlayerPrefs.SetFloat("music_volume", 0.8f);
float volume = PlayerPrefs.GetFloat("music_volume", 1f);
PlayerPrefs.Save();

간단한 설정값과 진행 상태를 저장할 때 자주 쓰는 `PlayerPrefs` 기본 패턴과 한계를 정리합니다.

UI와 연출

6 cards

UI와 연출

UI Button 이벤트 기본

csharp
[SerializeField] private Button startButton;

private void Awake()
{
    startButton.onClick.AddListener(HandleStartClicked);
}

메뉴와 팝업 UI에서 자주 쓰는 `Button.onClick` 연결과 버튼 이벤트 처리 기본 흐름을 정리합니다.

UI와 연출

Animator 파라미터 기본

csharp
animator.SetBool("IsRunning", true);
animator.SetTrigger("Attack");

상태 전환을 코드에서 제어하기 위해 `Animator`의 Bool, Float, Trigger 파라미터를 다루는 기본 패턴입니다.

UI와 연출

Canvas 분리 기본

text
Canvas
  Static HUD Canvas
  Dynamic Popup Canvas

자주 바뀌는 UI와 거의 바뀌지 않는 UI를 같은 Canvas에 두지 않는 Unity UI 최적화 기본 원칙입니다.

UI와 연출

Graphic Raycaster 최적화

text
클릭 불필요 이미지:
- Raycast Target 해제

클릭 대상이 아닌 UI까지 전부 레이캐스트 후보로 두지 않기 위한 Unity Graphic Raycaster 최적화 기본 카드입니다.

UI와 연출

Layout Group 비용 이해

text
VerticalLayoutGroup
ContentSizeFitter

자동 정렬이 편하지만 자주 갱신될수록 비용이 커질 수 있는 Unity Layout Group의 사용 기준을 정리합니다.

UI와 연출

Canvas 숨기기 효율화

csharp
panel.SetActive(false);

풀스크린 UI를 가릴 때 단순 투명도 조절보다 더 적절한 비활성화 전략을 선택하는 Unity 기본 가이드입니다.

성능과 프로파일링

8 cards

성능과 프로파일링

Profiler 기본

text
Window > Analysis > Profiler

CPU, GPU, 메모리, 렌더링 병목을 찾기 위한 Unity Profiler의 가장 기본적인 읽는 법을 정리합니다.

성능과 프로파일링

Memory Profiler 기본

text
Window > Analysis > Memory Profiler
스냅샷 캡처 -> 비교

메모리 사용량, 스냅샷 비교, 메모리 예산 관점으로 Unity Memory Profiler를 읽는 기본 흐름입니다.

성능과 프로파일링

Profile Analyzer 기본

text
프로파일 캡처 A
프로파일 캡처 B
Profile Analyzer에서 비교

변경 전후 프로파일 데이터를 나란히 비교해 성능 회귀를 잡는 Unity Profile Analyzer 기본 카드입니다.

성능과 프로파일링

Frame Debugger 기본

text
Window > Analysis > Frame Debugger
Enable

드로우콜과 오버드로우를 눈으로 추적하기 위한 Unity Frame Debugger의 핵심 사용 흐름을 정리합니다.

성능과 프로파일링

성능 예산 기본

text
60 fps 목표 -> 프레임 예산 약 16.67 ms
30 fps 목표 -> 프레임 예산 약 33.33 ms

목표 프레임 시간과 플랫폼 메모리 한도를 기준으로 성능 예산을 잡는 Unity 최적화 출발점을 정리합니다.

성능과 프로파일링

Fixed Timestep 튜닝

text
Edit > Project Settings > Time
Fixed Timestep = 0.02
Maximum Allowed Timestep = 0.3333333

물리 시뮬레이션 빈도와 스터터를 함께 고려해 `Fixed Timestep`과 `Maximum Allowed Timestep`을 조정하는 기본 카드입니다.

성능과 프로파일링

NonAlloc 물리 쿼리 기본

csharp
private readonly Collider[] results = new Collider[16];
int hitCount = Physics.OverlapSphereNonAlloc(transform.position, radius, results);

반복적인 Overlap과 Raycast 결과 수집에서 GC 할당을 줄이기 위한 Unity NonAlloc 쿼리 패턴입니다.

성능과 프로파일링

RaycastCommand 기본

csharp
NativeArray<RaycastCommand> commands = new(count, Allocator.TempJob);
NativeArray<RaycastHit> hits = new(count, Allocator.TempJob);
JobHandle handle = RaycastCommand.ScheduleBatch(commands, hits, 1);

대량의 레이캐스트를 메인 스레드 밖으로 분산하기 위한 Unity `RaycastCommand` 기본 개념을 정리합니다.

코드 아키텍처와 품질

10 cards

코드 아키텍처와 품질

프로젝트 구조 정리 기본

text
Assets/
  ProjectName/
    Art/
    Audio/
    Materials/
    Prefabs/
    Scenes/
    Scripts/
    UI/
  ThirdParty/

Unity 프로젝트를 오래 유지하기 쉽게 만드는 폴더 구조, 이름 규칙, 내부 자산 분리 원칙을 정리합니다.

코드 아키텍처와 품질

.meta 파일과 Preset 기본

text
Player.prefab
Player.prefab.meta

Unity 프로젝트에서 `.meta` 파일을 왜 함께 관리해야 하는지, Preset으로 설정을 표준화하는 방법을 정리합니다.

코드 아키텍처와 품질

Custom Update Manager 기본

csharp
public interface IUpdatable
{
    void Tick();
}

수많은 `Update` 호출을 그대로 두지 않고 갱신 대상을 중앙에서 제어하는 Unity Update Manager 패턴입니다.

코드 아키텍처와 품질

비싼 호출 캐싱 기본

csharp
private Renderer cachedRenderer;

private void Awake()
{
    cachedRenderer = GetComponent<Renderer>();
}

`Update` 안에서 반복되는 `GetComponent`, 검색, 속성 조회를 줄이기 위한 Unity 캐싱 기본 패턴입니다.

코드 아키텍처와 품질

빌드에서 Debug.Log 줄이기

csharp
[System.Diagnostics.Conditional("ENABLE_LOG")]
public static void Log(object message)
{
    Debug.Log(message);
}

개발 중에는 로그를 유지하되, 릴리스 빌드에서는 과도한 `Debug.Log` 비용을 줄이는 Unity 기본 전략입니다.

코드 아키텍처와 품질

StringToHash와 PropertyToID

csharp
private static readonly int SpeedId = Animator.StringToHash("Speed");
private static readonly int ColorId = Shader.PropertyToID("_BaseColor");

Animator, Material, Shader 속성 접근에서 문자열 대신 해시 ID를 캐싱해 쓰는 Unity 기본 패턴입니다.

코드 아키텍처와 품질

asmdef 기본

text
Runtime.asmdef
Editor.asmdef
Tests.asmdef

스크립트 컴파일 범위를 줄이고 의존성을 분리하기 위한 Unity Assembly Definition 기본 개념을 정리합니다.

코드 아키텍처와 품질

Test Framework 기본

csharp
[Test]
public void AddScore_Increases_Value()
{
    Assert.AreEqual(10, score);
}

자동화된 테스트를 Unity 프로젝트에 붙이기 위한 Unity Test Framework의 기본 역할과 흐름을 정리합니다.

코드 아키텍처와 품질

EditMode vs PlayMode 테스트

text
EditMode: 순수 로직 테스트
PlayMode: 씬과 런타임 동작 테스트

빠른 로직 검증용 EditMode 테스트와 씬/런타임 흐름 확인용 PlayMode 테스트 차이를 정리합니다.

코드 아키텍처와 품질

ScriptableObject 이벤트 채널

csharp
[CreateAssetMenu(menuName = "Events/Game Event")]
public class GameEvent : ScriptableObject
{
    public Action Raised;
    public void Raise() => Raised?.Invoke();
}

오브젝트끼리 직접 참조하지 않고 메시지를 연결하기 위한 ScriptableObject 기반 이벤트 채널 패턴을 정리합니다.