InGameView 구현하기
2019. 7. 27. 18:45ㆍ인 게임 상태 전환 구현
먼저 InGameManager를 바탕으로 View의 초기화하고 흐름을 실행할 함수를 구현합니다. 여기서는 테스트 목적으로 Update함수 안에 마우스를 클릭하면 실행하도록 구현했습니다.
public class InGameManager : MonoBehaviour
{
private void Awake()
{
mView.Initialize();
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
mView.StartState(InGameView.eState.Entry);
}
}
[SerializeField] private InGameView mView;
}
|
InGameView
먼저 Initialize함수를 통하여 흐름 객체들을 초기화합니다. 여기서 초기화만 할 뿐 흐름을 진행하지 않습니다.
흐름을 진행하려면 StartState 함수를 호출해야합니다. StartState 함수를 통하여 내부에서 시작 상태로 설정되고 View의 Update 문에서 내부의 상태에 따라서 처리가 이루어집니다.
NextState 함수는 현재 흐름 객체가 진행을 완료하면 다음 흐름을 매개인자로 넘겨서 진행을 하는 함수입니다.
public class InGameView : MonoBehaviour
{
//게임 매니저를 통해서 호출되는 함수.
public void Initialize()
{
mStates = GetFSMList();
if (mStates != null)
{
for (int i = 0; i < mStates.Count; ++i)
{
mStates[i].Initailize(this);
}
}
}
public void StartState(eState state)
{
if (mStates != null)
{
int next = (int)state;
if (next < mStates.Count)
{
State = state;
mCurrentState = mStates[(int)state];
mCurrentState.Start();
}
}
}
public void NextState(eState next)
{
//Do It...
if (next == eState.Exit)
{
Debug.Log("End Game");
}
else
{
StartState(next);
}
}
private void Update()
{
if (!IsPause())
{
if (mCurrentState != null)
{
mCurrentState.Update();
}
}
}
public void Pause(bool pause)
{
if (mCurrentState != null)
{
mCurrentState.Pause(pause);
}
}
public bool IsPause()
{
return
State == eState.None ||
State == eState.Pause;
}
private List<InGameStatee> GetFSMList()
{
List<InGameState> fsmList = null;
fsmList = new List<InGameState>
{
//인덱스 순서는 eGame 참고
new InGameEntrySingle(),//0 => eGame.Entry
new InGamePlay(),//1 => eGame.Play
new InGameResult()//2 => eGame.Result
};
#region Single, PvP/PTvPT
//switch (PlayData.Instance.PlayMode)
//{
// case PlayData.ePlayMode.Single:
// fsmList = new List<InGameState>
// {
// //인덱스 순서는 eGame 참고
// new InGameEntrySingle(),//0 => eGame.Entry
// new InGamePlay(),//1 => eGame.Play
// new InGameResult()//2 => eGame.Result
// };
// break;
// case PlayData.ePlayMode.PvP:
// case PlayData.ePlayMode.PTvPT:
// fsmList = new List<InGameState>
// {
// //인덱스 순서는 eGame 참고
// new InGameEntryPvP(),//0 => eGame.Entry
// new InGamePlay(),//1 => eGame.Play
// new InGameResult()//2 => eGame.Result
// };
// break;
//}
#endregion
return fsmList;
}
private List<InGameState> mStates;
private InGameState mCurrentState;
private eState State = eState.None;
public enum eState : byte
{
Entry = 0,
Play,
Result,
Replay,
Pause,
Resume,
Exit,
None = 127
}
}
|
GetFSMList 함수는 Initialize함수에서 실행되는 함수로써 진행될 흐름의 리스트를 리턴합니다. 스테이지 별로 흐름을 구성할 필요가 있다면 주석 부분과 같이 조건문을 통하여 초기화를 하면 됩니다.
'인 게임 상태 전환 구현 ' 카테고리의 다른 글
클래스 구조 (0) | 2019.07.27 |
---|---|
인 게임 흐름 객체화하기 (0) | 2019.07.27 |
FSM 구현하기 (0) | 2019.07.27 |
개요 (0) | 2019.07.27 |