I'm not sure why, but the FadeIn_Enter function just doesn't get called with this code. No errors or anything and I can step over the line it should call the function but it doesn't. No debug statement is printed and it steps over it even if I try to step in. Any ideas why?
State.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class State
{
public Func<IEnumerator> Enter;
public Func<IEnumerator> Update;
public Func<IEnumerator> Exit;
}
StateManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StateManager
{
MonoBehaviour mainObj;
Dictionary<string, State> states = new Dictionary<string, State>();
string currentState = "";
string nextState = "";
public StateManager(MonoBehaviour obj)
{
mainObj = obj;
}
public void AddState(string name, State state)
{
states.Add(name, state);
}
public void SetState(string name)
{
nextState = name;
}
public IEnumerator Update()
{
while (true)
{
if (nextState != "")
{
if (currentState != "")
states[currentState].Exit?.Invoke();
currentState = nextState;
nextState = "";
//states[currentState].Enter?.Invoke();
var func = states[currentState].Enter;
func();
}
states[currentState].Update?.Invoke();
yield return null;
}
}
}
Dungeon.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Dungeon : MonoBehaviour {
public GameObject[] Battles;
private StateManager stateMgr;
// Use this for initialization
void Start ()
{
// hide all enemies under all battles but the first
for(var b = 1; b < Battles.Length; b++)
{
for( var i = 0; i < Battles[b].transform.childCount; i++)
{
Battles[b].transform.GetChild(i).gameObject.SetActive(false);
}
}
stateMgr = new StateManager(this);
stateMgr.AddState("fade.in", new State
{
Enter = FadeIn_Enter,
Update = FadeIn_Update
});
stateMgr.AddState("player.turn", new State
{
Enter = PlayerTurn_Enter,
Update = PlayerTurn_Update,
Exit = PlayerTurn_Exit
});
stateMgr.AddState("enemy.turn", new State
{
Enter = EnemyTurn_Enter,
Update = EnemeyTurn_Update,
Exit = EnemyTurn_Exit
});
stateMgr.SetState("fade.in");
StartCoroutine(stateMgr.Update());
}
// Update is called once per frame
void Update ()
{
}
private IEnumerator FadeIn_Enter()
{
// todo:
Debug.Log("FadeIn_Enter");
yield return new WaitForSeconds(5);
}
private IEnumerator FadeIn_Update()
{
Debug.Log("FadeIn_Update");
// todo: fade the screen in over time
// todo: when complete change the state to have the player go first
stateMgr.SetState("player.turn");
yield return null;
}
// the players turn enter state
private IEnumerator PlayerTurn_Enter()
{
Debug.Log("PlayerTurn_Enter");
// show ui
// pick which players turn it is
yield return null;
}
private IEnumerator PlayerTurn_Update()
{
Debug.Log("PlayerTurn_Update");
yield return null;
}
private IEnumerator PlayerTurn_Exit()
{
Debug.Log("PlayerTurn_Exit");
yield return null;
}
// the enemies turn state
private IEnumerator EnemyTurn_Enter()
{
Debug.Log("EnemyTurn_Enter");
yield return null;
}
private IEnumerator EnemeyTurn_Update()
{
Debug.Log("EnemyTurn_Update");
yield return null;
}
private IEnumerator EnemyTurn_Exit()
{
Debug.Log("EnemyTurn_Exit");
yield return null;
}
}