I'm working on a game with unity, and I've created a state manager for the in-game state of certain organisms. Each state implements a ISimpleStateManager interface, but some have unique behavior and need to do different things when their state is updated:
interface IOrganismStateManager {
void SetIdle();
void SetRunning(float dir);
void SetCarryingItem(Item item);
}
enum OrganismtState {
idle,
running,
carryingItem,
}
class OrganismStateManager : IOrganismStateManager {
Dictionary<OrganismtState, ISimpleStateManager> _states = new Dictionary<OrganismtState, ISimpleStateManager>() {
{ OrganismtState.idle, new SimpleStateManager() },
{ OrganismtState.running, new RunningStateManager() },
{ OrganismtState.carryingItem, new CarryingItemStateManager() },
}
public void SetIdle() {
_states[OrganismtState.idle].SetActive(true);
}
public void SetRunning(float dir) {
var stateManager = _states[OrganismtState.running];
stateManager.SetActive(true);
var runningManager = (RunningStateManager) stateManager;
runningManager.SetDirection(dir);
}
public void SetCarryingItem(Item item) {
var stateManager = _states[OrganismtState.carryingItem];
stateManager.SetActive(true);
var runningManager = (CarryingItemStateManager) stateManager;
runningManager.SetCarriedItem(item);
}
}
interface ISimpleStateManager {
void SetActive(bool active);
}
class SimpleStateManager : ISimpleStateManager {
protected bool _active = false;
public virtual void SetActive(bool active) {
_active = active;
}
}
class RunningStateManager : SimpleStateManager, ISimpleStateManager {
float _direction;
public void SetDirection(float dir) {
_direction = dir;
}
}
class CarryingItemStateManager : SimpleStateManager, ISimpleStateManager {
Item _carriedItem;
public void SetCarriedItem(Item item) {
_carriedItem = item;
}
}
The solution I've landed on is to cast the interface type to the concrete class type for a given state manager, and then call a method on it directly.
I can think of a few other solutions, but I wanted to know if there's a best-practice approach to this kind of situation.