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<ILogService, ConsoleLogger>(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<ISceneConfig, SceneConfig>(ServiceLifetime.Scene)
/// 또는 Factory: Injector.RegisterFactory<ISceneConfig>(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<IGameService, GameService>(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<IAudioManager, InjectorSampleAudioManager>(ServiceLifetime.App)
/// 특징: 런타임에 새 GameObject가 생성되고 AudioSource 등 Unity 컴포넌트 활용 가능
///
public interface IAudioManager
{
/// 효과음을 재생합니다.
void PlaySFX(string clipName);
/// 배경음악을 재생합니다.
void PlayBGM(string clipName);
/// 모든 오디오를 중지합니다.
void StopAll();
}
///
/// 적 스포너 인터페이스 - 적 오브젝트 생성 기능을 제공합니다.
///
///
/// 구현체: InjectorSampleEnemySpawner (별도 파일)
/// 타입: Type B - MonoBehaviour 동적 생성
/// 등록: Injector.Register<IEnemySpawner, InjectorSampleEnemySpawner>(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<IUIManager>(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<ISceneUI>(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<IRequestHandler, RequestHandler>(ServiceLifetime.Transient);
///
/// // 사용 - 매번 다른 인스턴스
/// var handler1 = Injector.Resolve<IRequestHandler>(); // RequestId: "a1b2c3d4"
/// var handler2 = Injector.Resolve<IRequestHandler>(); // 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
}