見出し画像

VRChatでUDONエアホッケーを作ってみた話 2

前回の続きです。承前

プログラム的な構造がシンプルだという理由でエアホッケーを作ってみることにしたので、アプローチもできるだけシンプルに行きましょう。
・まずBlenderで適当なモデルを作ります。

画像1

・Unityで適当に判定を付けます。摩擦は0、反発は100%で。

画像2

土台が出来たら実験を始めましょう。

(案1) 素直にSynchronize Positionで同期

何はともあれ、まずはUdon Behaviourの標準機能で試します。
やることは簡単。Colliderを設定してMalletとPuckが接触した時にPuckのOwnerをMalletを持っているplayerにするだけ。

   // Puckが接触したオブジェクトがMalletだったらOwnerを取得
   // ※Mallet側で自分が持っているObject以外接触しないようにしています
   public void OnCollisionEnter(Collision collision)
   {
       if (collision.gameObject.name == Mallet_a.name)
       {
           //同期情報更新用にOwner権取得
           Networking.SetOwner(Networking.LocalPlayer, gameObject);
       }
       else if (collision.gameObject.name == Mallet_b.name)
       {
           //同期情報更新用にOwner権取得
           Networking.SetOwner(Networking.LocalPlayer, gameObject);
       }
   }


そして結果は以下の通り。

画像3

Owner(赤)は想定通りに壁で反射しましたが、相手側だと衝突前にぐにゃっと曲がってしまいました。これは断続的に位置で同期をしているからでしょうね。

画像4

結果として、攻撃側はエアホッケーをしているのに守備側は熱血高校ドッジボール部をやることになってしまうわけです。
面白い動きではありましたが、見え方が完全に異なるのはさすがに受容できないので別の方法を考えましょう。
※当時のバージョンが残ってないので動画は作れませんでした。

しかし、ここまでは想定通り。
次は「非同期Puckに同期した力を与える」案です。

長くなってきたので次回へ続きます。

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