【初心者OK!】Unity(XR Interaction Toolkit)で野球VRゲームを開発してみよう!【MetaQuest2】【Unity2022.3.25f1】

プログラミング
スポンサーリンク

こんにちは!今回は VRで遊べるバッティングゲーム を作る方法を解説します。

VR初心者の方でも 「飛んでくるボールをバットで打ち返す」 という基本的なゲームを作れるように、一つずつ丁寧に説明していきます!

このチュートリアルでは UnityとMeta Quest(Oculus Quest) を使い、VRの基礎からゲーム制作の流れまでしっかり学べるようになっています。
最終的には、 右手のコントローラーを振るとバットが連動し、飛んできたボールを打ち返せる シンプルなバッティングゲームを作ります!

1. はじめに

スポンサーリンク

この記事の目的

このチュートリアルでは、次のようなスキルが身につきます:

Unityの基本操作 (プロジェクトの作成・モデルの配置・物理エンジンの使い方)
VR開発の基礎 (XR Interaction Toolkitを使ってコントローラーとバットを連動)
ゲームシステムの作り方 (ボールの発射・バットの当たり判定)
Meta Questで動くVRアプリのビルド方法

ゲームを作りながら、 VR開発の流れ も学べるので、将来的に もっと本格的なVRゲームを作りたい! という方の第一歩にもなります。

🛠 必要な環境

1. PC(Windows)

VR開発にはそれなりのPCスペックが必要です。
最低限のスペックの目安は次のとおりです:

項目推奨スペック
OSWindows 10 / 11
CPUIntel Core i5 以上(Ryzen 5 以上)
メモリ16GB以上
GPUGTX 1060 以上(RTX推奨)
ストレージSSD推奨(HDDでも可)

※ Macでも開発できますが、Meta Quest向けにビルドする場合は Windowsが推奨 されます。

2. Meta Quest(Oculus Quest)

このチュートリアルでは、 Meta Quest 2 / 3 を使用します。
今回作ったゲームはスタンドアロン(PCなし)でQuest単体で動かすこともできます!
ただし、この記事では PCと接続したまま開発する方式(PCVR) で進めます。

3. Unity

Unity は無料で使えるゲーム開発エンジンで、VR開発にも対応しています!
今回使うバージョンは Unity 2022.3.25f1 です。

▶ Unityのダウンロードはこちら
🔗 https://unity.com/ja/download

最終的に作るゲームの概要

ゲームの内容

  • 目の前からボールが飛んでくる 🚀
  • コントローラーを振ると、バットでボールを打てる

この記事の流れ

このチュートリアルでは、 PCとMeta Questを使って開発する方法ゼロから解説 します。

これから学ぶこと

  1. Unityの準備 → Unityをインストールし、VR開発の環境を作る
  2. VRとコントローラーの設定 → コントローラーでバットを動かせるようにする
  3. ゲームの基本を作る → ボールを発射・バットで打つ
  4. ビルドして遊ぶ! 🎮

2. Unityの準備

VRバッティングゲームを作るには、まず Unityの環境を準備 する必要があります。
このステップでは、 Meta Quest用のVR開発環境を整え、ボールを飛ばしてバットで打つ基本システム を作ります。


目標

UnityでVR開発ができる環境を整える
コントローラーを使ってバットを動かせるようにする
飛んでくるボールをバットで打てるようにする


Unityプロジェクトの作成

1. Unity Hubを開く

Unity Hubを開き、 「新しいプロジェクトを作成」 をクリック。

2. テンプレートの選択

  • テンプレート: 3D
  • プロジェクト名: VR_BattingGame
  • 保存場所: 任意のフォルダ(わかりやすい場所に)
  • Unityバージョン: 2022.3 LTS 推奨

3. プロジェクトの作成

設定が完了したら 「作成」 をクリック!
(プロジェクトが開くまで少し時間がかかります)


VR開発に必要なパッケージをインストール

VR開発には XR Interaction Toolkit を使います。
これを導入すると、 VRコントローラーでバットを動かせるようになります!

1. パッケージマネージャーを開く

「Window」→「Package Manager」 を開く。

2. XR Interaction Toolkit をインストール

  1. 左上のドロップダウンから「Unity Registry」を選択
  2. 検索バーに「XR Interaction Toolkit」 と入力
  3. 「Install」ボタンをクリック
  4. 「Starter Assets」も追加でインストール
    (コントローラーの設定が楽になります)

3. OpenXRを有効化

  1. 「Edit」→「Project Settings」→「XR Plug-in Management」 を開く
  2. 「OpenXR」にチェックを入れる
  3. 「Android」タブでも同じようにOpenXRを有効化

これでVR開発の準備が完了!


バットを作る(Unity内で簡単なモデルを作成)

今回は バットの3DモデルをUnity上で作成 します。

1. バットのオブジェクトを作成

  1. 「Hierarchy」で右クリック →「3D Object」→「Cylinder」を選択
  2. 名前を「Bat」に変更
  3. 「Scale」を変更してバットっぽい形にする
    • X: 0.2
    • Y: 1.2
    • Z: 0.2

2. コントローラーにバットを追従させる

  1. 「Bat」を「Right Controller」の子オブジェクトにする
  2. コントローラーを動かすとバットが一緒に動くようになる!

ボールを発射する

ボールが飛んできて、バットで打てるようにしましょう!

1. ボールのオブジェクトを作成

  1. 「Hierarchy」で右クリック →「3D Object」→「Sphere」を選択
  2. 名前を「Ball」に変更
  3. 「Scale」を調整してボールの大きさを決める
    • X: 0.2
    • Y: 0.2
    • Z: 0.2

2. Rigidbody を追加

ボールが物理演算で動くようにします!

  1. 「Ball」を選択
  2. 「Inspector」→「Add Component」→「Rigidbody」を追加
  3. 設定を変更
    • Use Gravity: ✅(オン)
    • Mass(質量): 0.1(軽くする)
    • Drag(空気抵抗): 0.05(少し減速するように)

ボールを飛ばすスクリプト

ボールを飛ばすには スクリプトが必要 です!
「BallLauncher」というスクリプトを作り、一定間隔でボールが発射されるようにします。

1. スクリプトを作成

  1. 「Assets」→「Create」→「C# Script」
  2. 名前を「BallLauncher」に変更
  3. 以下のコードをコピペ!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BallLauncher : MonoBehaviour
{
    public GameObject ballPrefab;
    public Transform spawnPoint;
    public float launchForce = 10f;
    public float spawnInterval = 3f;

    private float timer = 0f;

    void Update()
    {
        timer += Time.deltaTime;
        if (timer >= spawnInterval)
        {
            LaunchBall();
            timer = 0f;
        }
    }

    void LaunchBall()
    {
        GameObject ball = Instantiate(ballPrefab, spawnPoint.position, spawnPoint.rotation);
        Rigidbody rb = ball.GetComponent<Rigidbody>();
        if (rb != null)
        {
            rb.AddForce(spawnPoint.forward * launchForce, ForceMode.Impulse);
        }
    }
}

2. ボールを発射する位置を決める

  1. 「Hierarchy」で右クリック →「Create Empty」
  2. 名前を「BallSpawnPoint」に変更
  3. 適切な位置に移動(ピッチャーの投げる位置)
  4. 「BallLauncher」の「spawnPoint」に「BallSpawnPoint」を設定

バットでボールを打てるようにする

バットに物理判定を追加し、ボールに当たると飛ぶように します!

1. バットにRigidbodyを追加

  1. 「Bat」を選択
  2. 「Inspector」→「Add Component」→「Rigidbody」
  3. 設定を変更
    • Use Gravity: ❌(オフ)
    • Is Kinematic: ✅(オン)

2. バットにColliderを追加

  1. 「Bat」を選択
  2. 「Inspector」→「Add Component」→「Capsule Collider」
  3. サイズを調整してバットの形に合わせる

3. ボールのスクリプトを作成

ボールがバットに当たると 飛んでいく ようにします。

スクリプトを作成

  1. 「Assets」→「Create」→「C# Script」
  2. 名前を「BallController」に変更
  3. 以下のコードをコピペ!
using UnityEngine;

public class BallController : MonoBehaviour
{
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Bat"))
        {
            Rigidbody rb = GetComponent<Rigidbody>();
            Vector3 hitDirection = (transform.position - collision.transform.position).normalized;
            rb.velocity = hitDirection * 10f;
        }
    }
}

3. VRデバイスで動作確認する

この記事でやること

ここでは、作ったVR野球ゲームが実際にVRデバイス(Meta Quest)上で正しく動作するか確認する方法を解説します。PC上でのテストとVRヘッドセットでのテストの両方を行います。

事前準備

  • Meta QuestをPCに接続(LinkまたはAir Link)
  • Unityの設定を確認(XR Interaction Toolkitが適用されているか)
  • VRコントローラーの認識をチェック

1. PC上での動作確認

まずはPC上でUnityエディタの Playモード を使って、基本的な動作を確認します。

確認すべきポイント

  • ゲームシーンが正しく表示されているか
  • コントローラーを振るとバットが連動して動くか
  • ボールが発射され、バットに当たると跳ね返るか

もし動作しない場合

  • バットが動かない → XR Interaction Toolkit の設定を確認
  • ボールがバットをすり抜ける → コライダーや物理マテリアルの設定を確認

2. VRデバイスでのテスト

① Meta QuestとPCを接続する

【Meta Quest Linkを使う場合】

  1. Quest本体をPCにUSBで接続
  2. Meta Quest Link を有効化(設定→Quest Link)
  3. UnityのGameビューにVRの映像が映るか確認

【Air Linkを使う場合】

  1. QuestとPCを 同じWi-Fiネットワーク に接続
  2. Questの設定で Air Link を有効化
  3. Air Link経由でPCの画面を映す

② VR内で動作を確認

  • ヘッドセットをかぶり、 右コントローラーを動かしてバットが追従するか 確認
  • ボールが飛んでくるか 確認
  • バットで打てるか 確認

3. よくあるトラブルと対処法

❌ コントローラーが動かない

XR Interaction Toolkit の Input Action 設定を見直す

❌ ボールがすり抜ける

Rigidbody の Collision Detection を “Continuous” に設定

❌ ゲームがVR上に映らない

Project Settings > XR Plug-in Management で Meta Questが有効になっているか確認


4. バットとコントローラーを連動させる

この記事でやること

VRコントローラーを動かすと、バットがそれに合わせて動くようにします。
XR Interaction Toolkit を活用して、自然なスイングを実現します。


1. XR Interaction Toolkit でコントローラーの動きを取得

必要な準備

  • コントローラーの位置・回転情報を取得
  • バットをコントローラーに追従させる
  • バットの動きに遅延がないか確認する

① コントローラーの位置情報を取得

コントローラーの位置と回転をリアルタイムで取得するには、 XR Controller (Action-based) を使用します。

  1. Right Controller(右手のコントローラー)を Hierarchy 内で探す
  2. XR Controller (Action-based) コンポーネントがついているか確認
  3. Position ActionRotation ActionXRI RightHand/PositionXRI RightHand/Rotation に設定されているか確認

② バットをコントローラーに追従させる

次に、スクリプトを作成し、バットの位置と回転をコントローラーと連動させます。

🎮 BatController.cs

using UnityEngine;

public class BatController : MonoBehaviour
{
    public Transform controllerTransform; // コントローラーのTransform

    void Update()
    {
        if (controllerTransform != null)
        {
            // バットをコントローラーの位置・回転に追従させる
            transform.position = controllerTransform.position;
            transform.rotation = controllerTransform.rotation;
        }
    }
}

👆 バットのTransformを、毎フレームごとにコントローラーと同期させています!


2. 実際にバットを振ってみる

確認するポイント

  • コントローラーを動かすと バットも同じように動くか
  • スイング時にバットが遅れたりしないか

3. よくあるトラブルと対処法

❌ バットがコントローラーからズレる

コントローラーの子オブジェクトにバットを設定してみる

  1. Right Controller の下にバットをドラッグ&ドロップ
  2. スクリプトなしでも動くか確認

5. ボールを飛ばす

この記事でやること

ゲームの基本である ボールを発射する機能 を作成します!
ボールが投げられ、バットで打つことができるようにします。
ボールの発射位置や速度 を設定し、一定間隔で発射 する仕組みを作ります。


1. ボールを発射するスクリプトを作成

必要な準備

  • ボールのプレハブを作成
  • ボールを投げるスクリプトを作成
  • 一定時間ごとにボールを発射

① ボールのプレハブを作成

  1. ヒエラルキーGameObject > 3D Object > Sphere を作成
  2. 名前を「Ball」に変更 し、適切なサイズ(例: 0.1, 0.1, 0.1)に調整
  3. Rigidbody を追加
    • Use GravityON
    • Mass(質量)は 0.5 くらい
    • Collision DetectionContinuous
  4. Physic Material を設定(跳ね返りの調整)
    • BallMaterial を作成
    • Bounciness(弾性)を 0.3 くらいに設定

② ボールを発射するスクリプトを作成

🎮 BallLauncher.cs

using UnityEngine;

public class BallLauncher : MonoBehaviour
{
    public GameObject ballPrefab; // ボールのPrefab
    public Transform spawnPoint; // ボールの発射位置
    public float launchForce = 20f; // ボールの発射力
    public float spawnInterval = 3f; // ボールを発射する間隔

    private float timer = 0f; // 時間をカウントする変数

    void Update()
    {
        timer += Time.deltaTime; // フレームごとに時間をカウント

        if (timer >= spawnInterval) // 一定時間ごとに発射
        {
            LaunchBall();
            timer = 0f; // タイマーをリセット
        }
    }

    void LaunchBall()
    {
        // ボールを生成
        GameObject ball = Instantiate(ballPrefab, spawnPoint.position, spawnPoint.rotation);

        // ボールに力を加える
        Rigidbody rb = ball.GetComponent<Rigidbody>();
        if (rb != null)
        {
            rb.AddForce(spawnPoint.forward * launchForce, ForceMode.Impulse);
        }

        // 一定時間後にボールを削除
        Destroy(ball, 10f);
    }
}

👆 このスクリプトを作ることで、3秒ごとにボールが発射されます!


③ スクリプトを適用する

  1. ヒエラルキーで Empty Object を作成
    • 名前を “BallLauncher” に変更
  2. BallLauncher の位置を調整
    • バッターから数メートル前方に配置
  3. BallLauncher.csBallLauncher に追加
  4. Inspector でスクリプトの変数を設定
    • BallPrefab先ほど作った Ball プレハブ
    • SpawnPointBallLauncher の Transform
    • Launch Force20(後で調整可能)
    • Spawn Interval3秒ごと

2. ボールを打ってみる

確認するポイント

  • ボールが一定間隔で発射されるか
  • バットに当たると跳ね返るか
  • ボールの速度がちょうどいいか(速すぎず、遅すぎず)

3. よくあるトラブルと対処法

❌ ボールが発射されない

BallPrefab の設定を確認

  1. Rigidbody がついているか
  2. BallLauncher に Prefab を設定しているか

❌ ボールが遅すぎる / 速すぎる

LaunchForce の値を調整

  • 2030 にすると速くなる
  • 2015 にすると遅くなる

6. バットに当たったらボールが飛ぶ

この記事でやること

前回のステップで ボールが発射されるようになりました!
でも今は、バットに当たってもボールの挙動が適当 になっています。

このステップでは、バットに当たるとボールが飛ぶ処理 を追加します!
バットの スイングの方向 を考慮し、自然な打球 になるように調整します。


1. バットを作る

必要な準備

  • バットの3Dモデルを作る
  • バットに衝突判定(Collider)をつける
  • バットがコントローラーに追従するようにする

① バットの3Dモデルを作成

  1. ヒエラルキーで GameObject > 3D Object > Cylinder を作成
  2. 名前を「Bat」に変更
  3. サイズを調整
    • X: 0.1, Y: 0.8, Z: 0.1 くらいにするとバットっぽくなる
  4. Material(色)を設定
    • AssetsMaterial を作成し、茶色などに変更

② バットに衝突判定を追加

  1. Inspector で Capsule Collider を追加
    • Is TriggerOFF
  2. Rigidbody を追加
    • Use GravityOFF
    • Is KinematicON

③ コントローラーと連動させる

  1. ヒエラルキーで Empty Object を作成
    • 名前を “BatHolder” に変更
  2. BatHolder を Right Controller の子オブジェクトにする
  3. Bat を BatHolder の子オブジェクトにする
  4. BatHolder の Transform を調整して、手に持ったとき自然な位置になるようにする

2. ボールがバットに当たったら飛ぶスクリプトを作成

追加すること

  • バットに当たったらボールが飛ぶ
  • バットのスイングの向きを考慮して飛ぶ
  • ボールが速く飛ぶようにする

① バットのスクリプトを作成

🎮 BatController.cs

using UnityEngine;

public class BatController : MonoBehaviour
{
    public float hitForce = 10f; // ボールに与える基本的な力
    public AudioClip hitSound; // バットがボールに当たったときの音
    private AudioSource audioSource; // 音を再生するためのコンポーネント

    private void Start()
    {
        // AudioSourceを追加
        audioSource = gameObject.AddComponent<AudioSource>();
    }

    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Ball")) // ボールと衝突したら
        {
            Debug.Log("ボールがバットに当たりました!");

            // 音を再生
            if (hitSound != null && audioSource != null)
            {
                audioSource.PlayOneShot(hitSound);
            }

            // ボールのRigidbodyを取得
            Rigidbody ballRigidbody = collision.gameObject.GetComponent<Rigidbody>();
            if (ballRigidbody != null)
            {
                // バットの移動方向(スイングの向き)を計算
                Vector3 batVelocity = GetComponentInParent<Rigidbody>().velocity;

                // ボールにバットの速度を加えて飛ばす
                ballRigidbody.velocity = batVelocity * hitForce;
            }
        }
    }
}

👆 このスクリプトをバット(Bat オブジェクト)に追加します!


3. 設定を調整して動作確認

確認するポイント

  • ボールがバットに当たったら飛ぶか
  • バットを振る方向でボールの飛び方が変わるか
  • ボールが適切な速度で飛ぶか

4. よくあるトラブルと対処法

❌ ボールが飛ばない

バットに Rigidbody が設定されているか確認

  • Is KinematicON にする

❌ バットの当たり判定がうまくいかない

ボールとバットの Collider 設定を確認

  • Capsule ColliderSphere Collider が正しく設定されているか

7. Windows向けにビルド

この記事でやること

前回までに ボールを打つVR野球ゲーム を作成しました!
でも、今は Unityエディタ上でしか動作しません
このステップでは、Windows向けにゲームをビルドして、PC上で実行できるようにします!


1. ビルドの準備

まずは、ゲームをビルドする前に 必要な設定を確認・調整 しましょう

① シーンを保存

保存しないとビルドに反映されないことがあるので注意!

  1. Unityの上部メニューFileSave をクリック
  2. MainScene など分かりやすい名前をつけて保存

② Windows向けにプラットフォームを変更

  1. Unityの上部メニューFileBuild Settings を開く
  2. Platform(プラットフォーム) のリストで Windows(PC, Mac & Linux Standalone) を選択
  3. 「Switch Platform」 をクリック(少し時間がかかる)
    → プラットフォーム変更が完了すると、アイコンが Windows に切り替わる

③ シーンをビルドに追加

  1. Scenes In Build のリストを確認
  2. 現在のシーンが含まれていなければ「Add Open Scenes」 をクリックして追加!
    追加しないとゲームがビルドされないので注意

2. ビルド設定を調整

① プレイヤー設定(Player Settings)

  1. Build Settings の左下にある 「Player Settings…」 をクリック
  2. 「Player」タブ を開く
  3. 以下の設定を変更する
設定項目推奨値説明
Product NameVR Baseballゲームの名前
Company NameYourName自分の名前やチーム名
Resolution and Presentation1920×1080解像度設定
Fullscreen ModeWindowedウィンドウモード(フルスクリーンでもOK)

これでゲームの基本設定は完了!


3. ゲームをビルドする

① ビルドフォルダを指定

  1. Build Settings 画面で 「Build」 をクリック
  2. 保存先のフォルダ を選択(例:VRBaseball_Build
  3. 「フォルダを選択」ボタンを押してビルド開始!

少し待つと、.exe ファイルが作成されます

② ビルドしたゲームを起動

  1. ビルドしたフォルダを開く
  2. VRBaseball.exeダブルクリック!
  3. VRデバイスが接続されていれば、ゲームがPC上で動作する! 🎉✨

4. もし動かない場合(トラブルシューティング)

❌ ゲームが起動しない!

解決策

  • Data フォルダが .exe ファイルと同じフォルダにあるか確認
  • Windows Defender にブロックされていないか(ブロックされたら「詳細情報」→「実行」)

❌ VRデバイスが動かない!

解決策

  • Oculus Link / Air Link を有効にする
  • QuestがPCに正しく接続されているか確認
  • SteamVRが必要な場合は起動しておく

❌ ボールが表示されない!

解決策

  • Scenes In Build現在のシーンを追加したか確認
  • Player Settings の設定ミスがないか確認

8. まとめ

この記事でやること

ここまでのステップで VR野球ゲームを完成させ、Windows向けにビルド しました! 🎮✨
このステップでは、作成したゲームの振り返りと、今後の改良点や発展の方向性 についてまとめます。


1. ここまでの振り返り

VR野球ゲームをゼロから開発
Meta QuestとPCを接続して動作確認
バットをコントローラーに連動
ボールを発射し、バットで打ち返せるようにした
Windows向けにビルドして、PC上で実行可能にした

この一連の流れを通じて、Unityを使ったVRゲーム開発の基本 を学ぶことができました! 🎉


2. 今後の改良点

このゲームはまだ シンプルなバッティング練習ゲーム ですが、今後さらに改良することで より面白いゲーム にできます!

🛠 追加すると面白くなる機能

  • 打球の飛距離や角度を計算し、スコアを表示
  • ホームランエフェクトやスローモーション演出を追加
  • ピッチャーを追加し、さまざまな球種を投げるようにする
  • ボールの速さや飛び方を調整し、よりリアルな挙動にする

3. 今後の発展

このプロジェクトを通じて VR開発の基礎 を学びましたが、次のステップとして、さらに高度な技術に挑戦する こともできます。

新しい技術にチャレンジ!

  • AR版の野球ゲームを作ってみる(現実の空間でプレイ可能に!)
  • ネットワーク対戦を実装し、他のプレイヤーと競えるようにする
  • AIピッチャーを導入し、対戦モードを作る

VRは今後も進化し続ける分野なので、最新の技術を取り入れて、より没入感のあるゲームを作る ことが可能です!


4. まとめ

これで VR野球ゲームの作り方 の解説は終了です!
このチュートリアルを通じて、Unityの基本、VR開発の流れ、ボールの物理挙動の制御、ビルド方法 まで一通り学ぶことができました ✨

このゲームをさらに改良して、よりリアルなバッティング体験ができるゲームを目指していきましょう!

👨‍💻 この記事を読んでVRゲーム開発に興味を持った方は、ぜひ次のステップに挑戦してください!


🎉 最後まで読んでいただき、ありがとうございました!
次は、あなたのオリジナルVRゲームを作る番です! 🚀🔥

コメント

タイトルとURLをコピーしました