VRChatでMiniGolfワールドを作る2(ホール作成編)

2023/07/03に公開

前回の記事の続きです。
今回は新規にUnityでシーンを作成してMini Golfのホールを作成していきましょう。

前回の記事はこちら。
https://zenn.dev/tyaahan/articles/8bc404fbf59c8b

前提

  • VRChatでWorldを作成しUploadしたことがある
  • 前回の記事にてプロジェクト設定完了済み
    • 各種Package、Assetを導入しておいてください
  • バージョン
    • VCC
      • v2.1.1
    • Unity
      • 2019.4.31f1
  • ゴルフ用語の説明
    • ホール
      • ゴルフゲームの1つのラウンド。ティーグラウンドからグリーンまでのこと
    • コース
      • 18ホールで1つのゲームとなる。1つのゲームをコースと言う
    • カップ
      • 各ホールにあるゴール地点をカップと呼ぶ。小さな縦穴。
      • これを「ホール」と呼ぶこともあるが、ややこしいのでこの記事ではカップと表現する
      • OpenPuttに含まれるファイルは、カップのコライダー名が「Hole」となっているので混同しやすい!注意

簡単なホールを作る

基本的にOpenPutt公式の手順Adding Courses通り。

https://github.com/mikeee324/OpenPutt

ワールドを作成

まずシンプルなワールドを作成し、問題なくビルドとテストができるかを確認します。
シーンと床、スポーン地点だけ作り、ビルドとテストを行います。
Unityでの作業となります。

  • プロジェクトウィンドのAssetsで右クリック、新しいシーンを作成

    • 適当に名前を付けておく(mainとか)
  • 作成したシーンをダブルクリックで開く

  • Hierarchy右クリック>3Dオブジェクト>Planeで床オブジェクトを追加

    • 適当に名前を付けておく(Grandとか)

  • プロジェクトウィンドでVRCWorldで検索し、出てきたPrefabをHierarchy直下に追加
    • 検索対象をAllにする必要がある

  • メニューバーからVRChat SDKを立ち上げ、ログインする
  • VRChat SDKのBuilderタブを開き、Local TestingのBuild & Testボタンを押します
    • ローカル起動でVRchatが起動します

World作成完了。ザ・シンプルワールド🌍

OpenPutt本体の追加

Mini Golf システム本体をHierarchyに追加します。

  • OpenPuttをHierarchyに追加
    • Packages/OpenPutt/Runtime/Prefabs以下にOpenPutt.prefabがある

  • TMP Importer画面が出るのでImportする

シーンに説明用ボードなどが設置されます。

ホールの作成

Mini Golfゲームには通常、複数のホールが含まれます。
普通のゴルフで言う18ホールとかそういうやつです。

今回はまず試しに1つのホール作ってみます。
ホールを作るにはホール形状のメッシュ(3Dデータ)が必要です。
今回メッシュのモデリングはせずに、前回の記事で動かしたデモシーンに含まれているメッシュを流用してやってみます。

  • ホールのPrefabをシステムに追加
    • Packages/OpenPutt/Runtime/Prefabs/ComponentsにあるOpenPuttCourse.prefab
    • これをHierarchyのOpenPutt/Holes以下に追加

  • デモシーンで使っていたホールのオブジェクト(Hole1)を配置
    • Packages/OpenPutt/Runtime/DemoScene以下にHole1がある
    • Hierarchy直下に配置

  • 体裁を整える
    • 床(Grand)のスケールを大きくする
    • Hole1の向きが逆なのでInspectorでRotation Y 180を設定
    • ホールに芝のような色をつけるマテリアルを設定
      • Hierarchy : Hole1/Hole1Walls/Hole1Floorへマテリアル設定する
      • マテリアルはPackages/OpenPutt/runtime/DemoScene以下にCourceSourfaceがある
    • Hole1に含まれるCylinderは使わないのでオブジェクトを無効化する
      • Hierarchy : Hole1/CylinderのInspectorでオブジェクトのチェックを外す

  • ホール開始位置を設定
    • HoleStartPadをHole1メッシュの適当な開始地点に移動
      • HierarchyのOpenPutt/Holes/OpenPuttCourse以下にHoleStartPadあり
    • HoleStartPadはmissing Prefabとなっているけど無視してOKです
    • ホールのメッシュより上になるようにしてください
      • 開始位置がホールにめり込んでると、パターで打った後虚無に落ちます…

オブジェクトの位置微調整について

シーンビューでオブジェクトは三方向の矢印を操作して位置を移動できます。
位置の微調整するときには以下の小技が有効です。

  • 調整したいオブジェクトをHierarchy上でダブルクリックすると画面中央に見やすく表示される
  • 表示を透視投影から平行投影に切り替えて、真上、真横の表示に切り替えて移動させる
    投影方法や真上、真横などのシーンビューの見え方の切り替え操作は以下の記事を参考にしてください。

https://nekopro99.com/scene-view-navigation/

  • カップにゴール判定を設定
    • HoleをHole1メッシュの穴あたりに移動
      • Hierarchy : OpenPutt/Holes/OpenPuttCourse以下にHoleあり
    • 穴のフチにピッタリだとゴール判定甘くなりそうなので
      • フチから若干下目に配置すると良いかも

ホールの設定

ホールの外にボールが飛び出たらやり直し(OB判定)になります。
そのためホールに有効範囲設定が必要です。

  • ホールの有効範囲となるメッシュを指定
    • OpenPuttCourseのInspectorにてFloorObjectsの値を変更
      • Hierarchy : OpenPutt/Holes/OpenPuttCourse
      • Sizeを1に変更
      • ホールのメッシュを指定する(Hole1Floor)

  • ホールのスコアの設定
    • OpenPuttCourseのInspectorにFloorObjectsの値を変更
      • Hierarchy : OpenPutt/Holes/OpenPuttCourse
      • Par Scoreにホールのパー値(目標打数)を設定(2とか)
      • Max Scoreにホールの最大打数を設定
        • プレイヤーが最大打数を超えると強制的にそのホールは終了

  • ホールのコライダー設定
    • ホールのメッシュHole1にはコライダーが入ってないのでMesh Colliderを入れます
    • Hole1FloorのInspectorでAddComponentからMesh Colliderを追加する
      • Hierarchy : Hole1/Hole1Walls 以下にあり
    • Hole1WallsのInspectorでAddComponentからMesh Colliderを追加する
      • Hierarchy : Hole1以下にあり

  • コライダー物理の設定
    • ホール上のボールへ物理演算を効かせる設定
    • 物理演算設定ファイルはPackages/OpenPutt/Runtime/PhysicMaterialsにあり
    • Hole1FloorのInspector : Mesh ColiderのMaterialにFloorPhysicsを追加
    • Hole1WallsのInspector : Mesh ColliderのmaterialにWallPhysicsを追加
      • 物理演算用ファイルが前者と後者で違うので注意


これで1つのホールが完成です⛳

システムへホールを登録

最後に作ったホールをOpenPuttシステムに登録します。

  • OpenPuttに作ったホールを登録
    • Hierarchy/OpenPuttのInspector : Coursesパラメータ
      • Sizeを1に変更
      • Element 0 にHierarchyのOpenPuttCourseを設定

作ったホールを試す

ローカルテストをVRモードで動かしてみます。

https://youtu.be/VGKGPQFOmL0

VRモードでのローカルテスト方法

Quest2+AirLinkを使ったVRモードでのローカルテストの簡単な方法

  • Quest2でAirLink経由でSteamVRに入ります
    • SteamVR起動しただけで、アプリはまだ起動しません
  • UnityでLoaltestingでForce Non-VRのチェックを外しBuild & Testボタンを押す
  • Quest2側でLocalのVRChatが起動する

VR上のOpenPuttの動作

  • 右手を後ろに持っていくとパター、左手を後ろに持っていくとボールが取り出せる
  • トリガーを引いた状態でパターをふる

ボールが壁に跳ね返っています。壁の物理演算も上手くいってるみたいですね。
これで基本的なホールの作り方はOKそうです。

あとは同じ感じで各ホールのメッシュを用意して、それぞれシステムに登録すればオリジナルコースのワールドが完成です。
なんとなくいけそうな感じがしてきました😎

次は?

実はホールのメッシュをモデリングして用意しなくても、Boothで売られているサカバンバスピスとか適当な3Dモデルを使ってもホールは作れます(!)

次の記事ではBoothモデルを使って、マジ適当なホールを作ってみましょう。
https://zenn.dev/tyaahan/articles/c71078c8612560

Discussion