捕鱼小游戏自动重启(Unity, C#)

问题描述 投票:1回答:1

我正在创建一个钓鱼小游戏作为我项目的一部分。游戏规则是当玩家在某个位置(靠近水面)时,他们可以按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的原因,我也在努力联系我的同行,以获得他们的帮助!我很感激。

非常感谢任何反馈,如果有任何更多的信息需要让我知道!杰米。

c# unity3d
1个回答
1
投票

我在第一种方法中看到的是。

在游戏结束或开始的时候,我没有看到将计时器的值重置为0的事实。

我的建议是把每一个状态都切成方法......这样在游戏状态之后,你就可以执行相应的方法......这样更容易看到和调试你的游戏逻辑......。

© www.soinside.com 2019 - 2024. All rights reserved.