
"Unityで作るシリーズ" は今回で3回目になります。少しずつパーツを増やしていって、最終的には大きいワールドにしたい。
今回はUnityでVRChat用テニスコート&ボール発射マシンを作成していきます。
・一人で遊べるボール発射マシンを作成
いつものように開発環境は以下の通りです。
SDK : VRCSDK2(VRCSDK3を使うと、VRC_triggerが使用できない為)
PC OS : Windows 10 Pro
※MACでの開発については未検証ですのでご了承ください。
このページの内容
テニスコートの作成
Unityでテニスコート作成
リアリティを出すために、面積は実際のテニスコートを参考にしました。
参考:https://activel.jp/tennis/uckgg
グラウンドはPlaneオブジェクトで作成し、"StandardAssets"のGrassHillAlbedoを使って
人口芝っぽい感じにしました。
同じくPlaneを加工してテニスコートのラインを作成。
テニスコートのラインより外の部分は"StandardAssets"のMudRockyAlbedoSpecularとしました。
何となくかっこよさげだったからです。
ネットの部分に関しては、Cubeを使って作りました。コートの向こう側が見えるように、少し不透明度を下げ、薄い青色に。
テニス用具の作成
次にテニスボールとテニスラケットです。
ボールはただの球でよいのでSphereで作成し、色は本物っぽい&見やすいライトグリーンな感じに。
ラケットについては、いつもの通り無料アセットを拝借。
今回使わせてもらったのは"BeachBat"というアセットです。
物理的な設定については後述します。
パラメータの調整
球技ではボールが他のものに衝突した時の挙動が重要になってきます。
いろいろ試した結果、今回は以下のパラメータを使っています。
テニスボール
半径は10cmです。それより小さいと見づらいかなーと思ったので。
RigidBody
PhysicMaterial
また、VRC_pickupコンポーネント、VRC_Object Syncを付けておきます。
テニスラケット
大きさはアセットのものを3倍することで当たり判定を大きくしました。
VRC_pickupコンポーネント、VRC_Object Syncを付けて、ラケットでボールを打った時にボールの位置が他のプレイヤーに同期されるようにしておきます。(こちらの記事を読む限り、ボールとラケットの両方にこの設定があれば、ラケットを持った人がボールを打った時にボールのownershipが得られ、打った情報が他の人にも同期されるはず)
RigidBodyとMeshCollider
ちなみに、3つ目のMeshColliderがボールを打つ面にあたるので一番重要で、PhysicMaterialは同アセット内の"Rubber"を使っています。
PhysicMaterial
これがRubber
テニスコート
RigidBody
PhysicMaterial
ボール発射マシンの作成
複数人でのプレイ? 1人でのプレイ?
複数人でテニスのプレイができたらと思って作ったワールドではありますが、
結論から言ってしまえば、かなり難しいと思われます。
なぜなら、テニスコートはVRで移動するには広すぎるからです。
(VRゲームに卓球が多いのはこのためですね)
ということで、どうするかというと、
ボールを発射してくれるマシンを作って、それを打ち返す!! という仕様を作って、
1人でも遊べる感じにしようと思います。
発射する砲台の作成
さて、ボールを発射する起点を決めなければいけませんね。
ぶっちゃけ形はどうだっていいんですが、今回はこのような形にしてみました。
砲台の中心には、このように球を込めます。(↓見やすいように一時的に透明にしています)
砲台を動かすスイッチの作成
テニスコートの砲台の逆サイドにボールを発射させるためのスイッチをおきます。
黒いキューブの名称をCannonSwitch、埋め込まれている白いキューブの名称をCannonSwitchButtonとしました。
スイッチに設定する動作の解説
まずは、今回設定する動作について少し説明を。
先ほど作ったスイッチに以下の機能を加えます。
・黒いキューブ(CannonSwitch):こちらの動作がメインとなる。ON状態の時に動作を行う。
具体的には、ON状態のとき白いキューブは緑色に点灯。5秒おきに砲台からテニスボールが発射される。
VRC_Triggerの設定
さて、VRC_Triggerの設定です。
まずは白いキューブ(ボタン)の方を設定します。
下図のように設定しました。
説明も図の中に直接書き込みました。
SetComponentActiveの中身は、EnableをToggleに設定します。
これで、黒いキューブのVRC_Triggerが
アクティブの時は非アクティブに、非アクティブのときはアクティブになります。
次は黒いキューブの方に以下の設定を行います。
図の下のアクション(ボタンの色変え)から先に動作します。
図の上側のアクションは5秒間隔で繰り返しになります。
SendRPCというのは他のオブジェクトに対し、アクションを起こさせるアクションです。
この場合ではテニスボールに対して、リスポーン(元の位置に出現)させることによって、
テニスボールを砲台の中に戻します。
言い忘れていましたが、テニスボールにはVRC_Object Syncコンポーネントを付けておきます。 そうしないとSendRPCの対象となりません。
テニスボールを初期位置に戻した後は、AddForceによりテニスボールを発射させます。
距離によりますが、今回は以下のように設定しました。
Zが前方向ですね。サーブエリア後方のラインくらいでバウンドするようにしました。
基本的には、以上で設定は完了です。それでは、実際にVRChatでの動作を確認してみます。
完成
実際にVRChatでの動作を確認します。
スイッチ起動よーし。
ボール繰り返し発射よーし。バウンドの仕方もいい感じです。
空はやっぱ夕焼けがいいすね。
ラケット大きい....ですがこれくらいないと当たらないんですよね
打つのはちょっと難しいけど、相手コートに返せたら嬉しさを感じる。
ターゲットとか置いてあれば尚いいかも。
最後に

ボールやラケットの撥ね方等、調整が難しいですが、何とかテニスが可能になったかと思います。
VRChat×Unityシリーズは今回が3回目、そろそろPublic公開できるちゃんとしたワールド作りたいなぁ...と思ってます。


Oculus とか VR について知ってる情報も発信します!!