Рыбалка мини-игра автоматически перезапускается (Unity, C#) - PullRequest
1 голос
/ 30 апреля 2020

Я создаю мини-игру о рыбалке как часть моего проекта. Правила таковы, что когда игрок находится в определенном месте (около воды), он может нажать E, чтобы разыграть свою линию, а затем подождать в течение произвольного промежутка времени, прежде чем укусит fi sh. Затем они должны снова нажать E в течение короткого периода времени, чтобы поймать fi sh. Наконец, им предоставляется выбор оставить ФИ sh или бросить его обратно в воду. Если они снова нажимают E в течение более длительного промежутка времени, они могут сохранить его, если они будут ждать слишком долго, он возвращается обратно.

Весь этот процесс работает, однако проблема возникает, когда последовательность завершена или был отменен из-за ошибки игрока в мини-игре.

Поскольку это часть гораздо более крупного проекта, я использую большой оператор if для проверки определенных условий, когда игрок нажимает E. Одно из этих условий - то, что требуется для go рыбалки. Когда условие выполнено, для 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();

            }
        }
    }

}

Вот условие для установки usingRod в значение true в большом операторе if, вызываемом в Update ()

(это вложено в проверку Input.GetKeyDown ())

if (currentInventoryIndex == 2 && interactionsManager.interaction.requiredTool == 2)
{
        usingRod = true;

}

Вот оператор 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();
                    }
                }
            }
        }
    }
}

Я ценю, что это длинный пост, однако я застрял на нем некоторое время и В связи с этим я изо всех сил пытаюсь связаться со своими сверстниками, чтобы получить их помощь!

Большое спасибо за любые отзывы, и если потребуется дополнительная информация, дайте мне знать! Jam ie

1 Ответ

1 голос
/ 30 апреля 2020

то, что я вижу в первом подходе:

В конце или начале процесса, я не вижу факта сброса в 0 таймера значения

, что я мог бы предложить, чтобы сократить каждое состояние в методе ... поэтому, следуя состоянию игры, вы выполняете метод, соответствующий ... лучше видеть и отлаживать свои логи c игры ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...