すべてのブロックは固い ― そうでないときを除いて
私たちのクライアントのメッシャーには、鉄の掟があります。空気ではないブロックは、すべて描画され、当たり判定を持つ。以上です。この単純化のおかげでメッシュ化は速く、コードもシンプルです。ところが、まさにこのルールを破りたがる機能が現れました。
エネルギーゲート。エネルギーフェンスに、ゲートがほしくなりました。プレイヤーと味方のNPCはそのまま通り抜けられるけれど、野生の動物は通れない、きらめく膜です。つまり、見えているのに、一部の相手にとっては壁にならないブロックです。私たちの設計には、まったく想定されていないものでした。
解決策は二つの半分でできています。クライアント側では、メッシャーに初めて意図的な例外ができました。ゲートのブロックは描画されますが、当たり判定のメッシュからは除外されるので、プレイヤーはそのまま通り抜けられます。サーバー側では、本当のロジックが動きます。生き物の移動システムが一歩ごとに、エネルギーの壁が行く手にあるかどうかを確認するのです。野生の動物と敵は引き返し、仲間とプレイヤーは通れます。このチェックは、野生動物、仲間、惑星の敵という三つの移動システムすべてに入れる必要がありました。そうしないと、ある種類の生き物だけがゲートの存在を「知らない」ことになってしまいます。
正直な補足:飛ぶ生き物は、フェンスの上をすーっと越えていきます。これはバグではなく、記録に残した制限です。フェンスは、飛ぶものを止められないのです。こうした意図的な抜け穴は、隠すより書き留めておきたいと思っています。
残る教訓は、「空気以外はすべて固い」のような設計ルールは、シンプルだからこそ価値があるということです。ただし、たった一つの例外がどこにあって、なぜそこにあるのかは、知っておかなければなりません。
コメント