Unity3d несколько bools работают как переключение при нажатии кнопки - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть три bool в скрипте boolA, boolB & bool C. При запуске активируется bool C. Bool отлично работают в инспекторе, но я хочу подключить их к «кнопке», например: если кнопка нажата 1 раз, активируется «boolA», а boolB и bool C отключаются. Если кнопка нажата 2 раза, активируется «boolB», а boolA и bool C отключаются. Если кнопка нажата 3 раза, активируется «bool C», а boolA и boolB деактивируются. И если после 3-го раза снова нажать кнопку, снова активируется «boolA». Вот мой код

public bool a = false;
public bool b = false;
public bool c = false;

void Start () {

    c = true;
}
// Update is called once per frame
void Update () {

    if (a == true) {
        if (c)
            c = false;
            a = true;

    }

    if (b == true) {
        if (a)
            a = false;
            b = true;
    }

    if (c == true) {
        if (b)
            b = false;
            c = true;
    }
}

}

Ответы [ 3 ]

0 голосов
/ 25 февраля 2020

Здесь у вас есть состояния, поэтому я бы не использовал bool для этого, а, например, enum как

public enum ButtonState
{
    A, // == 0
    B, // == 1
    C, // == 2


    count // not used as value but simple way to wrap around the maximum value
} 

, а затем сделал бы

// initially it is C
ButtonState currentState = ButtonState.C;

public bool a = false;
public bool b = false;
public bool c = false;

public void OnButtonPressed()
{
    var index = (int)currentState + 1;
    if(index >= (int)ButtonState.count) index = 0;

    currentState = (ButtonState)index;

    // Now if you really need those bools
    a = currentState == ButtonState.A;
    b = currentState == ButtonState.B;
    c = currentState == ButtonState.C;

    // otherwise use the currentState e.g. with a switch
}

Большой Преимущество здесь в том, что если вы позже решите добавить больше возможных состояний, вам нужно всего лишь добавить их в enum до count, и вам не придется вносить изменения везде в вашем коде.

0 голосов
/ 25 февраля 2020

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

private bool b[] = new bool[3] { true, false, false };
private int curr;

public void OnButtonPressed()
{
    curr = (curr + 1) % b.length; // here we are moving from one element 
                                  // to the next and back to the first one when 
                                  // we encounter the end

    for(int i = 0; i < b.lenght; ++i) // and here we're simply setting all your bools up
        b[i] = i == curr;
}

Это легко понять и очень сжато. Более того, если вам нужно другое состояние, чтобы их было 4, вам просто нужно изменить количество элементов в массиве b.

0 голосов
/ 25 февраля 2020

Прежде всего переместите ваш скрипт в событие OnClick, чтобы оно работало только при нажатии на кнопку.

void OnClick() {

if (a == true) 
{
    b = true
    c = a = !b;
}

if (b == true) {
    c = true
    b = a = !c;
}

if (c == true) {
    a = true
    c = b = !a;
}
}
...