본문으로 건너뛰기

TypeDataCache

위험

해당 스크립트 파일은 커스텀을 권장드리지 않습니다

TypeDataCache[GlobalInject] / [SceneInject] 메타데이터와 Setter,
[InjectConstructor] 관련 정보를 타입별로 캐싱하는 정적 헬퍼입니다.
런타임에서 직접 생성할 필요 없이 전부 정적 API입니다.


CachedInjectField

필드 하나당 다음을 묶습니다.

  • Name, FieldType, Optional, Id (Named 바인딩; 비어 있으면 무키)

  • Setter: (object target, object value) — 플랜이면 Roslyn이 넣은 대리, 폴백이면 Expression/SetValue에서 만든 것

주입 루프는 리플렉션으로 필드를 찾지 않고Setter만 호출합니다.


캐시 계층

저장소내용
_generatedGlobalCache / _generatedSceneCacheRoslyn RegisterGeneratedGlobalFields / RegisterGeneratedSceneFields 로 들어온 리스트
_globalInjectCache / _sceneInjectCache플랜이 없을 때 리플렉션으로 만든 리스트(세터 포함)
_constructorCacheGetInjectableConstructor 결과; null 도 캐시해 “주입 불가” 재탐색 방지
_generatedFactoryCacheRegisterGeneratedFactory / TryGetGeneratedFactory
_noInjectTypesHasAnyInjectField 음성 캐시

조회 우선순위(필드): 생성 플랜 → 폴백 캐시 → 첫 빌드 후 캐시 저장.


HasAnyInjectField

[GlobalInject] 또는 [SceneInject] 필드가 하나라도 있으면 true.
[Inject]만 있는 타입은 false이며, 음성 타입은 _noInjectTypes 에 넣어 다음부터 즉시 false.


Warmup / Warmup(params Type[])

지정 타입에 대해 GetGlobalInjectFields, GetSceneInjectFields, GetInjectableConstructor미리 호출해 캐시를 채웁니다.

  • 생성 플랜이 이미 있는 타입에서는 사실상 무비용에 가깝습니다.

  • 로딩 직후 스파이크를 줄이고 싶을 때 알려진 타입 묶음에 대해 호출하는 용도입니다.


스레드·도메인

  • 캐시 딕셔너리는 잠금 없음. 주석상 Unity 메인 스레드 전용,
    제너레이터 정적 초기화·RuntimeInitializeOnLoad도 메인 스레드라는 전제입니다.
위험

외부 스레드를 활용하지 마십시오. 안전성이 극도로 낮아집니다.

  • SubsystemRegistration 에서 모든 정적 캐시 클리어 — 도메인 리로드 관련 오염 방지.

공개 진단 헬퍼

에디터·그래프 등에서 쓰는 HasGeneratedGlobalPlan / HasGeneratedScenePlan / HasGeneratedFactory
“이 타입이 제너레이터 경로에 올라왔는지”를 빠르게 볼 때 사용합니다.


위험

사용자가 직접 부르지 않는 API

RegisterGenerated* 계열은 EditorBrowsable(Never)소스 제너레이터 전용입니다.
게임 코드에서 호출할 대상이 아닙니다.