一、效果图

二、布局

1.场景布局

创建一个Panel 创建三个cube,Panel地板 两个cube设置一个绿色材质,调整Scale大小让其成为柱子形状,一个cube改名为player设置一个红色材质,当作玩家(用来演示操作的),修改相机位置就可以了。

2.设置面板布局

2.1新建一个空节点名字改为SetKeyPanle,修改属性

2.2在SetKeyPanle下新建一个image,修改名字为root,调整大小,如下图

2.3 在root下 新建Text ,修改名为Title当作标题

2.4在root下新建Scroll View组件修改属性

2.5 选择Scroll View—>Viewport—>Content对象,添加Grid Layout Group组件并修改属性

2.6 在上一步的Content下创建一个按钮改名Item,然后在这个Item下在创建两个Text,修改Item的Button组件属性

两个Text自己修改一下位置就好了,注意两个Text在父物体的孩子子级不要搞错了,第一个Text是前进,第二个是W

弄好后在吧item复制3个,有了Content的Grid Layout Group组件新建的item就不用布局了,他自动给你排列了

三、脚本思路

我们需要一个移动脚本(Player)、按键数据脚本(KeyItem)和设置面板脚本(SetKeyPanle),KeyItem脚本主要用于存储按键信息和触发修改 具体修改功能在SetKeyPanle脚本中

1.KeyItem脚本

3.1.1 获取组件 和 设置初始化按键

using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;
using System;public class KeyItem : MonoBehaviour
{Text key;       //按下的按键名称Button btn;     //开启按钮[SerializeField] KeyCode keyCode;//初始化按键 需要在面板自己选择void Start(){//获取组件key = transform.GetChild(1).GetComponent<Text>();//这里我用了子物体的孩子子级来获取btn = GetComponent<Button>();//按钮就获取他自己本身}}

将这个脚本赋值给item对象,我们在面板中设置他的初始化按键

3.1.2添加修改key值、修改按钮颜色、更新失败还原按键名称 方法

 //修改key值void SetKeyItemValue() {//当前有修改的key值if (SetKeyPanle.GetIntance().CurrentKeyItem!=null){return;}//当前keyitem为空时,就让它等于自己SetKeyPanle.GetIntance().CurrentKeyItem = this; //这个要从SetKeyPanle脚本获取,是下面要讲的//当前状态改为true 这样就可以修改按键了SetKeyPanle.GetIntance().IsSet = true; //可修改  //这个要从SetKeyPanle脚本获取,是下面要讲的SetBtnColor(new Color32(202, 138, 138, 255));//修改按钮颜色key.text = "";//修改的时候text值为空}//修改按钮颜色public void SetBtnColor(Color32 color) {btn.image.color = color; //修改颜色}//更新失败还原按键名称public void Restore() {key.text = keyCode.ToString();}

3.1.3最终代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;
using System;public class KeyItem : MonoBehaviour
{Text key;       //按下的按键名称Button btn;     //开启按钮[SerializeField] KeyCode keyCode;public KeyCode KeyCode { get { return keyCode; } set { keyCode = value; //修改按键值key.text = keyCode.ToString(); //修改按键面板要显示的Text值} }void Start(){key = transform.GetChild(1).GetComponent<Text>();btn = GetComponent<Button>();btn.onClick.AddListener(SetKeyItemValue);}//修改key值void SetKeyItemValue() {//当前有修改的key值if (SetKeyPanle.GetIntance().CurrentKeyItem!=null){return;}//当前keyitem为空时,就让它等于自己SetKeyPanle.GetIntance().CurrentKeyItem = this; //这个要从SetKeyPanle脚本获取,是下面要讲的//当前状态改为true 这样就可以修改按键了SetKeyPanle.GetIntance().IsSet = true; //可修改  //这个要从SetKeyPanle脚本获取,是下面要讲的SetBtnColor(new Color32(202, 138, 138, 255));//修改按钮颜色key.text = "";//修改的时候text值为空}//修改按钮颜色public void SetBtnColor(Color32 color) {btn.image.color = color; //修改颜色}//更新失败还原按键名称public void Restore() {key.text = keyCode.ToString();}}

上面有几个报错的句子先不管,写完SetKeyPanle脚本的对应方法就没错了。

2.SetKeyPanle脚本

这个脚本稍微复杂,因为逻辑处理都在这里。脚本中有详细解释

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;//序列化按键节点
[Serializable]
public class KeyItemNode
{public string keyName;//按键功能名称public KeyItem keyItem; //按键item
}public class SetKeyPanle : MonoBehaviour
{KeyItem currentkeyItem=null; //当前要修改的Item//封装 用于判定当前是否有修改的按钮 没有为空public KeyItem CurrentKeyItem { get => currentkeyItem; set => currentkeyItem = value; }[SerializeField] List<KeyItemNode> keyItemList; //这个需要到面板赋值Dictionary<string, KeyItem> keyItemDic; //字典存放 键值参数 (玩家移动要用,玩家脚本后面写)public Dictionary<string, KeyItem> KeyItemDic { get => keyItemDic; set => keyItemDic = value; } //封装可以进行外部调用[SerializeField] Transform root; //面板节点 用于控制开启关闭面板  是上面创建设置面板UI SetKeyPanle下的root//单例 这样就可以获取这个脚本的方法进行使用了static SetKeyPanle intance;public static SetKeyPanle GetIntance() {return intance;}void Awake() {intance = this; //将自己赋值给intance}void Start(){keyItemDic = new Dictionary<string, KeyItem>();//初始化字典//将存储的按键值 添加到字典中 for (int i = 0; i < keyItemList.Count; i++){keyItemDic.Add(keyItemList[i].keyName, keyItemList[i].keyItem);}ClosePanel(); //关闭设置面板}bool isCurrentOpenState = true; //当前设置面板开启的状态 true 代表开启状态 public bool IsCurrentOpenState { get => isCurrentOpenState; set => isCurrentOpenState = value; } //封装可以进行外部调用void Update(){//按下esc键开启关闭设置面板if (Input.GetKeyDown(KeyCode.Escape)){//判断面板的开启状态if (isCurrentOpenState){OpenPanel(); //开启面板}else{//判断当前是修改状态,但是你没有按下按键修改而是直接esc退出时,恢复上一次按键if (isSet){//关闭后恢复当前修改键值CurrentKeyItem.Restore();}ClosePanel();//关闭面板}isCurrentOpenState = !isCurrentOpenState;}}#region 按键修改bool isSet = false; //是否可以修改public bool IsSet { get => isSet; set => isSet = value; }void OnGUI(){//可以修改if (isSet){Event e = Event.current;//获取当前事件if (e != null && e.isKey && e.keyCode != KeyCode.None){KeyCode currentKey = e.keyCode;//当前按键等于 ESC 时 恢复上一次按键if (currentKey==KeyCode.Escape){CurrentKeyItem.Restore();return;}//判断是否按键冲突if (IsRepeat(currentKey)){Debug.Log("按键重复!!");CurrentKeyItem.Restore(); //还原按键名称}elseCurrentKeyItem.KeyCode = currentKey; //不重复 修改按键CurrentKeyItem.SetBtnColor(new Color32(173, 173, 173, 255)); //还原颜色IsSet = false;//不是修改状态CurrentKeyItem = null; //当前没有选择按键item}}}//是否重复 true 有重复bool IsRepeat(KeyCode keyCode) {//循环查找是否有相同的按键for (int i = 0; i < keyItemList.Count; i++){if (keyItemList[i].keyItem.KeyCode== keyCode){return true;}}return false;}#endregion#region 开启关闭面板public void OpenPanel() {root.gameObject.SetActive(true);}public void ClosePanel(){root.gameObject.SetActive(false);}#endregion
}

将这个脚本拖到SetKeyPanle的UI上 设置keyItemList值和root对象。如下图 :

3.player移动脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;public class player : MonoBehaviour
{public Text txt; //这个text是用来显示你按下的按键名称的,你可以随便创建在任何位置,只要赋值给他就好public float speed = 10f; //定义一个速度void Start(){}void Update(){//没有开启设置面板时 可移动if (SetKeyPanle.GetIntance().IsCurrentOpenState){//前进if (Input.GetKey(SetKeyPanle.GetIntance().KeyItemDic["前进"].KeyCode)){transform.Translate(Vector3.forward * Time.deltaTime * speed);txt.text = "按下:" + SetKeyPanle.GetIntance().KeyItemDic["前进"].KeyCode.ToString();}//后退if (Input.GetKey(SetKeyPanle.GetIntance().KeyItemDic["后退"].KeyCode)){transform.Translate(Vector3.back * Time.deltaTime * speed);txt.text = "按下:" + SetKeyPanle.GetIntance().KeyItemDic["后退"].KeyCode.ToString();}//向左if (Input.GetKey(SetKeyPanle.GetIntance().KeyItemDic["向左"].KeyCode)){transform.Translate(Vector3.left * Time.deltaTime * speed);txt.text = "按下:" + SetKeyPanle.GetIntance().KeyItemDic["向左"].KeyCode.ToString();}//向右if (Input.GetKey(SetKeyPanle.GetIntance().KeyItemDic["向右"].KeyCode)){transform.Translate(Vector3.right * Time.deltaTime * speed);txt.text = "按下:" + SetKeyPanle.GetIntance().KeyItemDic["向右"].KeyCode.ToString();}}}
}

将这个脚本拖给player (场景中红色cube)赋值

好的这样我们的自定义按键功能就完成了,赶紧试试吧~~

Unity制作游戏自定义按键相关推荐

  1. unity制作游戏开始界面_开始使用Unity Playground制作游戏

    unity制作游戏开始界面 We are super excited to announce the official launch of Unity Playground – the first o ...

  2. Unity制作游戏中的场景

    Unity制作游戏中的场景 1.2.3  场景 在Unity中,场景(Scene)就是游戏开发者制作游戏时,所使用的游戏场景.它是一个三维空间,对应的三维坐标轴分别是X轴.Y轴和Z轴本文选自Unity ...

  3. 使用Unity制作游戏AI

    本文由独立游戏工作室Synnaxium Studio介绍游戏AI的概念和开发方法.本文中所有内容都是他们在开发<Radiant Blade>游戏的原型阶段所积累的经验. 下面是<Ra ...

  4. 利用NEO与Unity制作游戏(第1部分)

    2019独角兽企业重金招聘Python工程师标准>>> 欢迎来到使用Unity游戏引擎制作的NEO区块链游戏的'A-Z'多系列讲解教程.我们将保证每个系列内容的简洁清晰,从而对整体的 ...

  5. 利用NEO与Unity制作游戏(第2部分)

    欢迎来到使用Unity游戏引擎制作的NEO区块链游戏的'A-Z'多系列讲解教程的第2部分. 在第1部分中,我们设置了基本的Unity环境,并准备好连接到我们的私有测试网络. 在第2部分中,我们将设置这 ...

  6. [Unity] 制作游戏 小球爱碰撞

    先上效果: 游戏玩法: 小球将边缘的几个盒子撞掉后就胜利了. 首先制作一个天空盒材质,调整好其Shader,气候和地面颜色,如下图: 然后,在Scene场景中添加一个平面Plane,然后将自己制作好的 ...

  7. Unity制作游戏中改名系统(第一次改名免费、改名提示、充值获得改名次数等 )

    Unity游戏制作中UI界面名字修改 游戏名称修改 简单粗暴直接上代码 关于充值系统的概念 游戏名称修改 现在网络游戏中名字是标新立异.展示自己独一无二的个性的方式之一,名字越来越烧,操作越来越低,也 ...

  8. [Unity] 制作游戏 赛车小游戏

    模拟赛车小游戏 效果展示 做一款模拟赛车的小游戏demo,方向键控制.有刹车.重玩,还有漂移和查看车型的功能 可以看到,还有翻车的效果哈哈哈!有兴趣的小伙伴来看看吧! 资源准备 从网上下载赛车模型和桥 ...

  9. 自制Unity小游戏TankHero-2D(1)制作主角坦克

    自制Unity小游戏TankHero-2D(1)制作主角坦克 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm)这个游戏制作的. ...

  10. 使用Unity制作3D驾驶游戏

    使用Unity制作3D驾驶游戏 Unity2021 专业游戏设计 课程英文名:Make a Driving Game in Unity 08.2021 此视频教程共22.0小时,中英双语字幕,画质清晰 ...

最新文章

  1. 刘永鑫:20分钟讲解微生物组数据分析与可视化实战
  2. 24.两两交换链表中的结点
  3. Mysql 字符串分隔
  4. 回归!这里才是我们的天堂
  5. 【转载】jQuery学习笔记
  6. CCNA,CCNP资料
  7. WTL学习笔记——初章
  8. linux超过cpu负载重启脚本,linux下Web服务器CPU负载超过阀值自动重启脚本
  9. JS 获取指定URL的时间
  10. DB2 SQL Error: SQLCODE=-302, SQLSTATE=22001, SQLERRMC=null
  11. 17秋 软件工程 团队作业 同学录
  12. 跨专业本科计算机,知乎大学生跨专业该肿么学计算机
  13. 吾在这里给大家拜年啦!
  14. Android相同包名不同签名的apk安装失败问题分析
  15. C++课设:GUI电话簿程序
  16. 自我总结:找工作面试时注意事项
  17. HTML和CSS的知识点
  18. python算法详解 张玲玲_Python算法详解
  19. 系统之家 Win10_21H1 x64位 游戏专业版系统下载 2021.06
  20. python3 tkinter 刷新标签图片

热门文章

  1. 互补滤波算法及理论推导
  2. mysql查询编辑器_navicat怎么进入查询编辑器
  3. python实现爱心代码
  4. 微型计算机任务名称,任务五微型计算机的硬件组成.ppt
  5. Vivado ML 2021.1 安装包下载
  6. 思科防火墙基本配置思路及命令
  7. 交通分配四阶段法(一)
  8. Mac下librdkafka下载安装
  9. java移库数据同步,洗车管理系统会员管理+门店店务同步管理
  10. Google Chrome谷歌浏览器繁体字修改为简体字