黑魂复刻游戏的玩家控制器(后跳、奔跑、翻滚、跳跃的再重新设计)——Unity随手记
今天实现的内容:
黑魂网络游戏中后跳、翻滚、跳跃的键位设计
在黑魂游戏中,后跳和翻滚是由一个键实现的,在站立不动时,按下(哪怕你是按住)该键会后跳。移动时单击该键会翻滚,按住该键时移动会奔跑。奔跑时按下跳跃键才能跳跃。最大的问题就是要区分同一个按键的单击和按住,我们将采用的方案为通过计算按下按键的时间来判断到底是按住了还是单击。
而在键盘上,跳跃和后跳翻滚奔跑居然都是一个键(默认space),通过奔跑时快速再按下该键来实现跳跃,而手柄上连按两下该键是翻滚。
单击和按住的代码实现
// 按键按压计时器 private float pressTimer; // 单击的间隔时间 小于等于这个时间是单击 大于这个时间是长按(Long Press) private float clickIntervalTime = 0.2f; // 长按还是单击 决定是冲刺还是翻滚/后跃 private void RollOrRun(string _key) { if (Input.GetKeyDown(_key)) { timer = 0; } if (Input.GetKeyUp(_key) && timer <= clickLimitTime) { jab_roll = true; } else { jab_roll = false; } if (Input.GetKey(_key)) { timer += Time.deltaTime; if (timer > clickLimitTime) run = true; } else { run = false; } }
运用
// Update is called once per frame void Update() { // ... // 跳跃信号 if (run && Input.GetKeyDown(keyB)) jump = true; else jump = false; //冲刺/后跃/翻滚信号 RollOrRun(keyA); }
BUG以及缺陷:
本来原计划是实现键盘上的操作,也就是跳跃也由翻滚这个键控制。但是效果不佳,所以跳跃设计为另一个键,这是原计划实现的逻辑。能用,但是跳不远,我已经受够了。
// 双击计时器 private float doubleClickTimer; // 开始检测双击 private bool startDoubleClickCheck = false; private float doubleClickIntervalTime = 0.2f; private void RollJab_Run_Jump_Signal(string _keyRollJabOrRun, string _keyJump) { // ... // 双击检测 if(startDoubleClickCheck) { doubleClickTimer += Time.deltaTime; startDoubleClickCheck = (doubleClickTimer > doubleClickIntervalTime) ? false : true; // 跳跃信号 if (Input.GetKeyDown(_keyJump)) { jump = true; } else { jump = false; } } else { jump = false; } }
值得注意的:
小细节,黑魂的跳跃落地动作也是有两种的,一种是落地时蹲一下,一种是落地时翻滚,似乎是跟起跳速度有关。