// Use this for initialization void Awake() { lightOpenState = new XANState("LightOpenState"); lightCloseState = new XANState("LightClosrState"); lightOpenState.OnEnter += (IState state) => { Debug.Log("LightOpenState _OnEnter"); }; lightOpenState.OnUpdate += (float f) => { }; lightOpenState.OnExit += OpenExit; lightCloseState.OnEnter += (IState state) => { }; }
private bool isToMove = false; // Cube 是否可以移動 // Use this for initialization void Start() { //初始化 Cube Idle 狀態,並且設置進入狀態打印 cube_Idle = new XANState("CubeIdle"); cube_Idle.OnEnter += (IState state) => { Debug.Log("进入Idle状态"); }; //初始化 Cube Move 狀態,並且設置進入狀態打印 cube_Move = new XANState("CubeMove"); cube_Move.OnEnter += (IState state) => { Debug.Log("进入Move状态"); }; // cube_Move 狀態添加 OnUpdate 事件,向前移動 Cube cube_Move.OnUpdate += (float f) => { transform.position += Vector3.forward * f * moveSpeed; }; //初始化 Cube 的 Idle 過渡到 Move,并根據 isToMove,判斷是否可以移動 cube_IdleToMove = new XANTransition("IdleToMove", cube_Idle, cube_Move); cube_IdleToMove.OnShouldBeginTransition += () => { return(isToMove); }; //初始化 Cube 的 Move 過渡到 Idle,并根據 isToMove,判斷是否可以移動 cube_MoveToIdle = new XANTransition("MoveToIdle", cube_Move, cube_Idle); cube_MoveToIdle.OnShouldBeginTransition += () => { return(!isToMove); }; //把 Cube 的 Idle 過渡到 Move 添加到 Cube Idle 狀態 cube_Idle.AddTransition(cube_IdleToMove); //把 Cube 的 Move 過渡到 Idle 添加到 Cube Move 狀態 cube_Move.AddTransition(cube_MoveToIdle); //初始化狀態機,設置 Cube Idle狀態為默認狀態 FSM = new XANStateMachine("CubeFSM", cube_Idle); //並把 Cube Idle 和 Cube Move 狀態添加到狀態列表中 FSM.AddState(cube_Idle); FSM.AddState(cube_Move); }
/// <summary> /// 初始化狀態機 /// </summary> private void InitFSM() { //初始化 Light 光強變化的狀態,並在進入時設置可以 Light 動畫和重置動畫為 true light_OpenChangeIntensity = new XANState("LightOpen_ChangeIntensity"); light_OpenChangeIntensity.OnEnter += (IState state) => { isAnimation = true; isResetAnimation = true; }; //Light 光強變化狀態的 OnUpdate,光強明暗變化 light_OpenChangeIntensity.OnUpdate += (float f) => { if (isAnimation == true) { if (isResetAnimation == false) { if (FadeTo(randomValue)) { isResetAnimation = true; } } else { if (FadeTo(lightIntensityMax)) { isResetAnimation = false; isAnimation = false; } } } else { randomValue = Random.Range(0.2f, 0.4f); isAnimation = true; } }; //初始化 Light 顏色變化的狀態,並在進入時設置可以 Light 動畫為 true light_OpenChangeColor = new XANState("LightOpen_ChangeColor"); light_OpenChangeColor.OnEnter += (IState state) => { //設置為false,是讓他首先生成一個隨機顏色在進入動畫 //不然,每次都是默認第一個隨機色為黑色 color(0,0,0) isAnimation = false; }; //Light 顏色變化的狀態 的 OnUpdate,顏色隨機漸漸變化 light_OpenChangeColor.OnUpdate += (float f) => { //進入動畫 if (isAnimation == true) { //根據 colorTime 變化時長來判定是否變化OK,變化完重置時間 if (colorTimer >= 1f) { isAnimation = false; colorTimer = 0.0f; } else { //這樣設置能保證Lerp變為勻速和時間,後面 * X 就為幾秒 colorTimer += Time.deltaTime; _light.color = Color.Lerp(lastColor, randomColor, colorTimer); } //未進入動畫前隨機生成一個顏色,并記錄當前顏色,然後開始動畫true } else { float r = Random.Range(0.0f, 1.0f); float g = Random.Range(0.0f, 1.0f); float b = Random.Range(0.0f, 1.0f); randomColor = new Color(r, g, b); lastColor = _light.color; isAnimation = true; } }; //Light Open 狀態機 光強變化過度到顏色變化初始化,并添加過渡 isIntensityToColor 判斷 light_OpenIntensityToColor = new XANTransition("LightOpenIntensityToColor", light_OpenChangeIntensity, light_OpenChangeColor); light_OpenIntensityToColor.OnShouldBeginTransition += () => { return(isIntensityToColor); }; //Light Open 狀態機 光強變化過度到顏色變化 添加到 Light Open 狀態機 光強變化狀態 light_OpenChangeIntensity.AddTransition(light_OpenIntensityToColor); //Light Open 狀態機 顏色變化過度到光強變化初始化,并添加過渡 isIntensityToColor 判斷 Light_OpenColorToIntensity = new XANTransition("LightOpenColorToIntensity", light_OpenChangeColor, light_OpenChangeIntensity); Light_OpenColorToIntensity.OnShouldBeginTransition += () => { return(!isIntensityToColor); }; //Light Open 狀態機 顏色變化過度到光強變化 添加到 Light Open 狀態機 顏色變化狀態 light_OpenChangeColor.AddTransition(Light_OpenColorToIntensity); //初始化 light Open 狀態機,并設置光強變化為默認狀態 //添加 光強變化和顏色變化狀態到 Light Open 狀態列表中 light_Open = new XANStateMachine("LightOpen", light_OpenChangeIntensity); light_Open.AddState(light_OpenChangeIntensity); light_Open.AddState(light_OpenChangeColor); //初始化 Light Close狀態 light_Close = new XANState("LightClose"); //Light Open 狀態進入狀態事件光強最大光強,并打印 light_Open.OnEnter += (IState state) => { _light.intensity = lightIntensityMax; Debug.Log("进入打开状态"); }; //Light Close 狀態進入時設置光強為 0,并打印 light_Close.OnEnter += (IState state) => { _light.intensity = 0.0f; Debug.Log("进入关闭状态"); }; //Light Open 過渡到 Close 初始化,并添加過渡 isOpen 判斷 light_OpenToClose = new XANTransition("LightOpenToClose", light_Open, light_Close); light_OpenToClose.OnShouldBeginTransition += () => { return(!isToOpen); }; //Light Open 過渡到 Close 過渡,燈光漸漸變暗 light_OpenToClose.OnTransitionCallBack += () => { return(FadeTo(0.0f)); }; //把 Light Open 過渡到 Close 添加到 light Open狀態機 light_Open.AddTransition(light_OpenToClose); //Light Close 過渡到 Open 初始化,并添加過渡 isOpen 判斷 light_CloseToOpen = new XANTransition("LightCloseToOpen", light_Close, light_Open); light_CloseToOpen.OnShouldBeginTransition += () => { return(isToOpen); }; //Light Close 過渡到 Open 過渡,燈光漸漸變亮 light_CloseToOpen.OnTransitionCallBack += () => { return(FadeTo(lightIntensityMax)); }; //把Light Close 過渡到 Open 過渡添加到 Light Close 狀態中 light_Close.AddTransition(light_CloseToOpen); //初始化狀態佳,設置默認為打開狀態,并添加兩個狀態到狀態列表中 FSM = new XANStateMachine("LightFSM", light_Open); FSM.AddState(light_Open); FSM.AddState(light_Close); }
/// <summary> /// 初始化狀態機函數 /// </summary> private void InitFSM() { //初始化 Light Open 和 Close 狀態 light_Open = new XANState("LightOpen"); light_Close = new XANState("LightClose"); //Light Open 狀態進入狀態事件光強最大光強,并打印 light_Open.OnEnter += (IState state) => { _light.intensity = lightIntensityMax; Debug.Log("进入打开状态"); }; //Light Open 狀態,光強明暗變化 light_Open.OnUpdate += (float f) => { if (isAnimation == true) { if (isResetAnimation == false) { if (FadeTo(randomValue)) { isResetAnimation = true; } } else { if (FadeTo(lightIntensityMax)) { isResetAnimation = false; isAnimation = false; } } } else { randomValue = Random.Range(0.2f, 0.4f); isAnimation = true; } }; //Light Close 狀態進入時設置光強為 0,并打印 light_Close.OnEnter += (IState state) => { _light.intensity = 0.0f; Debug.Log("进入关闭状态"); }; //Light Open 過渡到 Close 初始化,并添加過渡 isOpen 判斷 light_OpenToClose = new XANTransition("LightOpenToClose", light_Open, light_Close); light_OpenToClose.OnShouldBeginTransition += () => { return(!isToOpen); }; //Light Open 過渡到 Close 過渡,燈光漸漸變暗 light_OpenToClose.OnTransitionCallBack += () => { return(FadeTo(0.0f)); }; //把 Light Open 過渡到 Close 添加到 light Open狀態 light_Open.AddTransition(light_OpenToClose); //Light Close 過渡到 Open 初始化,并添加過渡 isOpen 判斷 light_CloseToOpen = new XANTransition("LightCloseToOpen", light_Close, light_Open); light_CloseToOpen.OnShouldBeginTransition += () => { return(isToOpen); }; //Light Close 過渡到 Open 過渡,燈光漸漸變亮 light_CloseToOpen.OnTransitionCallBack += () => { return(FadeTo(lightIntensityMax)); }; //把Light Close 過渡到 Open 過渡添加到 Light Close 狀態中 light_Close.AddTransition(light_CloseToOpen); //初始化狀態佳,設置默認為打開狀態,并添加兩個狀態到狀態列表中 FSM = new XANStateMachine("LightFSM", light_Open); FSM.AddState(light_Open); FSM.AddState(light_Close); }