Unity中输入模块与控制模块与游戏实际表现的处理

向格斗游戏,我们通常有一个输入模块来处理我们输入的各项指令,如按下了什么键。

控制模块就是处理游戏按键对应于什么游戏的表现,这个是一个映射的模块。比如,我按下了space键,那么人物就会跳跃。

在我制作游戏过程中,发现这个控制模块很难写。比如我按space人物会跳跃一次,但是我想要人物可以二段跳,那么我就要修改这个控制模块。每一次我对控制模块的修改都会及其费时,并且思路不是很清晰。现在我来研究一下这个控制模块的设计。

注意:我说的这个控制模块不是指手机游戏的那种控制,手机游戏的控制通常都比较简单。我说的是像塞尔达·荒野之息那样,人物动作多,操作很复杂,有很多的玩法的那种控制。通常那种控制如果不特殊的设计,思维会很混乱,BUG会超级多。

第一种

代码类似这样

if (is_armed == false) {is_spy = false;}
if ((Input.GetKeyUp ("g")) && (In_Stop()==true)) {Play_Grenade();}//Launching grenade
if ((Input.GetKeyUp ("r")) && (In_Stop()==true)) {Play_Reload();}//Launching grenade
if ((Input.GetKeyUp ("q")) && (is_armed == true)) {Play_Spy_Mode ();}//spy mode, need armed
if (Input.GetKeyUp ("1") && (In_Stop()==true)) {Play_Equip_Gun (0);}//equip_gun
if ((Input.GetKeyUp ("2"))&&(In_Stop()==true)) {Play_Equip_Gun (2);}
if (Input.GetKey ("k")) {Play_Dying ();}//Dead 
if ((Input.GetKeyDown ("f"))&&(In_Stop()==true)&&(near_switch==true)) {anim.SetBool("pressing",true);}
if ((Input.GetKeyUp ("f"))&&(near_switch==true)) {anim.SetBool("pressing",false);}
if ((Input.GetKeyDown ("s"))) {Play_Down (0);}// 0 Down, 1 up
if ((Input.GetKeyUp ("s"))) {Play_Down (1);}
if (Input.GetButtonDown ("Jump")&& (is_spy == false)&&anim.GetBool ("down") == false){Play_Jump ();}

将一系列判断卸载Update中,每一帧进行判断。这个就是我经常写的东西。O(∩_∩)O

第二种

这一种的代码比上一种的代码要更加复杂一点,不过还是主要在Update中进行编写。

首先,需要画一张大表,知道人物各种动作行为的转换关系,然后定义很多个bool来标志每一种动作行为。接下来会在update中根据按键和当前所处的动作行为状态进行编写。这之中要注意,协程是一个好东西。很多时候,我们要做一个动作,我们可以写一个协程。然后再协程中执行完毕后再将状态改变,这样就是一种封装,而不必将代码全部写在update中。

第三种  使用状态机或者行为树

这种形式我还没有见过,只是我的一个想法,我目前也还没有开始写。就是将人物每一种状态封装成一个状态机的状态类,然后我们通过键盘输入进入不同的状态,不同的状态里面重新编写按键逻辑与跳转逻辑。这样应该代码结构相对第二种方法更加的清晰,但是代码量应该会比第二种多一点。不过我感觉通过对状态合理的设计与继承,代码量应该比第二种不会太多。并且这样的结构应该更加的易于维护。

第四种

具体是什么我不知道,正在研究。但是我知道一个方向。我先说一下我的想法。玩过拳皇吧。拳皇里面复杂的搓招表。如果想实现不同角色不同招式的释放,那么必然有一个十分牛逼的控制模块来接受处理你不同的键盘输入。所以我现在就在研究格斗类游戏的操控模块。作为最为复杂的格斗游戏的操作模块都能研究透彻的话,那么咱觉平常我的想法应该都能实现了。

抱歉无法给出具体的代码给你们参考,但是如果能从我的这篇博文中获得一些解决你问题的启发便极好了。欢迎交流~ 

猜你喜欢

转载自blog.csdn.net/qq_14812585/article/details/88089681