Порт линейной игры в 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() вы будете вести себя в соответствии с вашим текущим состоянием. Но это только одна возможность. Все зависит от вашего игрового процесса...