static void DummyFsmUpdate(FSM fsm)
	{
		//const int updatePerMs = (int)(1f / 60f * 1000);
		const int updatePerMs = (int)(1000);
		
		bool speedAdding = true;
		bool gravityAdding = false;
		bool hpAdding = false;
		
		int perNumGravityEnabled = 5;
		int gravityNum = 0;
		
		//		var task = Task.Factory.StartNew((Action)(() =>
		
//		while (true)
//		{
			fsm.Update();
			
			var speed = fsm.GetParamValue<int>(P_SPEED);
			var hp = fsm.GetParamValue<int>(P_HP);
			var gravity = fsm.GetParamValue<int>(P_GRAVITY);
			
			if (hp <= -5) hpAdding = true;
			else if (hp > 100) hpAdding = false;
			hp += (hpAdding ? 4 : -4);
			
			fsm.SetParamValue(P_HP, hp); // minus 10 hp per frame, to dead when hp less and equals 0
			
			if (hp > 0) // is alive, then to do somthing...
			{
				if (speed <= 0) speedAdding = true;
				else if (speed > 20) speedAdding = false;
				fsm.SetParamValue(P_SPEED, (speed + (speedAdding ? 1 : -1))); // to run when speed greater and equals 10, back to idle when speed less than 10
				
				if (gravity <= -10) gravityAdding = true;
				else if (gravity > 10)  gravityAdding = false;
				fsm.SetParamValue(P_GRAVITY, (gravity + (gravityAdding ? 1 : -1))); // to fly when gravity less and equals 0
				
				gravityNum += 1;
				if (gravityNum % perNumGravityEnabled == 0)
				{
					fsm.SetParamValue(P_GRAVITY_ENABLED, !fsm.GetParamValue<bool>(P_GRAVITY_ENABLED));
				}
			}
//			Thread.Sleep(updatePerMs);
//		}
	}
	public override void EnterState(FSM fsm)
	{
		Debug.Log(string.Format("->Enter State : {0}", Name));
		Debug.Log(string.Format("Oh~~ Shit!!! NO! NO! NO!"));
		// enter dead state, initialize params
		fsm.SetParamValue(TestFSM.P_SPEED, (int)0);
		fsm.SetParamValue(TestFSM.P_GRAVITY, (int)10);
	}
	public bool checkLife(FSM fsm)
	{
		float curHP = m_unit.getCurProperty((int)GlobalDef.NewHeroProperty.PRO_LIFEPOINT);
		float maxHP = m_unit.getProperty((int)GlobalDef.NewHeroProperty.PRO_LIFEPOINT);
		float percent = curHP / maxHP;

		//检测逃跑
		for(int i = 0; i < hpPercentRunaway.Length; i++)
		{
			if(percent <= hpPercentRunaway[i] && canRunaway[i] == true)
			{
				canRunaway[i] = false;
				fsm.SetParamValue(AI_Define.P_STATE, (int)AI_Define.AI_State.S_RUN_AWAY);
				return true;
			}
		}
		//检测翻滚
		int energy = (int)m_unit.getCurProperty ((int)GlobalDef.NewHeroProperty.PRO_MOVEPOWER);
		for(int i = 0; i < hpPercent.Length; i++)
		{
			if(percent < hpPercent[i] && canRoll[i] && energy > 0)
			{
				canRoll[i] = false;
				fsm.SetParamValue(AI_Define.P_STATE, (int)AI_Define.AI_State.S_ROLLINGBACK);
				return true;
			}
		}
		return false;
	}