实现自定义游戏键位

最近与人组队制作demo参加完美世界游戏大赛,因为目标平台是PC,所以需要实现用户键位自定义功能。也是这个功能让我重新审视Event,EventSystem的妙用。


功能需求:
1.用户可以通过键盘按键自定义键位。
2.数据能够本地持久化

思路:
通过事件+PlayerPrefs实现。

实现:

  1. 搭建UI界面


    UI
  2. 挂接点击事件
 private void OnEnable()
    {
        for (int i = 0; i < KeyButtons.Length; i++)
            KeyButtons[i].onClick.AddListener(ClickInput);
    }
//记录输入设置
    void ClickInput()
    {
        currentKey = EventSystem.current.currentSelectedGameObject;      //获取选中对象
        EventSystem.current.currentSelectedGameObject.GetComponent().color = selectColor;  //选中后改变颜色
    }
  1. 初始化键位
void InitializeInputKey()
    {
        if (PlayerPrefs.HasKey("up"))
            return;
        PlayerPrefs.SetString("up", KeyCode.W.ToString());
        PlayerPrefs.SetString("down", KeyCode.S.ToString());
        PlayerPrefs.SetString("left", KeyCode.A.ToString());
        PlayerPrefs.SetString("right", KeyCode.D.ToString());
        PlayerPrefs.SetString("jump", KeyCode.J.ToString());
        PlayerPrefs.SetString("hat", KeyCode.L.ToString());
        PlayerPrefs.SetString("attack", KeyCode.K.ToString());
    }
  1. Button上显示当前键位
 //获取当前键位设置并显示在按钮上
    void GetInput()
    {
        string name = "";
        for (int i = 0; i < inputBtnstxt.Length; i++)
        {
            name = inputBtnstxt[i].name;
            KeyButtons[i].transform.GetChild(0).GetComponent().text = PlayerPrefs.GetString(name).ToString();
        }
    }
  1. 获取点击事件对象
 private void OnGUI()
    {
        if (currentKey != null)
        {
            Event e = Event.current;
            if (e.isKey)
            {
                PlayerPrefs.SetString(currentKey.name, e.keyCode.ToString());
                currentKey.transform.GetChild(0).GetComponent().text = e.keyCode.ToString();
                currentKey.GetComponent().color = diselectColor;
                currentKey = null;
            }
        }
    }
  1. 调用
 private void Update()
    {
        if (Input.GetKeyDown(InputDown("jump")))
            Debug.Log("Jump!!");
    }
  KeyCode InputDown(string inputKey)
    {
        return (KeyCode)System.Enum.Parse(typeof(KeyCode), PlayerPrefs.GetString(inputKey));
    }

你可能感兴趣的:(实现自定义游戏键位)