Unbreakable Loop в Unity, не уверен, как исправить. Причинение краха Unity - PullRequest
0 голосов
/ 29 апреля 2019

Я пытаюсь создать «комбинированную» систему в единстве, но я создал цикл Unbreakable, который я изо всех сил пытаюсь понять.Я попытался использовать цикл while, и у меня возникла эта проблема, поэтому я хотел попробовать цикл for, но у меня тот же результат.

Система комбо должна работать так, что когда игрок входит в условие с врагом, он может ввести цепочку кнопок на контроллере, чтобы вызвать комбо.Если игрок вводит правильную комбинацию, применяются эффекты.Пока что я беспокоюсь только о том, чтобы заставить работать комбо-систему.

Я создал предопределенный массив символов для комбо, а затем сравнил входные данные от игрока с этим массивом.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ComboSystem : MonoBehaviour
{
    public char currentButton;
    public char[] combo_arr = { 'A', 'A', 'B', 'B', 'X' };

    PlayerLockOnSystem plos;

    private void Start()
    {
        plos = GetComponent<PlayerLockOnSystem>();
    }

    private void Update()
    {
        if (plos.lockedOn)
        {
            Combo();
        }
    }

    void DetectComboButtons()
    {
        if (Input.GetButton("Joystick A"))
        {
            currentButton = 'A';
        }

        if (Input.GetButton("Joystick X"))
        {
            currentButton = 'X';
        }

        if (Input.GetButton("Joystick B"))
        {
            currentButton = 'B';
        }


    }

    void Combo()
    {



        for (int i = 0; i < combo_arr.Length; i++)
        {
            DetectComboButtons();

            if (currentButton == combo_arr[i])
            {

                Debug.Log("Correct: " + currentButton);
            }
            else
            {
                i = 0;
                Debug.Log("Incorrect");
            }
        }






    }




}

При запуске метода Combo () происходит сбой Unity, и мне приходится принудительно закрывать редактор.

1 Ответ

1 голос
/ 29 апреля 2019

Вам необходимо проверять ввод между кадрами, в разных вызовах обновления.Попробуйте это:

private const char CHAR_THAT_MEANS_THAT_THE_PLAYER_DIDNT_BREAK_THE_CHAIN = '0';//doesnt matter

private int _currentPlaceInTheComboChain = 0;

private void Update()
{
    if (plos.lockedOn)
    {
        Combo();
    }
}

char DetectComboButtons()
{
    if (Input.GetButtonDown("Joystick A"))
    {
        return 'A';
    }

    if (Input.GetButtonDown("Joystick X"))
    {
        return 'X';
    }

    if (Input.GetButtonDown("Joystick B"))
    {
        return 'B';
    }
 return CHAR_THAT_MEANS_THAT_THE_PLAYER_DIDNT_BREAK_THE_CHAIN;


}

void Combo()
{
    char currentButton = DetectComboButtons();
    if (currentButton == CHAR_THAT_MEANS_THAT_THE_PLAYER_DIDNT_BREAK_THE_CHAIN) 
    {
       return; //the player didn't continue the combo but didn't break it (yet)
    } 

    if (currentButton == combo_arr[_currentPlaceInTheComboChain])
    {
       _currentPlaceInTheComboChain++;//wait for the next button, will only be checked the next time update is called
       Debug.Log("Correct: " + currentButton);
       if (_currentPlaceInTheComboChain == combo_arr.Length) { //this was the last button in the combo
           _currentPlaceInTheComboChain = 0; //for a new combo
           Debug.Log("Combo completed");
       }
    } else {
      _currentPlaceInTheComboChain = 0; //player broke the chain
      Debug.Log("Incorrect " + currentButton);
    }

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