天天看点

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状态机

继续阅读