我正在创建一个钓鱼小游戏作为我项目的一部分。游戏规则是当玩家在某个位置(靠近水面)时,他们可以按E键抛出鱼线,然后在鱼儿咬钩前等待一段随机的时间。然后,他们必须在很短的时间内再次按E键才能钓到鱼。最后,他们可以选择保留鱼或者把鱼扔回水里。如果他们在较大的时间范围内再按一次E,他们可以保留它,如果他们等待的时间太长,它就会被扔回水里。
这整个过程确实有效,然而,当序列已经完成或由于玩家失败的小游戏而被取消时,问题就会出现。
由于这是一个更大的项目的一部分,我使用一个大的if语句来检查某些条件,当玩家按下E时,其中一个条件是去钓鱼所需要的。当条件满足时,一个bool被设置为true,以通知另一个脚本,我想运行 "钓鱼 "方法。
据我所知,尽管这段代码被告知只在这个条件下运行,而且每当游戏结束或被取消时,我都明确写下 "usingRod = false",但小游戏还是会再次循环,让玩家陷入无休止的钓鱼游戏中。
我明白这可能不是最有效的检测输入和运行迷你游戏的方法,但到目前为止它工作得很好,所以还没有真正需要改变什么。
这是钓鱼的方法。
public void Fishing()
{
if (playerController.usingRod)
{
playerController.DisablePlayerInput();
if (fishStage == 0)
{
playerAnimator.SetTrigger("fishing_cast");
Debug.Log("waiting for bite");
if (!generated)
{
random = Random.Range(randomWaitTime.x, randomWaitTime.y);
generated = true;
}
timer += Time.deltaTime;
if (timer >= random)
{
Debug.Log("Bite");
playerAnimator.SetTrigger("fishing_bite");
timer = 0;
generated = false;
fishStage = 1;
}
else if (timer < random && Input.GetKeyDown(KeyCode.E))
{
Debug.Log("reel too early");
playerAnimator.SetTrigger("fishing_fail");
CancelInteraction();
}
}
else if (fishStage == 1)
{
timer += Time.deltaTime;
if (timer < 1f && Input.GetKeyDown(KeyCode.E))
{
playerAnimator.SetInteger("fishing_randomIndex", Random.Range(1, 5));
Debug.Log("caught");
timer = 0;
fishStage = 2;
}
else if (timer > 1f && Input.GetKeyDown(KeyCode.E))
{
playerAnimator.SetTrigger("fishing_fail");
CancelInteraction();
}
else if (timer > 2f)
{
playerAnimator.SetTrigger("fishing_fail");
CancelInteraction();
}
}
else if (fishStage == 2)
{
timer += Time.deltaTime;
if (timer <= 5f && Input.GetKeyDown(KeyCode.E))
{
playerAnimator.SetTrigger("fishing_keep");
CancelInteraction();
}
else if (timer >= 5f)
{
playerAnimator.SetTrigger("fishing_throw");
CancelInteraction();
}
}
}
}
下面是在Update()中调用的大号if语句中设置usingRod为true的条件。
(这嵌套在Input.GetKeyDown()检查中)
if (currentInventoryIndex == 2 && interactionsManager.interaction.requiredTool == 2)
{
usingRod = true;
}
下面是运行交互代码的if语句if usingRod = true
private void Update()
{
if (interaction != null)
{
if (interaction.GetInteractable())
{
canInteract = true;
}
else
{
canInteract = false;
}
if (!interaction.GetComplete() && !interaction.GetCancelled())
{
if (interaction.interactionName == "Squirrel")
{
indivInteractions.Squirrel();
}
else if (interaction.interactionName == "Fetch")
{
indivInteractions.Fetch();
}
else if (interaction.interactionName == "BlueJay")
{
indivInteractions.BlueJay();
}
else if (interaction.interactionName == "Deer")
{
indivInteractions.Deer();
}
else if (playerController.usingAxe)
{
if (playerController.currentInventoryIndex == 1)
{
if (interaction.interactionName == "TreeChop1")
{
indivInteractions.Chop();
}
if (interaction.interactionName == "CampWood")
{
indivInteractions.CampsiteChop();
}
if (interaction.interactionName == "FallenTree")
{
indivInteractions.FallenBridge();
}
}
}
else if (playerController.usingRod)
{
if (playerController.currentInventoryIndex == 2)
{
if (interaction.interactionName == "Fishing")
{
indivInteractions.Fishing();
}
}
}
}
}
}
我很感激这是一个很长的帖子,然而我已经被这个问题卡住了一段时间,由于covid的原因,我也在努力联系我的同行,以获得他们的帮助!我很感激。
非常感谢任何反馈,如果有任何更多的信息需要让我知道!杰米。
我在第一种方法中看到的是。
在游戏结束或开始的时候,我没有看到将计时器的值重置为0的事实。
我的建议是把每一个状态都切成方法......这样在游戏状态之后,你就可以执行相应的方法......这样更容易看到和调试你的游戏逻辑......。