hey, i met really weird situation that my codes crashes only on iOS run.
i couldn’t solve it! it makes me mad. here’s my codes:
using System.Collections.Generic;
[System.Serializable]
public class ExclusiveFSM<T> : System.Object
{
// Public Member Variables
//-----------------------------------------------------------------------
public delegate void ParamEventDelegate(ExclusiveFSM<T> fsm, object param);
public delegate void EventDelegate(ExclusiveFSM<T> fsm);
public event ParamEventDelegate OnStateBegin = delegate { };
public event EventDelegate OnStateUpdate = delegate { };
public event EventDelegate OnStateEnd = delegate { };
// Hidden Member Variables
//-----------------------------------------------------------------------
protected class StateQueueEntry
{
public float delay;
public T state;
public object param;
public StateQueueEntry(float delay, T state, object param)
{
this.delay = delay;
this.state = state;
this.param = param;
}
}
protected Queue<StateQueueEntry> stateQueue = new Queue<StateQueueEntry>();
protected T currentState;
protected T previousState;
protected float currentStateTime = 0.0f;
// Public Methods
//-----------------------------------------------------------------------
public void Update(float deltaTime)
{
currentStateTime += deltaTime;
OnStateUpdate(this);
ProcessStateQueue();
}
public void Play(T newState, object param)
{
stateQueue.Clear();
TransitState(newState, param, 0.0f);
}
public void Play(T newState)
{
Play(newState, null);
}
public void Blend(T newState, object param)
{
if (!currentState.Equals(newState))
{
stateQueue.Clear();
TransitState(newState, param, 0.0f);
}
}
public void Blend(T newState)
{
Blend(newState, null);
}
public void Queue(float delay, T newState, object param)
{
stateQueue.Enqueue(new StateQueueEntry(delay, newState, param));
}
public void Queue(float delay, T newState)
{
Queue(delay, newState, null);
}
public T CurrentState
{
get { return currentState; }
}
public T PreviousState
{
get { return previousState; }
}
public float CurrentStateTime
{
get { return currentStateTime; }
set { currentStateTime = value; }
}
// Hidden Methods
//-----------------------------------------------------------------------
protected void TransitState(T newState, object param, float initialStateTime)
{
OnStateEnd(this);
previousState = currentState;
currentState = newState;
currentStateTime = initialStateTime;
OnStateBegin(this, param);
}
protected void ProcessStateQueue()
{
if (stateQueue.Count == 0)
return;
StateQueueEntry entry = stateQueue.Peek();
float deltaTime = currentStateTime - entry.delay;
if (deltaTime > 0.0f)
{
stateQueue.Dequeue();
TransitState(entry.state, entry.param, deltaTime);
}
}
}
below is one which uses it.
using UnityEngine;
public class TestDelegateCrash : MonoBehaviour
{
public enum State
{
Dumb,
Dumber,
Dumbest
}
ExclusiveFSM<State> fsm = new ExclusiveFSM<State> ();
void Awake ()
{
fsm.OnStateBegin += OnStateBegin;
fsm.OnStateUpdate += OnStateUpdate;
fsm.Play (State.Dumb);
}
void Update ()
{
fsm.Update (Time.deltaTime);
}
protected virtual void OnStateBegin (ExclusiveFSM<State> fsm, object param)
{
Debug.Log ("Dumb");
}
protected virtual void OnStateUpdate (ExclusiveFSM<State> fsm)
{
Debug.Log ("Dumbing");
}
}
when i run this behavior on editor, it works perfectly. but if i deploy on iOS it crashes all time!
call stack says it crashed on line of code:
fsm.OnStateBegin += OnStateBegin;
any ideas? i deadlocked on this issue