钓鱼小游戏自动重启(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#)的主要内容,如果未能解决你的问题,请参考以下文章

Unity游戏开发——C#特性Attribute与自动化

Unity- 游戏结束以及重启游戏

Unity编辑器下重启

Kindle自动重启是啥情况

最近kindle老自动重启是咋回事?

安卓service关闭后怎么自动重启