マルチプレイにしたことで、Sunderstarをシングルプレイで作る場合に想定していた開発時間と問題の数は、少なくとも3倍になりました。比較的単純な宇宙シューティングでも、艦船や弾がどこにあるべきかについてクライアントとサーバーが食い違うと、複雑になります。

問題は基本的な操作に表れていました。サーバー更新を待つと移動入力への反応が遅れます。衝突付近では、クライアントとサーバーの差によって船が補正位置へ引き戻されることがありました。更新が遅れると、遠くの物体の動きを滑らかに保つのも難しくなります。

射撃にも似た問題がありました。武器に拡散があると、即座に表示したローカルの弾とサーバーの弾を確実に対応させられません。古いサーバー位置に補正すると、弾が後ろへ跳んだり速度が変わったように見えたりします。命中エフェクトも適切なタイミングで表示し、サーバー確認の到着時に再び光らないようにする必要がありました。

ローカル艦船を変更し、サーバーと同じ計算で即座に動きを予測して、更新の到着時に差を補正するようにしました。他の艦船は受信した位置の間を滑らかに移動し、更新が遅れた場合は限定的に動きを推定します。

衝突にも予測が必要です。クライアントはサーバーの衝突データを使い、自艦が小惑星や他の艦船にどう反応するかを計算します。ローカルで動かすのは自艦だけです。小さな位置補正は滑らかに行い、テレポートなどの大きな変化はすぐ反映します。

表示用の弾は、後方へ跳ぶことなくサーバーの方向を採用し、一定速度を保つようになりました。命中エフェクトはローカルで表示し、対応するサーバー側のエフェクトは抑えて、同じ命中が2回光らないようにします。命中とダメージは引き続きサーバーが決定します。

弾の生成、マズルフラッシュ、音、再生にも、砲身の先端の同じ位置を使うようにしました。移動予測の変更によって、Hostモードのボット所有権に関するバグも見つかり、修正が必要になりました。

自動チェックは通過し、Unityのネットワークシミュレーションでも数値は改善しています。ただし、専用サーバーを使った実際のインターネット経由のプレイで、その改善を確認する必要があります。

マルチプレイを開発したことがある方は、一見簡単なのに、きちんと動かすまで最も時間がかかった機能は何でしたか?