钓鱼迷你游戏自动重启(Unity,C#)

钓鱼迷你游戏自动重启(Unity,C#),c#,unity3d,C#,Unity3d,作为我项目的一部分,我正在制作一个钓鱼迷你游戏。规则是,当玩家在某个位置(靠近水面)时,他们可以按E来抛线,然后在鱼咬人之前随机等待一段时间。然后,他们必须在短时间内再次按下E键才能捕捉到鱼。最后,他们可以选择是保留鱼还是把鱼扔回水中。如果他们在一个更大的时间范围内再次按下E键,如果他们等待的时间太长,他们可以保持它,它就会被扔回去 这整个过程确实有效,但是,当序列完成或由于玩家未能完成迷你游戏而取消时,会遇到问题 由于这是一个更大项目的一部分,我使用一个大的if语句来检查玩家按下E时的某些条件

作为我项目的一部分,我正在制作一个钓鱼迷你游戏。规则是,当玩家在某个位置(靠近水面)时,他们可以按E来抛线,然后在鱼咬人之前随机等待一段时间。然后,他们必须在短时间内再次按下E键才能捕捉到鱼。最后,他们可以选择是保留鱼还是把鱼扔回水中。如果他们在一个更大的时间范围内再次按下E键,如果他们等待的时间太长,他们可以保持它,它就会被扔回去

这整个过程确实有效,但是,当序列完成或由于玩家未能完成迷你游戏而取消时,会遇到问题

由于这是一个更大项目的一部分,我使用一个大的if语句来检查玩家按下E时的某些条件。其中一个条件是钓鱼所需的条件。当条件满足时,bool被设置为true,以通知另一个脚本我想要运行“Fishing”方法

据我所知,尽管这段代码被告知只能在这种情况下运行,而且每当游戏结束或取消时,我都会显式地写下“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();

            }
        }
    }

}
如果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();
                    }
                }
            }
        }
    }
}