목차
1. Scene 관리 시스템
□ 의도
□ 설계
2. Scene 관리 구현방법과 상세 설명
□ IScene 인터페이스
□ GameManager
□ 전환 관리
□ 실제 사용 예시
3. 싱글톤 시스템
□ 의도
□ 설계
□ 개선사항
4. 싱글톤 구현방법과 상세설명
📝 Scene 관리 시스템
1. 의도
: 게임의 각 상태 (로비, 인벤토리, 상점 등)를 Scene으로 관리하고, Scene 간의 전환을 관리하기 위해서
2. 설계
□ SceneType라는 Enum을 통해 게임 Scene 타입 정의
□ IScene 인터페이스를 통해 각 Scene을 공통된 타입으로 관리
□ 씬 전환을 GameManager 를 통해 중앙에서 관리
📝 Scene 관리 구현방법과 상세 설명
1. IScene 인터페이스
interface IScene
{
// 씬에 들어갔을 때
public void SceneEntry();
// 씬에서 메인으로 동작할 로직
public void SceneMainFlow();
}
: 각 Scene이 필수로 구현해야할 동작을 정의한다.
□ SceneEntry()
■ Scene에서 초기 화면 구성 등의 기능이 실행된다.
□ SceneMainFlow()
■ 각 Scene에서 필요한 플레이어 입력처리, 상태 업데이트, 화면 출력 등의 기능이 실행된다.
2. 📝 GameManager.cs
enum SceneType
{
LobbyScene,
PlayerScene,
InventoryScene,
StoreScene,
RestScene,
DungeonScene
}
class GameManger : Singleton<GameManger>
{
// 씬 저장 리스트
private IScene[] gameScene;
private IScene nextScene;
private IScene preScene;
public GameManger()
{
int temp = Enum.GetNames(typeof(SceneType)).Length;
gameScene = new IScene[temp];
gameScene[(int)SceneType.LobbyScene] = LobbyScene.Instance;
gameScene[(int)SceneType.PlayerScene] = PlayerManager.Instance;
gameScene[(int)SceneType.InventoryScene] = InventoryManger.Instance;
gameScene[(int)SceneType.StoreScene] = StoreManager.Instance;
gameScene[(int)SceneType.RestScene] = RestScene.Instance;
gameScene[(int)SceneType.DungeonScene] = DungeonScene.Instance;
nextScene = gameScene[0];
}
}
□ Scene관리를 위한 배열
■ IScene 인터페이스 타입의 배열을 선언 -> 모든 Scene을 하나의 컨테이너에서 관리
■ nextScene과 preScene 변수를 통해 Scene 전환 추적 가능
□ Scene 등록
■ SceneType enum의 개수 만큼 배열 크기 동적할당
■ enum 값을 인덱스로 활용하여 Scene 인스턴스를 매핑
3. 씬 전환 관리
public void ChangeScene(SceneType type)
{
// 지금 씬 = 예전 씬으로
preScene = nextScene;
// 현재 씬 지정
nextScene = gameScene[(int)type];
// 현재씬 실행
if (preScene != nextScene)
nextScene.SceneEntry();
nextScene.SceneMainFlow();
}
□ 전환 로직
■ 이전 Scene 기록을 통해 히스토리 관리
■ SceneType enum의 인덱스에 해당하는 Scene을 현재 Scene으로 지정
□ Scene Entry() 실행
■ 이전 씬과 다른 Scene Type의 Scene인 경우에만 SceneEntry()를 실행
■ 불필요한 출력 방지
□ Scene MainFlow() 실행
■ 해당 Scnen의 주요 기능 실행
■ 입력처리 / 상태 업데이트 / 화면 출력 등을 실행
4. 실행 예시
-📝 LobbyScene.cs
private void ChangeScene(int input)
{
switch (input)
{
case 0:
// 플레이어 출력
PlayerManager.Instance.printPlayer();
// 로비로 씬 전환
GameManger.Instance.ChangeScene(SceneType.LobbyScene);
break;
case 1:
// 인벤토리로 씬 전환
GameManger.Instance.ChangeScene(SceneType.InventoryScene);
break;
case 2:
// 상점으로 씬 전환
GameManger.Instance.ChangeScene(SceneType.StoreScene);
break;
case 3:
// 던전 씬 전환
GameManger.Instance.ChangeScene(SceneType.DungeonScene);
break;
case 4:
// 휴식
GameManger.Instance.ChangeScene(SceneType.RestScene);
break;
case 5:
// 저장
GameManger.Instance.SaveData();
break;
default:
Console.WriteLine("잘못된 접근입니다. 다시 로비로 돌아갑니다");
// Lobby로 돌아가기
GameManger.Instance.ChangeScene(SceneType.LobbyScene);
break;
}
}
□ ChangeScene(int input)
■ 사용자 입력(input)에 따라 적절한 Scene으로 이동
📝 Singleton 관리
1. 의도
: 유니티 프로젝트를 하면서 싱글톤을 상위 클래스로 만들어서 관리한 적이 있는데 편리했던 기억이 있어서 c#에서도 편리할 거라고 예상했다.
2. 설계
□ 제네릭을 사용하여 다양한 타입의 클래스를 생성할 수 있도록 선언
3. 개선사항
: 상속을 사용하지 않고 클래스에 static을 붙여 전역에서 사용하는 방법도 가능할 것 같다.
📝 Singleton관리 구현방법과 상세 설명
1. 📝 Singleton<T>.cs
class Singleton<T>
where T : class , new()
{
private static T instance;
public static T Instance
{
get
{
if (instance == null)
instance = new T();
return instance;
}
}
}
□ 제네릭 <T>
■ 다양한 참조 타입의 인스턴스 생성이 가능
■ where 제약조건을 통해 <T>는 참조타입 class와 매개변수가 없는 생성자를 가진 클래스만 허용
□ Instance 프로퍼티
■ 최초 호출 시 인스턴스를 생성하며, 이후에는 동일한 인스턴스를 반환
📝 깃허브
https://github.com/kimYouChae/SpartaCodingClub
GitHub - kimYouChae/SpartaCodingClub
Contribute to kimYouChae/SpartaCodingClub development by creating an account on GitHub.
github.com
📝 추후
: 저장시스템
: 아이템 구조 or 관리 방법
'c#' 카테고리의 다른 글
[c#] LINQ 이해하기 (0) | 2025.02.11 |
---|---|
[c#]delegate 이해하기 (1) | 2025.02.10 |
[c#][TextRPG] 3. c#의 System.IO를 이용한 파일 시스템 작업 (0) | 2025.02.07 |
[c#][TextRPG] 2. NewtonJson으로 직렬화&역직렬화 (1) | 2025.02.06 |
[c#] Interface 이해하기 (0) | 2025.02.03 |