实现自定义游戏键位

最近与人组队制作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<Image>().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>().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>().text = e.keyCode.ToString();
                currentKey.GetComponent<Image>().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));
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容