숏컷 코드
공유 가능한 것
-> mesh / icon / base stat / config
개별 상태
-> hp / position / cooldown / target문법과 예시
플라이웨이트의 핵심은 "공유 데이터"와 "개별 상태"를 분리하는 것이다
수백 개 적이 같은 모델과 기본 설정을 쓰는데 각 인스턴스가 그것을 개별로 들고 있으면 메모리와 관리 비용이 낭비됩니다. Flyweight는 바뀌지 않는 공통 데이터를 공유 자산으로 빼고, 인스턴스마다 다른 상태만 별도로 둡니다.
Unity에서는 ScriptableObject, shared material, 설정 자산이 대표적인 flyweight 수단이다
무기 기본 스탯, 적 종족 데이터, 아이콘 메타데이터, 공용 VFX 설정은 자산으로 공유하기 좋습니다. 반대로 현재 HP, 현재 타겟, 남은 쿨다운 같은 값은 개별 상태로 둬야 합니다.
공유 자산
- EnemyArchetype.asset
- baseHp
- moveSpeed
- icon
개별 인스턴스
- currentHp
- currentTarget
- worldPosition실패는 공유 자산에 런타임 상태를 섞을 때 나온다
공유해야 할 자산에 인스턴스별 상태를 넣는 순간 모든 인스턴스가 같은 값을 보게 됩니다. ScriptableObject를 flyweight처럼 쓸 때 특히 자주 나는 실수입니다.
메모리 절감보다 authoring 단순화가 더 큰 이점일 때도 많다
flyweight는 메모리 절감 패턴으로만 읽기 쉽지만, 실제 Unity 작업에서는 밸런스 데이터와 공용 설정을 한 자산에서 관리할 수 있다는 authoring 이점도 큽니다. 즉 "수천 개체 메모리 최적화"뿐 아니라 "같은 규칙을 한곳에서 바꿀 수 있는가"도 선택 기준입니다.
flyweight를 고를 때 핵심
| 상황 | 적합한 선택 |
|---|---|
| 같은 설정과 리소스를 많은 개체가 공유할 때 | flyweight 후보 |
| 인스턴스마다 변하는 상태일 때 | 개별 인스턴스 필드 유지 |
| 읽기 전용 기본 데이터일 때 | ScriptableObject / shared asset |
| 런타임 중 자주 바뀌는 값일 때 | shared data에 넣지 않기 |
특이 케이스와 주의할 점
흔한 실패는 공유 자산을 편의 저장소처럼 써서 런타임 상태를 써 버리는 것입니다. 그러면 모든 인스턴스가 같은 값을 공유해 버그가 즉시 퍼집니다. 읽기 전용 기본값과 개별 상태를 반드시 분리하세요.
실패 예시
- EnemyArchetype.asset.currentHp 값을 전투 중 갱신
결과
- 같은 archetype을 쓰는 모든 적이 상태를 공유
- 저장/로드와 디버깅도 꼬임참고 링크
1 sources