using System; using UnityEngine; using UVC.Core; namespace Sample { /* * ============================================================================ * Injector 샘플 - 인터페이스 및 순수 C# 클래스 * ============================================================================ * * 이 파일에는 MonoBehaviour가 아닌 인터페이스와 순수 C# 클래스가 정의되어 있습니다. * MonoBehaviour를 상속받는 클래스들은 별도 파일로 분리되어 있습니다. * * [ 4가지 등록 타입 ] * - Type A: 순수 C# 클래스 (new T()로 생성) * - Type B: MonoBehaviour 동적 생성 (별도 파일: InjectorSampleAudioManager.cs 등) * - Type C: Prefab 기반 MonoBehaviour (별도 파일: InjectorSampleUIManager.cs 등) * - Type D: Singleton 연동 (별도 파일: InjectorSampleSettingsManager.cs 등) * * [ 3가지 라이프사이클 ] * - App: 애플리케이션 전체 유지 (DontDestroyOnLoad) * - Scene: 현재 씬에서만 유지 (씬 전환 시 해제) * - Transient: 매번 새 인스턴스 생성 * * ============================================================================ */ #region ========== Type A: 순수 C# 인터페이스 및 클래스 ========== /// /// 로깅 서비스 인터페이스 - 애플리케이션 전역 로깅 기능을 제공합니다. /// /// /// 구현체: ConsoleLogger /// 등록: Injector.Register(ServiceLifetime.App) /// 사용: [Inject] private ILogService _logger; /// public interface ILogService { /// 일반 로그 메시지를 출력합니다. void Log(string message); /// 경고 로그 메시지를 출력합니다. void LogWarning(string message); /// 에러 로그 메시지를 출력합니다. void LogError(string message); } /// /// Type A 예시: 순수 C# 클래스 - Unity Debug.Log를 래핑한 콘솔 로거 /// /// /// 타입: Type A - 순수 C# 클래스 /// 라이프사이클: App (애플리케이션 전체 유지) /// 특징: /// /// MonoBehaviour가 아니므로 GameObject 없이 동작 /// new ConsoleLogger()로 생성됨 /// 모든 로그에 [ConsoleLogger] 접두어 추가 /// /// public class ConsoleLogger : ILogService { private readonly string _prefix = "[ConsoleLogger]"; public void Log(string message) => Debug.Log($"{_prefix} {message}"); public void LogWarning(string message) => Debug.LogWarning($"{_prefix} {message}"); public void LogError(string message) => Debug.LogError($"{_prefix} {message}"); } /// /// 씬 설정 인터페이스 - 현재 씬의 설정 정보를 제공합니다. /// /// /// 구현체: SceneConfig /// 등록: Injector.Register(ServiceLifetime.Scene) /// 또는 Factory: Injector.RegisterFactory(injector => new SceneConfig { ... }) /// public interface ISceneConfig { /// 현재 씬 이름 string SceneName { get; } /// 난이도 배율 (1.0 = 기본) float Difficulty { get; } } /// /// Type A 예시: 순수 C# 클래스 - 씬별 설정 정보 /// /// /// 타입: Type A - 순수 C# 클래스 /// 라이프사이클: Scene (씬 전환 시 해제) 또는 App (Factory 사용 시) /// 용도: 씬별 난이도, 이름 등 설정 정보 관리 /// public class SceneConfig : ISceneConfig { public string SceneName { get; set; } = "Default"; public float Difficulty { get; set; } = 1.0f; } /// /// 게임 서비스 인터페이스 - 게임 초기화 및 저장 기능을 제공합니다. /// /// /// 구현체: GameService /// 특징: 다른 서비스(ILogService)에 대한 의존성을 가짐 /// public interface IGameService { /// 게임을 초기화합니다. void Initialize(); /// 게임을 저장합니다. void SaveGame(); } /// /// Type A 예시: 순수 C# 클래스 - 다른 서비스에 대한 의존성 주입 /// /// /// 타입: Type A - 순수 C# 클래스 /// 라이프사이클: App /// 핵심 포인트: /// /// 순수 C# 클래스도 [Inject] 어트리뷰트로 의존성 주입 가능 /// Injector가 인스턴스 생성 후 자동으로 ILogService를 주입 /// 생성자 주입이 아닌 필드 주입 방식 사용 /// /// /// /// /// // 등록 /// Injector.Register(ServiceLifetime.App); /// /// // 사용 /// [Inject] private IGameService _gameService; /// _gameService.Initialize(); /// /// public class GameService : IGameService { [Inject] private ILogService _logger; public void Initialize() => _logger?.Log("GameService initialized"); public void SaveGame() => _logger?.Log("Game saved!"); } #endregion #region ========== Type B: MonoBehaviour 인터페이스 ========== /// /// 오디오 매니저 인터페이스 - BGM/SFX 재생 기능을 제공합니다. /// /// /// 구현체: InjectorSampleAudioManager (별도 파일) /// 타입: Type B - MonoBehaviour 동적 생성 /// 등록: Injector.Register(ServiceLifetime.App) /// 특징: 런타임에 새 GameObject가 생성되고 AudioSource 등 Unity 컴포넌트 활용 가능 /// public interface IAudioManager { /// 효과음을 재생합니다. void PlaySFX(string clipName); /// 배경음악을 재생합니다. void PlayBGM(string clipName); /// 모든 오디오를 중지합니다. void StopAll(); } /// /// 적 스포너 인터페이스 - 적 오브젝트 생성 기능을 제공합니다. /// /// /// 구현체: InjectorSampleEnemySpawner (별도 파일) /// 타입: Type B - MonoBehaviour 동적 생성 /// 등록: Injector.Register(ServiceLifetime.Scene) /// 라이프사이클: Scene - 씬 전환 시 적 스포너와 생성된 적들이 함께 정리됨 /// public interface IEnemySpawner { /// 지정된 위치에 적을 스폰합니다. void SpawnEnemy(Vector3 position); /// 현재 활성화된 적의 수 int EnemyCount { get; } } #endregion #region ========== Type C: Prefab 기반 인터페이스 ========== /// /// UI 매니저 인터페이스 - 팝업 및 로딩 UI 기능을 제공합니다. /// /// /// 구현체: InjectorSampleUIManager (별도 파일) /// 타입: Type C - Prefab 기반 MonoBehaviour /// 등록: Injector.RegisterPrefab(uiManagerPrefab, ServiceLifetime.App) /// 특징: /// /// 프리팹에 미리 설정된 UI 요소들이 유지됨 /// Inspector에서 시각적으로 UI 구성 가능 /// Canvas, Button, Text 등 Unity UI 컴포넌트 활용 /// /// public interface IUIManager { /// 팝업을 표시합니다. void ShowPopup(string title, string message); /// 팝업을 숨깁니다. void HidePopup(); /// 로딩 UI를 표시합니다. void ShowLoading(); /// 로딩 UI를 숨깁니다. void HideLoading(); } /// /// 씬 UI 인터페이스 - 씬별 HUD 기능을 제공합니다. /// /// /// 구현체: InjectorSampleSceneUI (별도 파일) /// 타입: Type C - Prefab 기반 MonoBehaviour /// 등록: Injector.RegisterPrefab(sceneUIPrefab, ServiceLifetime.Scene) /// 라이프사이클: Scene - 씬 전환 시 UI가 함께 정리됨 /// public interface ISceneUI { /// 씬 UI를 초기화합니다. void Initialize(); /// HUD를 표시합니다. void ShowHUD(); /// HUD를 숨깁니다. void HideHUD(); } #endregion #region ========== Transient 라이프사이클 ========== /// /// 요청 핸들러 인터페이스 - 개별 요청 처리 기능을 제공합니다. /// /// /// 구현체: RequestHandler /// 라이프사이클: Transient - 매번 새 인스턴스 생성 /// 용도: HTTP 요청, 이벤트 처리 등 상태를 공유하지 않아야 하는 경우 /// public interface IRequestHandler { /// 고유 요청 ID string RequestId { get; } /// 데이터를 처리합니다. void Process(string data); } /// /// Transient 라이프사이클 예시: 매번 새 인스턴스가 생성되는 클래스 /// /// /// 라이프사이클: Transient /// 특징: /// /// Resolve 호출 시마다 새 인스턴스 생성 /// 각 인스턴스는 고유한 RequestId를 가짐 /// 상태를 공유하지 않아야 하는 경우에 적합 /// /// /// /// /// // 등록 /// Injector.Register(ServiceLifetime.Transient); /// /// // 사용 - 매번 다른 인스턴스 /// var handler1 = Injector.Resolve(); // RequestId: "a1b2c3d4" /// var handler2 = Injector.Resolve(); // RequestId: "e5f6g7h8" /// /// public class RequestHandler : IRequestHandler { [Inject] private ILogService _logger; public string RequestId { get; } = Guid.NewGuid().ToString().Substring(0, 8); public void Process(string data) { _logger?.Log($"[{RequestId}] Processing: {data}"); } } #endregion }