VRChatのアバターには『コンタクト』と呼ばれる機能を追加することができます。この機能では、予め定められた送信用コンタクトと受信用コンタクトが接触すると、特定の変数を操作することができます。この仕組みを活用して、Duel_Systemをはじめとする様々な戦闘システムが開発されています。
しかし、このシステムには課題があります。ローカル(自分のコンピューター)とリモート(他者のコンピューター)間での位置情報のずれが発生することがあり、これが原因で、一方のプレイヤーにはコンタクトが成功したと認識されても、他方のプレイヤーには正確な位置同期がなされず、攻撃が当たらないという問題が生じます。また、リモートクライアントが一時的にフリーズした場合にも、同様の問題が発生することがあります。
この問題の根本的な原因は、攻撃の信号が一瞬のみで有効になっている点にあります。この問題に対処するため、攻撃の信号を連続的に送信することが有効です。これにより、フリーズや位置情報のずれをある程度防ぐことが可能になります。
しかし、攻撃信号を連続して送ると、敵のヒットポイントが急速に減少してしまうという新たな問題が生じます。この問題を解決するために、攻撃信号ではなく、ヒットポイントの値を直接送信する方式に変更しました。このアプローチにより、従来の戦闘システムでは考えられなかったような、剣術の達人による高速な剣の打撃を適切に処理できるようになりました。
この変更により、リモートユーザーのヒットポイントをローカルで管理する方式が採用されました。この方法には一対一での戦闘という制約が伴います。この問題はシステムを"決闘システム"と命名することで完璧に解決されました。
最終的に、ローカルでの全ての処理を行い、ヒットポイントの送信機能を組み合わせることで、VRChatの同期ズレ問題を効果的に解決することができました。
もっとみる