Ejemplo n.º 1
0
    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);
    }
Ejemplo n.º 2
0
    /// <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);
    }
Ejemplo n.º 3
0
    /// <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);
    }