首页 学习日记正文

Unity输入控制封装

阿沐 学习日记 2020-04-11 881 0 unity

Unity输入控制封装

image.png

1、使用场景:

键盘输入控制

2、封装意义:

采用事件注册派发机制,降低了各个控制对象之间的耦合性,提高了控制方法的复用性

3、具体实现:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 键盘/鼠标 控制类 单例
/// </summary>
public class InputController : SingletonBase<InputController>
{
    //开关控制
    private bool isOn = false;
    public InputController()
    {
        //单例类,所以该构造函数只会 执行一次,通过Mono管理器 将MyUpdate方法实现帧更新检测
        MonoMgr.GetInstance().addUpdateListener(MyUpdate);
    }

    //外部设置 控制开关 是否需要开启
    public void StartOrEnd(bool isOpen)
    {
        isOn = isOpen;
    }

    public void MyUpdate()
    {
        if (!isOn)
            return;
        //WASD 键盘输入 触发 相应的事件
        KeyCodeInput(KeyCode.W);
        KeyCodeInput(KeyCode.A);
        KeyCodeInput(KeyCode.S);
        KeyCodeInput(KeyCode.D);
    }

    private void KeyCodeInput(KeyCode key)
    {
        //某键按下 的时候 触发 按下事件(将按下的键值传递)
        if (Input.GetKeyDown(key))
        {
            EventCenter.GetInstance().EventTrigger("某键按下", key);
        }
        //某键抬起 的时候 触发 抬起事件(将抬起的键值传递)
        if (Input.GetKeyUp(key))
        {
            EventCenter.GetInstance().EventTrigger("某键抬起", key);
        }
    }
}

测试:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InputTest : MonoBehaviour {

	void Start ()
    {
        InputController.GetInstance().StartOrEnd(true);//开启键盘输入控制
        EventCenter.GetInstance().AddListenerEvent("某键按下",PressFun);//注册键盘按下事件
        EventCenter.GetInstance().AddListenerEvent("某键抬起", RaiseFun);//注册键盘抬起事件
	}
	
    /// <summary>
    /// 键盘按下事件
    /// </summary>
    /// <param name="key">键值</param>
    void PressFun(object key)
    {
        KeyCode code = (KeyCode)key;
        switch (code)
        {
            case KeyCode.W:
                Debug.Log("按下了W   前进");
                break;
            case KeyCode.S:
                Debug.Log("按下了S   后退");
                break;
            case KeyCode.A:
                Debug.Log("按下了A   左转");
                break;
            case KeyCode.D:
                Debug.Log("按下了D   右转");
                break;
        }
    }

    /// <summary>
    /// 键盘抬起事件
    /// </summary>
    /// <param name="key">键值</param>
    void RaiseFun(object key)
    {
        KeyCode code = (KeyCode)key;
        switch (code)
        {
            case KeyCode.W:
                Debug.Log("松开了W   停止前进");
                break;
            case KeyCode.S:
                Debug.Log("松开了S   停止后退");
                break;
            case KeyCode.A:
                Debug.Log("松开了A   停止左转");
                break;
            case KeyCode.D:
                Debug.Log("松开了D   停止右转");
                break;
        }
    }
}

效果:

image.png

打赏

评论

Music