您现在的位置是:首页 >技术杂谈 >unity中实现连击按钮切换走路与跑步网站首页技术杂谈
unity中实现连击按钮切换走路与跑步
自己个人的游戏项目中想要实现这样一个经典的效果:当单击方向键时角色进行走动,此时速度较慢;而当连击两下方向键后角色进行跑动,此时速度较快。那么到底要如何实现这一效果呢?当时为了实现这一效果自己也是查阅了不少博客,但似乎完整实现类似功能的并不多,不过从中有找到灵感然后自己实现了这一效果。
那么明晰了我们想要实现的效果,我们就将要实现的功能进行代码逻辑上的拆分:实际的逻辑可以拆分为以下部分:(1)检测按钮点击、连击;(2)走路与跑步的状态切换,其中包括动画、速度等。
拆分完毕后,我们按步骤来实现对应的功能。首先关于检测按钮的点击和连击,可以想到通过GetKey检测对应按钮的持续按下,此时实际上关于走路的逻辑就可以写在这里了;但为了实现连击的效果,我们显然还要检测一个按钮的抬起,即GetKeyUp。明确检测按钮的按下与抬起后,我们可以想到,连击按钮的本质实质上就是在一个极短的时间内进行了按下——抬起——按下这样的步骤。
那么为了实现这一极短时间内的检测,我们需要实现简单的计时器来进行计时,逻辑应当是这样的:如果我们松开按键,记录下松开按键的那个时间点;在按下按键的时候也记录按下按键的那个时间点并与松开按键的那个时间点进行比较,如果小于等于某一个间隔则触发跑步,否则触发走路。通过以上分析后我们可以写出如下代码,其中使用了四个float变量作为计时器变量来计时:
if (Input.GetKeyUp(KeyCode.LeftArrow))
{
releaseLeftTime = Time.time;
rb.velocity = new Vector2(0, rb.velocity.y);
}
if (Input.GetKeyUp(KeyCode.RightArrow))
{
releaseRightTime = Time.time;
rb.velocity = new Vector2(0, rb.velocity.y);
}
if (Input.GetKey(KeyCode.LeftArrow))
{
transform.localScale = new Vector3(-1, 1, 1);
pressLeftTime = Time.time;
if (pressLeftTime - releaseLeftTime <= pressInterval)
{
rb.velocity = new Vector2(-runSpeed, rb.velocity.y);
}
else
{
rb.velocity = new Vector2(-speed, rb.velocity.y);
}
}
if (Input.GetKey(KeyCode.RightArrow))
{
transform.localScale = new Vector3(1, 1, 1);
pressRightTime = Time.time;
if (pressRightTime - releaseRightTime <= pressInterval)
{
rb.velocity = new Vector2(runSpeed, rb.velocity.y);
}
else
{
rb.velocity = new Vector2(speed, rb.velocity.y);
}
}
但写出了以上代码进行测试后会发现存在问题,就算通过连击按钮触发了跑步,但也只是在一个极短的时间内进行了跑步然后又恢复成了走路。
为什么会出现这样的情况?我们需要明确一点,我们检测按下实际上检测的是按住!角色跑步的同时我们一定是一直按住方向键的。
检测跑步的判断条件后会发现,我们只在检测按钮抬起的那一瞬间记录了松开按钮的时间点。再次按下按钮进行检测后或许确实在较短时间内触发了跑步逻辑,但是按住按钮的时间点是在GetKey中不断更新的,而抬起按钮的时间点并未更新,这就导致我们只能在本用来判断连击检测的那一极小的时间段内进行跑步,随后马上就会恢复走路。
为了解决这一问题,我们在跑动的同时也要不断地更新其松开按钮的时间点,这样才能实时保证按住按钮的时间点减去松开按钮的时间点小于我们设定的极短的时间间隔保持在跑步中。
if (Input.GetKeyUp(KeyCode.LeftArrow))
{
releaseLeftTime = Time.time;
rb.velocity = new Vector2(0, rb.velocity.y);
}
if (Input.GetKeyUp(KeyCode.RightArrow))
{
releaseRightTime = Time.time;
rb.velocity = new Vector2(0, rb.velocity.y);
}
if (Input.GetKey(KeyCode.LeftArrow))
{
transform.localScale = new Vector3(-1, 1, 1);
pressLeftTime = Time.time;
if (pressLeftTime - releaseLeftTime <= pressInterval)
{
rb.velocity = new Vector2(-runSpeed, rb.velocity.y);
releaseLeftTime = Time.time;//跑步过程要持续更新松开键位的时间
}
else
{
rb.velocity = new Vector2(-speed, rb.velocity.y);
}
}
if (Input.GetKey(KeyCode.RightArrow))
{
transform.localScale = new Vector3(1, 1, 1);
pressRightTime = Time.time;
if (pressRightTime - releaseRightTime <= pressInterval)
{
rb.velocity = new Vector2(runSpeed, rb.velocity.y);
releaseRightTime = Time.time;
}
else
{
rb.velocity = new Vector2(speed, rb.velocity.y);
}
}
还有需要注意的一点,可能有的朋友会觉得这一段代码太冗长了,可以把左右键放在同一个if条件判断里用||同时进行检测。这个取决于你想要实现的游戏效果,因为如果把左右键放在同一个if条件里判断的话显然会有一个问题:如果我先按住左键进入走路,然后松开后迅速按下右键,这样同样会触发向右跑步的逻辑。
我把左右键分开进行判断主要就是为了避免这一情况,我希望的是如果角色向左走动,再连击左键的情况下才会进入跑步;而不会有原本朝一个方向走路,通过连击下一瞬间可以朝另一个方向跑步的情况。
那么通过连击切换走路与跑步的效果借助以上代码实际上已经基本实现,其他如果你有布尔变量控制状态的切换、以及切换动画之类的逻辑,这些都可以在上面代码的基础之上进行拓展。最终想要实现怎样的游戏效果当然还是取决于你个人,我只在这里提供一个大体的框架与思路。
这是我第一次分享自己在学习unity做游戏的过程中实现的一些效果的逻辑与代码,可能仍有许多不足的地方,如果大佬们有更好的实现方法或是逻辑欢迎在评论区进行分享!