天天看點

Unity進階——狀态機——Switch狀态機

Unity進階——狀态機——Switch狀态機

我們将要學習的内容是Switch狀态機,前一節我們通過if寫了一個簡單的功能,就是開關燈的功能,但是開關燈的功能,并不能稱之為完整的狀态機,雖然說它包含了狀态機中所必須的元素或者概念。比如裡面也呈現了一些狀态的過程……但是它并不是一個完整的狀态機

Unity進階——狀态機——Switch狀态機

最最簡單的一個的狀态機,一般我們都會使用Switch語句去實作,因為我們使用Switch的時候,會和枚舉一起使用,用枚舉來表示我們的狀态機中不同的狀态。然後用Switch來判斷,目前處于什麼狀态再來解決應該選擇哪些邏輯代碼進行執行。Switch本身就是一個分支語句。

using UnityEngine;

using System.Collections;

public class LightController : MonoBehaviour {

    private Light _light;

    void Awake(){

        _light = GetComponent<Light> ();

    }

    void  Update(){

        //目前的腳步就是狀态機

        //使用者按鍵時間就是狀态切換的條件——事件

        if(Input.GetKeyDown(KeyCode.O)){

            //燈的光強從0變為1時,就是狀态的過渡

            //打開燈

            //燈開着的狀态

            _light.intensity=1f;

        }

        if(Input.GetKeyDown(KeyCode.C)){

            //燈的光強從1變為0時,就是狀态的過渡

            //關閉燈

            //燈處于關着的狀态

            _light.intensity=0f;

        }

    }

}

接下來我們要模拟燈光忽明忽暗的效果!

而我們目前的代碼是無法實作,我們目前的代碼不能準備的去判斷,我們目前的這個燈到底是處于開着的,還是關這的,接下來我們要改一下一下代碼!

把Update()裡面的内容删除,在Update()中,使用switch來實作!

Unity進階——狀态機——Switch狀态機

using UnityEngine;

using System.Collections;

//枚舉用來表示燈光中的狀态

public enum LightStates{

    Open,//打開狀态

    Close,//關閉狀态

}

public class LightController : MonoBehaviour {

    private Light _light;//目前遊戲對象上的燈光元件

    private LightStates _currentStatre;//目前狀态

    void Awake(){

        //初始化成員變量

        _light = GetComponent<Light> ();

    }

    void  Update(){

        //if語句實作狀态機效果

        //目前的腳步就是狀态機

        //使用者按鍵時間就是狀态切換的條件——事件

//        if(Input.GetKeyDown(KeyCode.O)){

            //燈的光強從0變為1時,就是狀态的過渡

            //打開燈

            //燈開着的狀态

//            _light.intensity=1f;

//        }

//        if(Input.GetKeyDown(KeyCode.C)){

            //燈的光強從1變為0時,就是狀态的過渡

            //關閉燈

            //燈處于關着的狀态

//            _light.intensity=0f;

        //使用Switch進行狀态檢測

        switch (_currentStatre) {

        case LightStates.Open:

            //當處于Open狀态時要執行的代碼

            print ("Open....");

            OnOpenState ();

            break;

        case LightStates.Close:

            //當處于Close狀态時要執行的代碼

            print ("Close...");

            OnCloseState ();

            break;

        }

        }

        //當處于Open狀态時執行的代碼

        private void OnOpenState(){

        //檢測按鍵時間——按下C鍵是關燈

        if(Input.GetKeyDown(KeyCode.C)){

            _light.intensity = 0f;

            //更新目前狀态

            _currentStatre = LightStates.Close;

        }

        }

        //當處于Close狀态時要執行的代碼

        private void OnCloseState(){

        //檢測按鍵時間——按下O鍵是關燈

        if(Input.GetKeyDown(KeyCode.O)){

            _light.intensity = 1f;

            //更新目前狀态

            _currentStatre = LightStates.Open;

        }

    }

}

Unity進階——狀态機——Switch狀态機

繼續閱讀