5

現在、Roblox (Lua を使用) を使用してゲームに取り組んでいます。基本的にいくつかのミニゲームで構成されています。各ラウンドの開始時に、ゲーム内のすべてのプレイヤーがテーブルに配置され、エリアにテレポートされます。そこでコルーチンの出番です。ラウンドが進行中なので、コルーチンを開始します。そのコルーチンは毎秒、プレイヤーの健康状態がゼロ以下かどうかをチェックし、そうであれば currentPlayer テーブルからそれらを削除します。

問題を正しく説明していない場合は申し訳ありませんが、コルーチンは生成されません。これまでコルーチンを使用したことがないため、おそらく間違った方法で生成しようとしています。あなたのほとんどがRobloxに慣れていないことはわかっていますが、Luaの構文は同じです.

ループしているコルーチンを終了する方法の例を教えてください。

currentPlayers = {}
roundTime = 60

local lookForWinners = coroutine.create(function()
  while coroutine.running do
    wait(1)
    for i, v in pairs(currentPlayers) do
      if v.Character.Humanoid.Health <= 0 then
        table.remove(currentPlayers, v)
      end
    end
  end
end)


while wait() do
  repeat display("Two or more players need to be in the game.", 1) until #_G.plrs > 1 --Ignore, just checks if two+ players are in game.
  display("Picking a map...", 3) pickMap()
  teleport(0, 500, 0)
  coroutine.resume(lookForWinners)
  wait(roundTime)
  print("Round over")
  coroutine.yield(lookForWinners)
end
4

2 に答える 2

3

イベントを使用するには、Stuart のアドバイスに従うことをお勧めします。これは主に、コルーチンを正しく使用するのに役立つ追加情報を提供するためのものです。

コルーチンは、値を返す可能性のある関数と考えてください。ただし、ひねりがあります。「通常の」関数は実行時に完了しreturnますyieldが、コルーチンから離れると状態が保存されるため、resume降伏した時点から継続できます。何も起こらなかった。yield コルーチンから、そのコルーチンの が実行されたポイントまでのみであることに注意してくださいresume(これは、関数を呼び出してそこから戻ることと同じです。コントロールは、関数を呼び出したポイントに戻ります)。

それに加えて、resumeandyield呼び出しを使用すると、値をコルーチンに渡し、コルーチンから (中間) 値を返すことができます。これをどのように使用できるかの例については、このSO の回答を参照してください。

コルーチンからも可能returnであり、実行を完了する関数から戻るのと同じです。その時のコルーチンの状態を確認すると( coroutine.status)、「死んでいる」はずです。

したがって、ループしているコルーチンを終了する方法についての質問に答えるには、それを終了するか、それを終了するかreturn(yield()そして二度と終了resumeしない)、または を呼び出しerror()て、呼び出しの結果をキャッチして確認することができresumeます。そうは言っても、問題を解決するには間違った方法かもしれないというスチュアートの意見に同意します。

于 2014-02-18T21:36:13.000 に答える