유니티 게임 리펙토링

토토들·2026년 3월 5일

유니티로 4인 협동 게임을 만들던 도중, 코드 리펙토링을 하고 싶어서 관련 내용을 Gemini에게 물어봤다.

# 질문
Unity코드 리펙토링을 하려고 해. 유니티는 코드 개선이 됐는지 어떤 성능 지표로 판단해야되고,
Inspector로 추가하는 것과 코드로 추가하는 것의 성능 차이가 있어?

코드 개선이 실제 성능 향상으로 이어졌는지 확인하려면 Unity Profiler를 통해 다음 4가지를 중점적으로 보셔야 합니다.

지표설명리팩토링 시 체크 포인트
CPU Usage (ms)한 프레임을 처리하는 데 걸리는 시간Update, FixedUpdate 내부 로직이 과도하지 않은지 확인하고 불필요한 연산 제거
GC Alloc (Byte)가비지 컬렉션(GC)을 유발하는 메모리 할당량매 프레임 발생하는 new, string 연산, LINQ 등을 제거하여 GC 발생 최소화
Scripting (Time)순수하게 C# 스크립트 실행에 소요된 시간알고리즘 개선, 루프 구조 최적화 등 코드 성능 개선 결과 확인
Batches / SetPass Calls렌더링을 위해 CPU가 GPU에 보내는 명령 횟수매니저 패턴, 오브젝트 관리 방식 개선 등으로 렌더링 호출 수 감소 여부 확인

[!TIP]
Profile Analyzer 패키지를 사용하면 리팩토링 전(Before)과 후(After)의 데이터를 1대1로 비교하여 평균 프레임 변화량을 한눈에 볼 수 있습니다.

2. Inspector vs 코드 추가 (AddComponent) 성능 차이

결론부터 말하면 Inspector에서 미리 컴포넌트를 추가해 두는 방식이 성능상 훨씬 유리합니다.


1️⃣ Inspector에서 컴포넌트 추가 (Prefab)

항목설명
방식씬 로드 시점에 이미 직렬화(Serialization) 된 상태로 메모리에 올라옴
장점게임 실행(Runtime) 중 컴포넌트를 찾는 추가 연산이 없음
성능가장 빠름 — 데이터가 이미 준비된 상태

2️⃣ 코드로 컴포넌트 추가 (AddComponent<T>())

항목설명
방식실행 중에 엔진이 컴포넌트 타입 검색 → 메모리 할당 → 생명주기 함수 호출
내부 동작Awake, OnEnableUnity Lifecycle 함수 실행
단점추가적인 검색 비용 + 의존성 체크 비용 발생
성능❌ 상대적으로 비쌈

추가로 발생하는 비용

  • 타입 검색 비용
    엔진 내부 캐시에서 해당 스크립트를 찾는 과정 발생

  • 의존성 체크
    Rigidbody / Collider 등 다른 컴포넌트와의 관계 확인

⚠️ 특히 반복문이나 매 프레임에서 AddComponent 호출은 성능에 치명적입니다.


3. 리팩토링을 위한 실무 팁

성능과 코드 가독성을 동시에 개선하기 위한 Unity 리팩토링 가이드


1️⃣ Update 최소화

// ❌ 나쁜 예 (각 오브젝트가 Update 실행)
public class Enemy : MonoBehaviour
{
    void Update()
    {
        Move();
    }
}

// ✅ 좋은 예 (Manager가 일괄 처리)
public class EnemyManager : MonoBehaviour
{
    List<Enemy> enemies;

    void Update()
    {
        foreach (var enemy in enemies)
            enemy.Move();
    }
}

2️⃣ GetComponent 캐싱

// ❌ 매번 호출
void Update()
{
    GetComponent<Rigidbody>().velocity = Vector3.forward;
}


// ✅ 캐싱
Rigidbody _rb;

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

void Update()
{
    _rb.velocity = Vector3.forward;
}


3️⃣ AddComponent 대신 활성화/비활성화

// ❌ 비효율적인 방식
gameObject.AddComponent<BoxCollider>();
Destroy(GetComponent<BoxCollider>());

// ✅ 효율적인 방식
boxCollider.enabled = true;
boxCollider.enabled = false;


4️⃣ 문자열 비교 대신 CompareTag 사용

// ❌ GC 발생 가능
if (tag == "Player")

// ✅ Unity 최적화 함수
if (CompareTag("Player"))

결론 :
정리하면
코드는 깔끔해졌다고 해서 성능이 좋아진 것은 아니다.
반드시 Unity Profiler로 실제 성능 지표를 확인해야 한다.

profile
패션과 개발을 좋아합니다.

0개의 댓글