GetComponent와 캐싱
private Rigidbody body;
private void Awake()
{
body = GetComponent<Rigidbody>();
}
private void FixedUpdate()
{
body.AddForce(Vector3.forward * 4f);
}`GetComponent`를 어디서 호출하고 언제 캐싱해야 하는지, 가장 자주 쓰는 참조 패턴을 정리합니다.
Quick Reference
게임 오브젝트 구조부터 입력, 물리, 데이터 에셋, UI와 연출까지 Unity 개발의 기본 축을 대학 수준으로 다시 볼 수 있게 구성합니다.
제목, 요약, 태그, 섹션 제목 기준으로 찾습니다.
섹션
3 cards
private Rigidbody body;
private void Awake()
{
body = GetComponent<Rigidbody>();
}
private void FixedUpdate()
{
body.AddForce(Vector3.forward * 4f);
}`GetComponent`를 어디서 호출하고 언제 캐싱해야 하는지, 가장 자주 쓰는 참조 패턴을 정리합니다.
[SerializeField] private float moveSpeed = 5f;
[SerializeField] private Transform target;필드를 `public`으로 열지 않고 인스펙터에서 연결하는 `SerializeField` 기본 패턴을 정리합니다.
transform.position = new Vector3(0f, 1f, 0f);
transform.localPosition = new Vector3(0f, 0f, 2f);부모 기준 좌표와 월드 기준 좌표가 어떻게 다른지, `position`과 `localPosition` 중심으로 정리합니다.
5 cards
private void Awake()
{
cache = GetComponent<Rigidbody>();
}
private void Start()
{
target = FindObjectOfType<Player>();
}
private void FixedUpdate()
{
cache.AddForce(moveDirection * moveForce);
}Awake, Start, Update, FixedUpdate가 언제 실행되는지 한 번에 정리한 Unity 실행 순서 치트시트입니다.
private IEnumerator FlashDamage()
{
indicator.SetActive(true);
yield return new WaitForSeconds(0.15f);
indicator.SetActive(false);
}
private void OnHit()
{
StartCoroutine(FlashDamage());
}시간차가 있는 게임 로직을 여러 프레임에 나눠 처리할 때 자주 쓰는 Unity 코루틴 기본 패턴입니다.
private void Update()
{
LookAround();
ProcessInput();
}
private void FixedUpdate()
{
ApplyPhysics();
}Unity에서 `Update`와 `FixedUpdate`를 언제 쓰고 Input/Physics를 어떻게 분리할지 간단히 정리합니다.
private void OnEnable()
{
SomeSystem.OnNotify += HandleNotify;
}
private void OnDisable()
{
SomeSystem.OnNotify -= HandleNotify;
}컴포넌트가 활성화/비활성화될 때 이벤트를 등록하거나 정리하는 기본 패턴을 정리합니다.
transform.Translate(Vector3.forward * speed * Time.deltaTime);프레임 속도와 무관하게 이동과 타이머를 계산하기 위한 `Time.deltaTime` 핵심 패턴을 정리합니다.
4 cards
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
Debug.Log("Player entered");
}
}`OnCollision`과 `OnTrigger`를 언제 쓰는지, Rigidbody와 Collider 설정 차이를 함께 정리합니다.
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 기준으로 이동 입력, 버튼 입력, 프레임별 읽기 위치를 빠르게 정리합니다.
private void FixedUpdate()
{
body.MovePosition(body.position + moveDirection * moveSpeed * Time.fixedDeltaTime);
}물리 객체를 직접 Transform으로 옮기지 않고 `Rigidbody`를 통해 다루는 기본 이동 패턴을 정리합니다.
if (Physics.Raycast(origin, direction, out RaycastHit hit, distance))
{
Debug.Log(hit.collider.name);
}시선, 클릭, 거리 감지처럼 직선 방향 검사에 자주 쓰는 `Physics.Raycast` 기본 흐름을 정리합니다.
3 cards
[SerializeField] private GameObject bulletPrefab;
[SerializeField] private Transform firePoint;
private void Fire()
{
GameObject bullet = Instantiate(bulletPrefab, firePoint.position, firePoint.rotation);
Destroy(bullet, 3f);
}프리팹을 복제하고 일정 시점에 제거하는 `Instantiate` / `Destroy` 기본 흐름을 정리합니다.
[SerializeField] private GameObject enemyPrefab;
Instantiate(enemyPrefab, spawnPoint.position, Quaternion.identity);프리팹을 인스펙터에 연결하고 런타임에 복제해 쓰는 Unity 기본 워크플로우를 정리합니다.
GameObject item = pool[index];
item.SetActive(true);총알, 이펙트처럼 자주 생성과 제거가 반복되는 오브젝트를 재사용하는 Unity 풀링 기본 패턴입니다.
4 cards
using UnityEngine.SceneManagement;
public void LoadGameScene()
{
SceneManager.LoadScene("Game");
}`SceneManager.LoadScene`로 씬을 바꾸고, 빌드 세팅과 비동기 로딩을 함께 이해하는 기본 카드입니다.
private void Awake()
{
DontDestroyOnLoad(gameObject);
}씬이 바뀌어도 유지되어야 하는 매니저나 음악 오브젝트를 다룰 때 쓰는 `DontDestroyOnLoad` 기본 패턴입니다.
[CreateAssetMenu(menuName = "Data/Weapon Data")]
public class WeaponData : ScriptableObject
{
public string weaponName;
public int damage;
}씬 오브젝트가 아닌 에셋 형태로 설정과 데이터를 분리할 때 유용한 Unity `ScriptableObject` 기본 패턴입니다.
PlayerPrefs.SetFloat("music_volume", 0.8f);
float volume = PlayerPrefs.GetFloat("music_volume", 1f);
PlayerPrefs.Save();간단한 설정값과 진행 상태를 저장할 때 자주 쓰는 `PlayerPrefs` 기본 패턴과 한계를 정리합니다.
6 cards
[SerializeField] private Button startButton;
private void Awake()
{
startButton.onClick.AddListener(HandleStartClicked);
}메뉴와 팝업 UI에서 자주 쓰는 `Button.onClick` 연결과 버튼 이벤트 처리 기본 흐름을 정리합니다.
animator.SetBool("IsRunning", true);
animator.SetTrigger("Attack");상태 전환을 코드에서 제어하기 위해 `Animator`의 Bool, Float, Trigger 파라미터를 다루는 기본 패턴입니다.
Canvas
Static HUD Canvas
Dynamic Popup Canvas자주 바뀌는 UI와 거의 바뀌지 않는 UI를 같은 Canvas에 두지 않는 Unity UI 최적화 기본 원칙입니다.
클릭 불필요 이미지:
- Raycast Target 해제클릭 대상이 아닌 UI까지 전부 레이캐스트 후보로 두지 않기 위한 Unity Graphic Raycaster 최적화 기본 카드입니다.
VerticalLayoutGroup
ContentSizeFitter자동 정렬이 편하지만 자주 갱신될수록 비용이 커질 수 있는 Unity Layout Group의 사용 기준을 정리합니다.
panel.SetActive(false);풀스크린 UI를 가릴 때 단순 투명도 조절보다 더 적절한 비활성화 전략을 선택하는 Unity 기본 가이드입니다.
8 cards
Window > Analysis > ProfilerCPU, GPU, 메모리, 렌더링 병목을 찾기 위한 Unity Profiler의 가장 기본적인 읽는 법을 정리합니다.
Window > Analysis > Memory Profiler
스냅샷 캡처 -> 비교메모리 사용량, 스냅샷 비교, 메모리 예산 관점으로 Unity Memory Profiler를 읽는 기본 흐름입니다.
프로파일 캡처 A
프로파일 캡처 B
Profile Analyzer에서 비교변경 전후 프로파일 데이터를 나란히 비교해 성능 회귀를 잡는 Unity Profile Analyzer 기본 카드입니다.
Window > Analysis > Frame Debugger
Enable드로우콜과 오버드로우를 눈으로 추적하기 위한 Unity Frame Debugger의 핵심 사용 흐름을 정리합니다.
60 fps 목표 -> 프레임 예산 약 16.67 ms
30 fps 목표 -> 프레임 예산 약 33.33 ms목표 프레임 시간과 플랫폼 메모리 한도를 기준으로 성능 예산을 잡는 Unity 최적화 출발점을 정리합니다.
Edit > Project Settings > Time
Fixed Timestep = 0.02
Maximum Allowed Timestep = 0.3333333물리 시뮬레이션 빈도와 스터터를 함께 고려해 `Fixed Timestep`과 `Maximum Allowed Timestep`을 조정하는 기본 카드입니다.
private readonly Collider[] results = new Collider[16];
int hitCount = Physics.OverlapSphereNonAlloc(transform.position, radius, results);반복적인 Overlap과 Raycast 결과 수집에서 GC 할당을 줄이기 위한 Unity NonAlloc 쿼리 패턴입니다.
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
Assets/
ProjectName/
Art/
Audio/
Materials/
Prefabs/
Scenes/
Scripts/
UI/
ThirdParty/Unity 프로젝트를 오래 유지하기 쉽게 만드는 폴더 구조, 이름 규칙, 내부 자산 분리 원칙을 정리합니다.
Player.prefab
Player.prefab.metaUnity 프로젝트에서 `.meta` 파일을 왜 함께 관리해야 하는지, Preset으로 설정을 표준화하는 방법을 정리합니다.
public interface IUpdatable
{
void Tick();
}수많은 `Update` 호출을 그대로 두지 않고 갱신 대상을 중앙에서 제어하는 Unity Update Manager 패턴입니다.
private Renderer cachedRenderer;
private void Awake()
{
cachedRenderer = GetComponent<Renderer>();
}`Update` 안에서 반복되는 `GetComponent`, 검색, 속성 조회를 줄이기 위한 Unity 캐싱 기본 패턴입니다.
[System.Diagnostics.Conditional("ENABLE_LOG")]
public static void Log(object message)
{
Debug.Log(message);
}개발 중에는 로그를 유지하되, 릴리스 빌드에서는 과도한 `Debug.Log` 비용을 줄이는 Unity 기본 전략입니다.
private static readonly int SpeedId = Animator.StringToHash("Speed");
private static readonly int ColorId = Shader.PropertyToID("_BaseColor");Animator, Material, Shader 속성 접근에서 문자열 대신 해시 ID를 캐싱해 쓰는 Unity 기본 패턴입니다.
Runtime.asmdef
Editor.asmdef
Tests.asmdef스크립트 컴파일 범위를 줄이고 의존성을 분리하기 위한 Unity Assembly Definition 기본 개념을 정리합니다.
[Test]
public void AddScore_Increases_Value()
{
Assert.AreEqual(10, score);
}자동화된 테스트를 Unity 프로젝트에 붙이기 위한 Unity Test Framework의 기본 역할과 흐름을 정리합니다.
EditMode: 순수 로직 테스트
PlayMode: 씬과 런타임 동작 테스트빠른 로직 검증용 EditMode 테스트와 씬/런타임 흐름 확인용 PlayMode 테스트 차이를 정리합니다.
[CreateAssetMenu(menuName = "Events/Game Event")]
public class GameEvent : ScriptableObject
{
public Action Raised;
public void Raise() => Raised?.Invoke();
}오브젝트끼리 직접 참조하지 않고 메시지를 연결하기 위한 ScriptableObject 기반 이벤트 채널 패턴을 정리합니다.