我们来处理按下判定的问题,也就是之前我们空着的玩家输入响应1-9。
同样这里只写一个作为例子。
首先这里我们用的是Input System,对按键的输入进行了判断。
最关键的核心,就是移除判定表的点和取消协程。首先第一层结构就是用来区分按下的情况。
接下来就是判断判定列表内对应的判断是不是已经用完了,避免玩家乱按报错。
接下来我就写了一串很长的判断。
接下来解释判断中的内容做什么的。
首先我们获取到按下时间,到最近的下一个点的时间差是多少。
首先第一种情况,音符还没出就乱按。
接下来是第一种判断类型,按下时机在最佳判定前。
接下来是按下时机在最佳判定后,这里主要是要取消协程。
然后就依靠判断完善所有的情况。
还缺一点,就是按下的判定框需要消掉,虽然目前在事件点后会正常的消失,但是提前按却不会消失,这里我们在下一篇中解决。
彩紫睨羽
public void 玩家输入响应1(InputAction.CallbackContext context)
{
switch (context.phase)
{
case InputActionPhase.Performed:
if (context.interaction is PressInteraction)
{
string 判断点名称 = "判定点1";
if (节奏点字典[判断点名称].Count > 0)
{
float 节奏点偏差 = (float)节奏点字典[判断点名称][0].time - (float)音乐控制.time;
if (节奏点偏差 > 空按判定时间)//判断按下点是否在空按时间之外
{
print("空按");
}
else if (节奏点偏差 > miss判断时间)
{
print("miss");
节奏点字典[判断点名称].RemoveAt(0);
}
else if (节奏点偏差 > sad判断时间)
{
print("sad");
节奏点字典[判断点名称].RemoveAt(0);
}
else if (节奏点偏差 > good判断时间)
{
print("good");
节奏点字典[判断点名称].RemoveAt(0);
}
else if (节奏点偏差 > perfect判断时间)
{
print("perfect");
节奏点字典[判断点名称].RemoveAt(0);
}
else if (节奏点偏差 > -perfect判断时间)
{
print("perfect");
if (运行中的判断1协程 != null)
{
StopCoroutine(运行中的判断1协程);
运行中的判断1协程 = null;
}
节奏点字典[判断点名称].RemoveAt(0);
}
else if (节奏点偏差 > -good判断时间)
{
print("good判断时间");
if (运行中的判断1协程 != null)
{
StopCoroutine(运行中的判断1协程);
运行中的判断1协程 = null;
}
节奏点字典[判断点名称].RemoveAt(0);
}
else if (节奏点偏差 > -sad判断时间)
{
print("sad判断时间");
if (运行中的判断1协程 != null)
{
StopCoroutine(运行中的判断1协程);
运行中的判断1协程 = null;
}
节奏点字典[判断点名称].RemoveAt(0);
}
else if (节奏点偏差 > -miss判断时间)
{
print("miss判断时间");
if (运行中的判断1协程 != null)
{
StopCoroutine(运行中的判断1协程);
运行中的判断1协程 = null;
}
节奏点字典[判断点名称].RemoveAt(0);
}
}
}
break;
}
}