Я создаю мини-игру о рыбалке как часть моего проекта. Правила таковы, что когда игрок находится в определенном месте (около воды), он может нажать 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