Хочу реализовать шаблон "Cостояние".
С этой целью я создал абстрактный класс "GameState" и пустой Gameobject в представлении Hierarchy с тем же именем.
Но стало ясно, что невозможно присоединить сценарий с абстрактным классом.
Тогда я прикрепил к скрипту "GameState" GameObject с классом "GameManager":
GameState.cs:
public abstract class GameState : MonoBehaviour
{
[SerializeField]
protected static GameObject gameManagerObject;
protected GameManager gameManager = gameManagerObject.GetComponent<GameManager>();
internal virtual void HandleButton(GameManager gameManager, PressedButton button)
{
ChangeState(gameManager, button);
}
protected abstract void ChangeState(GameManager gameManager, PressedButton button);
}
internal class StartState : GameState
{
internal StartState()
{
Debug.Log("Launch game");
}
protected override void ChangeState(GameManager gameManager, PressedButton button)
{
gameManager.State = new WorkState();
}
}
internal class WorkState : GameState
{
internal WorkState()
{
gameManager.DoSomething(false);
}
protected override void ChangeState(GameManager gameManager, PressedButton button)
{
gameManager.State = new PauseState();
}
}
internal class PauseState : GameState
{
internal PauseState()
{
Debug.Log("Pause");
gameManager.DoSomething(true);
}
protected override void ChangeState(GameManager gameManager, PressedButton button)
{
gameManager.State = new WorkState();
}
}
GameManager.cs:
public class GameManager : MonoBehaviour
{
internal GameState State { get; set; }
...
void Start()
{
...
State = new StartState();
}
public void FindOut(PressedButton button)
{
State.HandleButton(this, button);
}
...
}
Но при запуске появляется ошибка:
Это потому что я использую ключевое слово "new":
State = new StartState();
Как решить эту проблему?
Можно ли вообще таким образом реализовать паттерн "Состояние"? Как грамотно это сделать в Unity?