【cluster】バレラン1.5で実装した射撃数同期カウンター、およびラグ回避策について

2020/12/14追記
 
同期の頻度が更新され、メッセージの遅延や欠損の回数が減りました。体感、約0.5秒間隔だったメッセージの送信が、約0.3秒ほどに縮んだように思います。
 またOwnershipや状態(この記事でいうメッセージ)のやりとり周りについて詳しく記載されたドキュメントが公式から出ています。そちらをご参考に、ここの記事はあくまでそれ以前の情報としてお読みください。


 ガルペノです。拙作の「BULLET RUNNERS!!! 1.5」にて実装した、射撃数の同期カウンターについて解説します。同時に、マルチプレイのロボファイトを例に、ラグを回避する策についても書きます。

バレランの同期カウンター

 まずカウントのメッセージをGlobalで管理すると、GlobalのOwner(最初に入室した人)がローカルで検出した回数しか計上されません。そして銃を撃つ人とGlobalのOwnerが異なる場合、約0.5秒未満のメッセージが全て切り捨てられるので、仮に銃を0.3秒の間隔で8回撃ったとしても、他のプレイヤーからは5回しか撃ったことにならず、3回分のメッセージが欠落します。

画像1

 別の場面でも参考にできるよう図にしてみました。バレランに当てはめて言えば、銃を撃った人が8発撃っても、カウントするLogicがOwnerの異なるGlobal LogicやOwnerの異なるItem Logicだった場合、5発とスコアに表示されるのです。実はメッセージの管理がGlobalだった場合にもOwnershipがあると知ったのはびっくりしました。その挙動は最初からシーンに配置されたItemと実質的に同じだったわけです。

 これを解消するため、つまり撃った人の撃った回数をそっくりそのままスコアに表示させるために色々と策を練りました。まずは銃のItem Logicで計算された結果のInteger値を別のItemやGlobalに送れないか頭を捻りましたが、SignalはTimerで送れても、変数は送りようがなかったっぽいです(もしかしたら送る手段があるかもしれないし、変数という言葉が何なのかあまり分かってない)。
  そこで、同じOwner内のオペレーションであればメッセージの欠落が起きないため、銃を撃つプレイヤーと発射数を計算するプレイヤーを同一にさせることにしました。
  まずスタート位置にバリケードとなる壁を設置し、スタートする際にその壁をInteract Item Triggerでタッチさせます。タッチされた壁は非アクティブ化されてスタートのラインが切れるようになります。このタッチ壁に発射カウントのLogicを任せることで、挑戦する人(銃のOwner)=発射カウントを計算する人(カウンターのOwner)となるわけです。

ロボファイトのラグ無し操縦

 Interact Item Triggerは、ItemのOwnershipを別のプレイヤーに奪わせる際、ガルペノがよく使うテクニックです。拙作の「ロボファイトデスマッチ」では、最初に入室した人が全てのロボと制御盤のOwnershipを持っているのですが、それだと二人目以降のロボ操縦にラグが発生し、非常にストレスフルなゲーム体験になってしまいます。そこで、操縦盤とロボット本体をタッチさせる(タッチ後のスイッチは非アクティブ化する)ことで、マルチプレイでもスムーズなロボ操縦を可能にしています。
 ですので、いちど起動完了したロボットを別のプレイヤーが操縦しようとしたり、二人目以降の入室プレイヤーが起動シーケンスを無視して開始すると、非常にもたついたレスポンスのロボ操縦になります。
 ただしこの対策を打ってもしても、弾と的(ロボ)のOwnerが違う以上、撃った弾の数だけのダメージ数を相手のロボに送れません。つまり、マシンガンでどれだけ相手に銃弾を浴びせても、約0.5秒に1発分のダメージしか与えられないのです。発射レートが高く1発ごとの威力が低いマシンガンよりも、発射レートが低めで1発ごとの威力が高いキャノン砲の方が圧倒的に有利になってしまいます。

 この問題を回避するために、まず弾と的のOwnerが異なる(マルチプレイ対戦)前提で、マシンガン側の威力を上げました。また、それだけでは不十分なので、ロボットごとの特徴分けとして、機動力やヒットポイントにも差を設け、なるべく正面同士で撃ち合うことがなくなるようにしました。これはまだ開発できていませんが、テンプレートワールドを参考に装弾数の概念を導入し、弾切れでリロードモーション・その間は無防備、というゲーム性を加えるなども考えています。
 つまり、なるべくプレイヤーにラグを意識させないで遊んでもらおうというわけです。

まとめ

 メッセージが約0.5秒間隔でしか送れないという仕様は、バレランの射撃カウントのようなオペレーションとロジックでは非常に厄介です。またここでは触れませんでしたが、スポーツのボールや銃の弾丸などといったMovable Itemも、Owner以外には約0.5秒おきの座標更新になり、特に球技を再現するようなゲームワールドではあまりスムーズに遊べません。正直なところ、何度か開催されるゲームワールドのコンテストで「マルチプレイ」が審査の基準でありながら、プレイヤー同士のメッセージやアイテム座標の同期が困難な現状では、かなり無理があると個人的に思います。
 しかし、メッセージのやりとりの数が莫大に増えたり、座標更新の頻度がほぼシームレスに行われると、サーバーの処理を圧迫します。なので、この制限が緩和される、メッセージやアイテム座標更新の頻度が上がるのは、今よりももっと後になるんじゃないかと思いますし、自分はそれでいいと思っています。Cluster社はこれからまだまだ発展拡張されていくという現状で、あれが欲しいこれが不満だ、もっとこうしてくれーという声は欲張りだと思うのです。逆に、ガルペノがよく遊ぶFPSやFallGuysのようなゲームにおける同期処理が尋常でないほどのスムーズなのだと思います。
 このラグ緒問題は厄介な点ですが、そんな中で今回のガルペノのような回避策が生み出されたり、GAMEJAM2020夏で大賞をとった「SOCIALEAGUE SOCCER」のアイテム「ガンマー」のように、苦難の中で生まれた素敵な発明品があったり、クリエイティビティが刺激される環境でもあると思います。まだオペレーション機能が到来していない初代バレランでアニメーションを使ったタイマーやカウンターを考案したように、「できない中で できることを模索して、何とか実現を目指す」ことは、普遍的な価値があると思います。

 できないことをできないままで諦めるのは勿体無いです。今はできない機能を、今できる機能でどうにか実現できないか考えてみるのは、非常に楽しいものです(マゾではないです)。いずれCCKの機能が充実して、頭を捻って考え出した仕組みが陳腐化してしまっても、それまでに得られたものは無駄にはなりません。
 皆さんも、CCKの課題にぶつかったらクリエイティビティを発揮して乗り越えましょう。そして同じ熱意を持った仲間たちと切磋琢磨しましょう。困ったことがあったらDiscordでヘルプを求めるのがおすすめです。

この記事が気に入ったらサポートをしてみませんか?