Unity進階——狀态機——Switch狀态機
我們将要學習的内容是Switch狀态機,前一節我們通過if寫了一個簡單的功能,就是開關燈的功能,但是開關燈的功能,并不能稱之為完整的狀态機,雖然說它包含了狀态機中所必須的元素或者概念。比如裡面也呈現了一些狀态的過程……但是它并不是一個完整的狀态機
最最簡單的一個的狀态機,一般我們都會使用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來實作!
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;
}
}
}