Port线性游戏到Unity

本文关键字:Unity 游戏 线性 Port | 更新日期: 2023-09-27 17:58:01

我正在编程桌面游戏"Get Bit!"。首先我创建了一个控制台版本,现在我正试图将其移植到Unity。

我的问题:

在控制台中,整个游戏是线性的。因此,PlayCards()会询问玩家他想玩什么牌,然后等待用户输入其值。

在unity中,我试图通过Buttons获得输入,但这并不等待用户输入,并与MoveSwimmer()等联系。我试图通过while(inupt==-1)获得值,但这冻结了整个游戏。目前,Run()方法在一个附加到相机的类Game:MonoBehavior中。

以下是接受McAden建议后出现问题的函数的代码

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;
}

我关注的是错误的模式吗?如何解决此问题?

谢谢你的帮助。

Port线性游戏到Unity

在Unity3D中,您不需要定义自己的游戏循环。团结已经为你做到了。创建一个Update函数。

Update函数内部-检查输入并对其作出反应。由于它处于循环中,请使用if而不是while。Update已经在一个循环中,尽管您最终可能会查找它与FixedUpdate之间的差异。

类似于:

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

你会想研究处理输入的不同方式。您不会总是想要使用GetKeyUp。例如,可以使用GetAxisGetButtonUp

正如@Didier在他的回答中所建议的那样,从长远来看,你可能希望最终实现某种状态机。

首先,我认为您应该查看Unity文档和Unity示例。

但是,如果您想实现它,其中一种可能性就是创建一个状态mashupine。在Update()方法中,您将根据当前状态进行操作。但这只是一种可能性。这完全取决于你的游戏。。。