实现自定义游戏键位
2018-04-19 本文已影响0人
JervieQin
最近与人组队制作demo参加完美世界游戏大赛,因为目标平台是PC,所以需要实现用户键位自定义功能。也是这个功能让我重新审视Event,EventSystem的妙用。
功能需求:
1.用户可以通过键盘按键自定义键位。
2.数据能够本地持久化
思路:
通过事件+PlayerPrefs实现。
实现:
-
搭建UI界面
UI - 挂接点击事件
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; //选中后改变颜色
}
- 初始化键位
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());
}
- 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();
}
}
- 获取点击事件对象
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;
}
}
}
- 调用
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));
}