Порт линейной игры в Unity

Я программирую настольную игру "Get Bit!". Сначала я создал консольную версию, а теперь пытаюсь перенести ее на Unity.

Моя проблема:

В консоли вся игра линейна. Поэтому PlayCards() спрашивает игрока, какую карту он хочет сыграть, и ждет, пока пользователь не введет ее значение.

В единстве я пытаюсь получить ввод через кнопки, но это не ждет пользовательского ввода и контуров с помощью MoveSwimmer() и так далее. Я пытался получить значение с помощью while(inupt == -1), но это останавливало всю игру. В настоящее время метод Run() находится в классе Game: MonoBehaviour, прикрепленном к камере.

Вот код проблемных функций после принятия совета Макадена:

void Game::Update ()
{
    this.GameRun = true;
    Debug.Log(string.Format("Round: {0}", (round - 1)));
    Debug.Log("POSITION: " + PlayerPositionString());

    while (GameRun)
    {
        PlayCards();
        MoveSwimmers();
        GetBit();
        EndTurn();
    }

    Debug.Log(string.Format("Congrats! Player {0} won!", playerPosition.First()));
}

private void Game::PlayCards()
{
    for (int i = 0; i < playerScripts.Count; i++)
    {
        if (playerScripts [i].IsAlive())
            cardsPlayed.Add(playerScripts [i].PlaceCard());
    }
}

override public Card Player::PlaceCard()
{
    // a MonoBehaviour that shows for each card a Button that sets the value member ChoosenCardValue (on default -1).
    GUICardChooser chooser = Camera.main.GetComponent<GUICardChooser>();

    while (chooser.ChoosenCardValue == -1)
        ;

    int cardIndex = cards.FindIndex(c => c.Value == chooser.ChoosenCardValue);
    Card theChoosenOne = cards [cardIndex];
    cards.RemoveAt(cardIndex);

    return theChoosenOne;
}

Я сосредотачиваюсь на неправильном образце? Как я могу исправить эту проблему?

Спасибо за помощь.

2 ответа

Решение

В Unity3D вам не нужно определять свой собственный игровой цикл. Единство уже делает это для вас. Создать Update функция.

Внутри вашего Update функция - проверить вход и реагировать на него. Так как это в цикле, используйте if вместо того, чтобы. Update уже в цикле, хотя вы могли бы в конечном итоге искать различия между ним и FixedUpdate,

что-то вроде:

void Update
{
  if (Input.GetKeyUp (KeyCode.LeftArrow))
  {
    DoSomething();
  }
}

Вы хотите исследовать различные способы борьбы с вводом. Вы не всегда хотите использовать GetKeyUp, Вы могли бы использовать GetAxis или же GetButtonUp например.

Как Dmitry предлагает в своем ответе, вы, вероятно, захотите в конечном итоге реализовать какой-то State Machine в долгосрочной перспективе.

Сначала я думаю, что вы должны просмотреть документы Unity и образцы Unity.

Но если вы хотите реализовать это, одной из возможностей будет создание государственной машины. А внутри вашего метода Update() вы будете вести себя в соответствии с вашим текущим состоянием. Но это только одна возможность. Все зависит от вашего игрового процесса...

Другие вопросы по тегам