钓鱼迷你游戏自动重启(Unity,C#)
作为我项目的一部分,我正在制作一个钓鱼迷你游戏。规则是,当玩家在某个位置(靠近水面)时,他们可以按E来抛线,然后在鱼咬人之前随机等待一段时间。然后,他们必须在短时间内再次按下E键才能捕捉到鱼。最后,他们可以选择是保留鱼还是把鱼扔回水中。如果他们在一个更大的时间范围内再次按下E键,如果他们等待的时间太长,他们可以保持它,它就会被扔回去 这整个过程确实有效,但是,当序列完成或由于玩家未能完成迷你游戏而取消时,会遇到问题 由于这是一个更大项目的一部分,我使用一个大的if语句来检查玩家按下E时的某些条件。其中一个条件是钓鱼所需的条件。当条件满足时,bool被设置为true,以通知另一个脚本我想要运行“Fishing”方法 据我所知,尽管这段代码被告知只能在这种情况下运行,而且每当游戏结束或取消时,我都会显式地写下“usingRod=false”,但小游戏会再次循环,让玩家陷入无休止的钓鱼游戏中 我知道这可能不是检测输入和运行小游戏的最有效的方法,但到目前为止,它工作得很好,所以不需要改变任何东西 以下是钓鱼方法:钓鱼迷你游戏自动重启(Unity,C#),c#,unity3d,C#,Unity3d,作为我项目的一部分,我正在制作一个钓鱼迷你游戏。规则是,当玩家在某个位置(靠近水面)时,他们可以按E来抛线,然后在鱼咬人之前随机等待一段时间。然后,他们必须在短时间内再次按下E键才能捕捉到鱼。最后,他们可以选择是保留鱼还是把鱼扔回水中。如果他们在一个更大的时间范围内再次按下E键,如果他们等待的时间太长,他们可以保持它,它就会被扔回去 这整个过程确实有效,但是,当序列完成或由于玩家未能完成迷你游戏而取消时,会遇到问题 由于这是一个更大项目的一部分,我使用一个大的if语句来检查玩家按下E时的某些条件
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();
}
}
}
}
如果usingRod=true,下面是运行交互代码的if语句
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();
}
}
}
}
}
}
我很感激这是一个很长的帖子,但是我已经在这上面停留了一段时间,由于新冠病毒,我也在努力联系我的同龄人以获得他们的帮助
非常感谢您的反馈,如果需要更多信息,请告诉我!
杰米我在第一种方法中看到的是: 在processus的末尾或开头,我看不到将计时器的值重置为0的事实
我能建议的是在方法上削减每个状态。。。所以按照游戏状态执行相应的方法。。。最好能轻松查看和调试您的游戏逻辑…您好,谢谢您的回复,您介意详细说明一下吗,因为我不知道您的意思:)我不知道您如何调用钓鱼方法..您能展示一下您的更新吗()。因此,我不知道您是否在何时重置变量计时器:playerController.usingRod=false;我在你的循环中看不到它,所以没有完整的代码就很难调试。我建议你把一个功能包放在某个地方。不要忘记,即使解决方案不是为了提高效率。你是否考虑过调试,看看代码在循环时是如何工作的(例如,单步执行if语句,一路上检查变量)? 这也应该告诉你为什么它会做出循环的决定。我必须承认我对如何在VisualStudio中使用调试工具不太了解,但我一直在观察unity中inspector中变量的开关。我可以看出,使用Rod仍然是正确的。通常情况下,如果某件事是真实的,你不能手动关闭它,但我可以在我的情况下,这是困惑我进一步哈
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();
}
}
}
}
}
}