钓鱼小游戏自动重启(Unity、C#)
Posted
技术标签:
【中文标题】钓鱼小游戏自动重启(Unity、C#)【英文标题】:Fishing mini game automatically restarting (Unity, C#) 【发布时间】:2020-08-14 20:26:07 【问题描述】:我正在创建一个钓鱼小游戏,作为我项目的一部分。规则是,当玩家在某个位置(靠近水)时,他们可以按 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 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();
我很欣赏这是一篇很长的帖子,但是我已经坚持了一段时间了,由于新冠疫情,我也在努力联系我的同行以获得他们的帮助!
非常感谢您的任何反馈,如果需要更多信息,请告诉我! 杰米
【问题讨论】:
您是否考虑过调试以查看代码在循环时的工作方式(即单步执行 if 语句,沿途检查变量)?这也应该告诉你为什么它决定循环。 我必须承认我不太了解如何在 Visual Studio 中使用调试工具,但我一直在观察统一检查器中要求的变量打开和关闭。我可以看到 usingRod 确实保持不变。通常,如果某些事情保持真实,您将无法手动将其关闭,但在我的情况下我可以这样做,这让我更加困惑哈哈 【参考方案1】:我在第一种方法中看到的是:
在进程结束或开始时,我没有看到将值计时器重置为 0 的事实
我的建议是削减方法中的每个状态...所以按照游戏状态执行相应的方法...更好地查看和调试您的游戏逻辑...
【讨论】:
您好,感谢您的回复,您是否介意详细说明一下,因为我不确定您的意思:) 我不知道你如何调用钓鱼方法..你能显示你的更新()。所以我不知道你是否重置了变量计时器 你什么时候做: playerController.usingRod = false;我没有在你的循环中看到它 所以如果没有完整的代码很难调试..我建议你把一个功能包放在某个地方...... 不要忘记即使解决方案不是为了支持这项工作以上是关于钓鱼小游戏自动重启(Unity、C#)的主要内容,如果未能解决你的问题,请参考以下文章