【问题标题】:Port linear Game to Unity [closed]将线性游戏移植到 Unity [关闭]
【发布时间】:2014-04-11 18:04:19
【问题描述】:

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

我的问题:

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

在统一中,我试图通过按钮获取输入,但这不会等待用户输入并继续使用 MoveSwimmer() 等等。我试图通过 while(inupt == -1) 获取值,但这冻结了整个游戏。 目前 Run() 方法在一个 Game 类中:MonoBehaviour 附加到相机。

这是有问题的函数的代码在听取 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;
}

我是否专注于错误的模式?我该如何解决这个问题?

感谢您的帮助。

【问题讨论】:

  • 这个问题没有结束真是太可笑了。

标签: c# design-patterns unity3d game-engine


【解决方案1】:

在 Unity3D 中,您不需要定义自己的游戏循环。团结already does that for you。创建一个Update 函数。

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

类似:

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

您需要研究different ways of dealing with input。你不会总是想使用GetKeyUp。例如,您可以使用GetAxisGetButtonUp

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

【讨论】:

  • 我不想使用更新循环,因为它不会等待用户出牌。如何让更新功能等到用户打出一张牌? (也许这与我的用户输入有关)?我刚刚在我的帖子中添加了 PlaceCard() - 我认为这是它不起作用的真正原因。
  • 这就是状态机的原因。您可以在自己的状态下或在过渡中制作位置卡。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    相关资源
    最近更新 更多