[내일배움캠프 Unity 9기]

05/26 TIL Unity Fusion2 / 오브젝트 풀

kyvv 2025. 5. 26. 21:56

🧠 Summary

Unity와 Photon Fusion 2를 사용하여 네트워크 게임에서의 동기화 처리, 오브젝트 풀링 시스템 설계, 디자인 패턴(Singleton/Factory)에 대해 학습하였다.


📌 주요 키워드

Unity, Photon Fusion 2, Object Pooling, Singleton, Factory Pattern, ChangeDetector, SpawnManager


🔍 배운 내용 상세 정리

🕸️ Fusion 네트워크 동기화 시스템

  • [Networked] 속성은 상태 권한이 있는 클라이언트만 값 변경 가능.
  • 무권한 클라이언트가 값을 변경하면 이는 예측 상태로 반영되며 나중에 실제 값으로 덮어써짐.

🎯 ChangeDetector

  • ChangeDetector는 네트워크 동기화된 값의 변경을 감지.
  • RPC보다 정확한 타이밍으로 반응하여, 효과 처리에 적합.
  • 예: 색상 변경 시 MeshRenderer 업데이트.

🚫 예외: FailedClientCantSpawn

  • 상태 권한 없는 클라이언트가 Runner.Spawn() 호출 시 발생.
  • 항상 StateAuthority를 가진 주체에서 Spawn 수행 필요.

🏗️ 오브젝트 풀링 & SpawnManager 설계

✅ 구조

SpawnManager (Singleton)
 ├── PoolManager<Item>
 │    ├── ItemInstance
 │    └── ...
 └── PoolManager<Enemy>
      ├── EnemyInstance
      └── ...
  • PoolManager<T>는 Unity의 ObjectPool<T>를 활용.
  • 생성된 오브젝트는 SpawnManager 하위로 정리되어 Hierarchy 시각화 용이.

✅ 딕셔너리 vs 해시셋

  • 딕셔너리는 key-value 매핑이 가능해 타입별 오브젝트 관리에 적합.
  • enum 사용 시 컴파일 안정성 증가, string 사용 시 런타임 확장성 용이.

✅ 확장성의 의미

  • 런타임 시 새로운 타입을 쉽게 추가하거나 리소스를 주입할 수 있음.
  • 운영 중 새 리소스를 추가하고도 풀 시스템이 대응 가능함.

🧱 디자인 패턴 정리

✔️ 싱글톤

public static GameManager Instance {
    get {
        if (instance == null)
            instance = new GameObject("GameManager").AddComponent<GameManager>();
        return instance;
    }
}
  • Awake에서 중복 방지 및 DontDestroyOnLoad() 처리.
  • SpawnManager 역시 이 패턴 사용.

✔️ 팩토리 패턴

  • 오브젝트 생성을 중앙화하고 초기화 흐름을 통합.
  • 오브젝트 풀링과 함께 사용 시, 재사용 로직과 초기화를 분리 가능.

🛠️ 기타

  • abstract class는 인터페이스와 MonoBehaviour 동시 상속 가능.
  • Unity 기본 ObjectPool<T> 사용 가능하며, 커스터마이징 쉬움.
  • PoolManager<T>의 생성자에서 오브젝트를 부모 GameObject 하위로 설정 가능.

🔄 오늘의 고민과 해결

고민해결
string 키를 쓰는 이유? enum은 고정되어 있어 확장성 부족, string은 런타임 등록 가능
GameManager 없이 코드로 GameObject 만들 수 있나? new GameObject() + AddComponent<T>() 방식으로 가능
풀 오브젝트들이 Hierarchy에서 안 보이면? 풀의 부모 Transform을 SpawnManager로 지정해 시각화 가능
 

🔚 회고

  • 오브젝트 풀링 구조를 계층적으로 구성하면 디버깅이 수월하고 유지보수에 용이하다는 점을 알게 됨.
  • Fusion의 동기화 흐름은 예측과 실제 상태의 차이를 명확히 이해해야 함.
  • 디자인 패턴을 상황에 맞게 조합해서 사용하는 감각을 익히는 중.