Unity制作RPG游戏——按键功能的分类与实现
这一部分跟大家分享一个游戏开发中一个必须明白的问题,那就是怎么设计按键,有哪几种按键,怎么实现?
一、按键的种类
简单来说,一般有三类,
- press signal :键位输入等,按下时获取并更新输入
- once trigger signal:跳跃、(非蓄力)攻击等,当玩家按下按钮时,只执行一次便结束
- double trigger signal:连击打combo,按键较少需要区分按下一次和短时间按下两次的功能时
先考虑前面两种状态,我们可以设计一个MyButton类,专门用于获取相应的状态。
public class MyButton_TEST
{//press signalpublic bool OnPressing;//once triggerpublic bool OnPressed;public bool OnReleased;private bool curstate;private bool laststate;//double triggerpublic bool isExtending;public bool isDelaying;public void Tick(bool input){//按键输入curstate = input;OnPressing = curstate;OnPressed = false;OnReleased = false;if(curstate != laststate){if(curstate == true){OnPressed = true;}else{OnReleased = true;}}laststate = curstate;}
}
input脚本代码如下:
public class Input_TEST : MonoBehaviour
{public bool iswalk;public bool isjump;private MyButton_TEST iswalk_btn;private MyButton_TEST isjump_btn;// Start is called before the first frame updatevoid Start(){iswalk_btn = new MyButton_TEST();isjump_btn = new MyButton_TEST();}// Update is called once per framevoid Update(){iswalk_btn.Tick(Input.GetKey(KeyCode.W));isjump_btn.Tick(Input.GetKey(KeyCode.Space));iswalk = iswalk_btn.OnPressing;isjump = isjump_btn.OnPressed;print(iswalk);print(isjump);}
}
这样完整的将按钮的处理逻辑与其自身分离开来,符合里氏替换原则。untiy输出也是正确的。
下面我们来考虑double trigger的实现办法,由于double trigger需要计时操作,所以我们实现一个Mytimer类专门用来计时。
public class MyTimer_TEST
{public enum STATE{IDLE,RUN,FINISHED}public float duration;private float elapsedtime;public STATE state = STATE.IDLE;public void Tick(){switch (state){case STATE.IDLE:break;case STATE.RUN:elapsedtime += Time.deltaTime;if(elapsedtime >= duration){state = STATE.FINISHED;}break;case STATE.FINISHED:break;default:Debug.Log("Error");break;}}public void Go(){elapsedtime = 0;state = STATE.RUN;}
}
每一个button类中,应该有两种延迟信号,一种是按下后,持续多久还,一种是按下后放下,继续保持多久。说起来有点乱,可以画图表示:
对每一个按钮,我们除了设计上面所说的OnPressed、OnPressing、OnReleased三种信号外,还会设计IsExtending和IsDelaying两种信号,这两种信号的实现依赖于上面所说的Timer。
对照上图,在时间点1的位置,OnPressed信号会获得true,其他时候都为false,在2时间段也就是delayTime时间段内,IsDelaying信号为true,其他信号的表示可以参考图左侧的描述。
对此,我们重新修改一下button类的结构,增加两种信号:
public class MyButton_TEST
{//press signalpublic bool OnPressing;//once triggerpublic bool OnPressed;public bool OnReleased;private bool curstate;private bool laststate;//double triggerpublic bool isExtending;public bool isDelaying;private MyTimer_TEST extendtimer = new MyTimer_TEST();private MyTimer_TEST delaytimer = new MyTimer_TEST();public void Tick(bool input){extendtimer.Tick();delaytimer.Tick();//按键输入curstate = input;OnPressing = curstate;OnPressed = false;OnReleased = false;isExtending = false;isDelaying = false;if (curstate != laststate){if (curstate == true){OnPressed = true;StartTimer(delaytimer, 0.1f);}else{OnReleased = true;StartTimer(extendtimer, 0.1f);}}laststate = curstate;if (extendtimer.state == MyTimer_TEST.STATE.RUN){isExtending = true;}if (delaytimer.state == MyTimer_TEST.STATE.RUN){isDelaying = true;}}private void StartTimer(MyTimer_TEST timer, float duration){timer.Go();timer.duration = duration;}
}
回到input脚本中,我们测试一下,这里设计一个doublekick字段,连按两下表示一次攻击,并修改walk字段的实现要求,当玩家按下walk,松开按钮的0.2秒的时间里,我们依然认为walk==true
该设计就可以完成要求,可以在button的实现方法里将duration改为0.2即可。当然这里还可以修改一下button类,给予一个构造函数,该构造函数需要两个参数分别是delayingtime和extendingtime的值
至此就修改完毕了,完成了对button按键的抽象,以此功能可以实现各种延迟按钮、各种combo效果。
Unity制作RPG游戏——按键功能的分类与实现相关推荐
- Unity制作RPG游戏——相机的设计与实现
本文将详细介绍Player的相机设计,不适用任何插件,如何制作类似RPG游戏的相机. 首先,设置正确的Hierarchy层级关系:将camPos的position和euler传递给Main Camer ...
- Unity制作RPG游戏——战斗注视LockOn实现方法
一.实现步骤 1.在Input脚本中新增一个LockOn信号,显然它是Onpressed信号 2.当LockOn信号为true时,调用cameraController中的LockUpLock方法,主要 ...
- Unity制作RPG游戏——碰撞检测
在介绍相机之前,有必要介绍一下碰撞检测.在unity中很多地方都需要用到碰撞检测,例如在人物的移动过程,我们需要检测角色当前是否在地面上,那么有一些比较合适的检测方案,例如物理射线等,untiy中有一 ...
- 使用Unity开发RPG游戏完整指南(全)
使用Unity开发RPG游戏完整指南(全) - GameRes游资网 关注公众号 风色年代(itfantasycc) 200G Unity资料合集送上~ 本教程教大家如何使用Unity创建一个RPG游 ...
- Unity制作格斗游戏核心思路总结
http://anchorart9.com/2016/05/22/unity%E5%88%B6%E4%BD%9C%E6%A0%BC%E6%96%97%E6%B8%B8%E6%88%8F%E6%A0%B ...
- Python——利用pygame模块制作RPG游戏(一)
利用pygame模块制作RPG游戏(一) 需要用到的第三方库:pygame 一.构造游戏的基本框架 1.首先准备好相应的游戏素材:背景,人物动作图片,音乐,音效等. 图片均用png格式,音乐音效均用o ...
- 使用Unity开发RPG游戏完整指南
本教程教大家如何使用Unity创建一个RPG游戏.类似我们之前介绍过的RPG游戏<Ghost of a Tale>,玩家可以在城镇场景中进行导航并寻找战斗,并在战斗中遇到不同类型的敌人.玩 ...
- unity3d制作RPG游戏系列(4)——UI界面
个人博客文章链接:http://www.huqj.top/article?id=161 游戏中除了3d场景以外,UI界面也是很重要的一部分,例如主角的头像.血条.背包.按钮等. 下面是myrpg中的简 ...
- unity3d制作RPG游戏系列(1)——介绍
个人博客文章链接:http://www.huqj.top/article?id=158 最近闲来无事,玩了几天的u3d,做了个简单的rpg游戏,打算把制作的过程还有一些坑从头到尾记录一下,本身做游戏只 ...
最新文章
- java数组去重_再谈JavaScript数组去重
- hdu oj1093题解
- python matplotlib.pyplot plt.ioff()函数(关闭交互模式用于阻塞程序,不让图片关闭)
- mysql 指定目录_mysql 更改默认数据目录
- scss支持的嵌套css规则
- 前端学习(1415):ajax的运行环境
- Ubuntu 16.04退出anaconda环境
- 求职过程记录(4)——启明星出现
- 阿里云_数加平台类HQL的那些坑
- 让xcode5能使用ios6.1模拟器
- OpenG数组讲解之Filter 1D Array。
- SkipList算法原理分析
- APP开发的七大阶段,你了解多少?
- [Qualcomm][MSM8909]APQ8009基线上编写一个OpenGl测试程序
- am5728 中断的使用
- 2023电工杯数学建模B题思路分析
- 流利阅读 2019.2.23 China’s Forbidden City opens to the general public at night for the first time in 94
- mapi java_Exchange 2010 - Exchange MAPI连接问题
- 06_[nvim0.5+从0单排]_Native LSP 自动补全、语法检查、code action、代码段—TypeScript篇
- C4D透视图设置背景图,实景合成小技巧。