// Use this for initialization
 void Awake()
 {
     // initialize state machine
     ai_state = new StateMachine<System.Object>();
     ai_state.AddState(ai_states.none, () => { });
     ai_state.AddState(ai_states.idle, OnIdleState);
     ai_state.AddState(ai_states.trace, OnTracingState);
     ai_state.AddState(ai_states.attack, OnAttackState);
     ai_state.AddState(ai_states.special_0, OnSpecial0State);
     ai_state.SetInitState(ai_states.idle);
 }
    // this should be called before its sibling
    public virtual void Start()
    {
        // initialize state machine
        unit_state = new StateMachine<unit_states>();
        unit_state.AddState(unit_states.none, () => { });
        unit_state.AddState(unit_states.act, UnitStateAct);
        unit_state.AddState(unit_states.actpause, UnitStateActPause);
        unit_state.SetInitState(unit_states.act);

        // add aura
        GameObject aura_object = (GameObject)Instantiate(Resources.Load("Prefabs/EnemyAura"), transform.position, new Quaternion());
        aura = aura_object.GetComponent<EnemyAttackAura>();
        aura.SetOwner(this);
    }