UnityUnityメモ

【Unity】クリックした方向にバットを傾けてスイングする方法を解説!

Unity

1. はじめに

こんにちは!この記事では、Unityを使ってクリックした方向にバットを傾けてスイングさせる仕組みを作る方法を解説します。ゲーム開発をしていると、クリックやタップといったプレイヤーの操作に応じてオブジェクトを動かす機能を作りたくなることが多いですよね。今回作るバットスイングの仕組みは、スポーツゲームやアクションゲームなど、さまざまなジャンルで活用できます!

この記事は、Unity初心者の方でもステップを追って進められるように、詳しく解説していきます。3Dオブジェクトの作成からスクリプトのコーディング、動作確認までをしっかりカバーしていますので、「プログラムが苦手」という方でも安心してください。

この仕組みを学ぶことで、Unityの基本的な機能であるオブジェクトの操作やスクリプト間の連携、マウス入力の扱い方が理解できるようになります。また、完成したら、自分のゲームに応用していくことも可能です。

Unityを触ったことがないという方はコチラの記事から見てみてください!



必要な準備

この記事では、クリックした方向にバットを傾けてスイングする仕組みをUnityで作成します。まずは、プロジェクトの準備を整えましょう。


1. 新規プロジェクトの作成

Unityエディターが準備できたら、新しいプロジェクトを作成します。

  1. Unity Hubを開き、「新しいプロジェクト」をクリック。
  2. 「3D Core」テンプレートを選択。
  3. プロジェクト名を「BatSwingTutorial」に設定。
  4. 保存先を選んで「作成」ボタンをクリック。

これでプロジェクトの土台が完成しました!


2. シーンの準備

次に、作業用のシーンをセットアップします。

  1. Unityエディターのメイン画面で「シーン」タブが選択されていることを確認。
  2. ヒエラルキーウィンドウに「Main Camera」と「Directional Light」が表示されていることを確認します。
    • Main Camera: カメラ視点の設定を行うオブジェクト。
    • Directional Light: シーン全体に光を当てるためのライト。

これらはデフォルトで配置されていますので、そのままで大丈夫です。


3. 必要なアセットの確認

特別なアセットは必要ありませんが、もしバットや背景にカスタムモデルを使いたい場合は、Unity Asset Storeから無料アセットをダウンロードすることもできます。

  1. Unityエディター上部メニューから「Window」→「Asset Store」を選択。
  2. ブラウザでAsset Storeが開くので、必要な3Dモデルや素材を検索してインポートしてください。

4. 基本設定の確認

プロジェクトをスムーズに進めるために、以下の設定を確認しましょう。

  1. スクリプトエディターの設定
    • Unityと一緒にインストールされる「Visual Studio」を使用するのが一般的です。エディター上部の「Edit」→「Preferences」→「External Tools」から、エディターを設定してください。
  2. 保存の習慣をつける
    • 作業中は定期的にプロジェクトを保存してください。上部メニューの「File」→「Save」またはCtrl+S(Macの場合はCmd+S)を使います。

これで準備は整いました!次のステップでは、Unity内でバットを作成し、スイングする仕組みを組み立てていきます。



3. バットの作成

この記事では、Unityで「バット」を作成して設定する方法を解説します。バットは、ゲームでスイングの動きを実現するための基本オブジェクトです。簡単な手順で作成できますので、一緒に進めていきましょう!


ステップ1: ヒエラルキーに「Cylinder」を追加

まず、バットとなる3Dオブジェクトを作成します。

  1. Unityのヒエラルキーウィンドウで右クリックします。
  2. メニューから「3D Object」→「Cylinder」を選択します。
  3. ヒエラルキーに新しい「Cylinder」オブジェクトが追加されます。

ステップ2: オブジェクトの名前を変更

新しく作成した「Cylinder」の名前を変更して、管理しやすくします。

  1. ヒエラルキーウィンドウで「Cylinder」を選択します。
  2. インスペクターウィンドウの上部に表示される名前欄に「BatObject」と入力してEnterを押します。

ステップ3: サイズと位置の調整

バットとして適切な形状と位置に設定します。

  1. インスペクターウィンドウを確認し、以下の値を設定します:
    • Position: X = 2, Y = 0, Z = 0
    • Rotation: X = 0, Y = 0, Z = 90
    • Scale: X = 0.4, Y = 2, Z = 0.4

これにより、細長いバットの形状になります。


ステップ4: Rigidbodyを追加

バットに物理挙動を追加します。ただし、今回はスイング動作を制御するために「重力」をオフにします。

  1. インスペクターウィンドウの下部にある「Add Component」ボタンをクリックします。
  2. 検索欄に「Rigidbody」と入力し、リストから選択して追加します。
  3. 「Rigidbody」コンポーネントの「Use Gravity」のチェックを外します。

ステップ5: 作成内容を確認

設定が完了したら、ヒエラルキーウィンドウで「BatObject」を選択し、インスペクターウィンドウで以下の項目を確認してください:

  • PositionRotationScaleの値が正しいか。
  • Rigidbodyが追加され、「Use Gravity」がオフになっているか。

これで、バットの作成と基本設定は完了です!次のステップでは、バットを制御するためのコントローラーオブジェクトを作成していきます。楽しみにしてください!



4. コントローラーオブジェクトの作成

ここでは、バットを制御するためのコントローラーオブジェクトを作成します。このオブジェクトを通して、スイングの動作や傾きを調整できるように設定します。手順に沿って進めていきましょう!


ステップ1: 空のオブジェクトを作成する

  1. ヒエラルキーウィンドウを右クリックします。
  2. 表示されるメニューから「Create Empty(空のオブジェクト)」を選びます。
  3. 新しく作成された空のオブジェクトの名前を「BatControl」に変更します。

ステップ2: バットを子オブジェクトに設定する

  1. ヒエラルキーウィンドウで、先ほど作成した「BatObject」を見つけます。
  2. マウスで「BatObject」をドラッグし、「BatControl」の上にドロップします。
  3. この操作により、「BatObject」が「BatControl」の子オブジェクトになります。

ポイント!
子オブジェクトにすることで、「BatControl」を動かすと「BatObject」も一緒に動くようになります。これにより、バット全体をまとめて制御できるようになります。


これで、バットを制御するためのコントローラーオブジェクトの設定は完了です!引き続き、バットのスイングを実現するためのスクリプトを設定していきましょう。



5. バットスイングのスクリプト作成

ここでは、クリックした方向にバットを傾けてスイングする動きを実現するスクリプトを作成します。このスクリプトを作成することで、バットがマウスの入力に反応して動くようになります。


スクリプトの作成とアタッチ

  1. スクリプトファイルを作成する
    プロジェクトウィンドウで右クリックし、「Create」→「C# Script」を選択します。
    スクリプトの名前を BatSwing に変更します。
  2. スクリプトをアタッチする
    ヒエラルキーウィンドウで「BatControl」を選択し、作成した BatSwing スクリプトをドラッグ&ドロップしてアタッチします。
  3. スクリプトを編集する
    作成した BatSwing スクリプトをダブルクリックして開き、以下のコードを入力してください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BatSwing : MonoBehaviour
{
    public Transform target; // バットが向く対象を指定する

    void Start()
    {
        // バットの初期角度を設定
        transform.Rotate(0f, -180f, 0f);
    }

    public void TiltChange()
    {
        // バットをターゲットの方向に向ける
        transform.LookAt(target);

        // スイング動作を開始
        StartCoroutine("BatRotate");
    }

    IEnumerator BatRotate()
    {
        // バットを回転させるアニメーション
        for (int turn = 0; turn < 36; turn++)
        {
            transform.Rotate(0, -10, 0);
            yield return new WaitForSeconds(0.0001f); // アニメーションの速度を制御
        }
    }
}

コードの解説

  • Transform target
    バットが向く方向を設定するための変数です。後で「TiltPoint」を設定します。
  • Start()
    ゲーム開始時に呼び出され、バットの初期角度を調整します。
  • TiltChange()
    このメソッドでバットがターゲットの方向を向き、スイング動作を開始します。
  • BatRotate()
    コルーチンを使ってバットを少しずつ回転させることで、スイングアニメーションを表現します。

これで、クリックした方向にバットが傾き、スイングする基本的なスクリプトが完成しました!次のステップでは、傾き制御用オブジェクトを作成して、動作をさらに完成させます。



6. 傾きを制御するオブジェクトの作成

クリックした方向にバットを傾けるために必要な「TiltPoint」というオブジェクトを作成します。このオブジェクトは、バットが傾く方向を決める基準となります。以下の手順で作成してみましょう!


1. TiltPointオブジェクトの作成

まず、ゲームシーンに新しい3Dオブジェクトを作成します。

  1. ヒエラルキーウィンドウで右クリックします。
  2. 「3D Object」→「Sphere」を選びます。
  3. 作成したSphereの名前を「TiltPoint」に変更します。

このSphereが、傾きを制御するためのポイントになります。


2. Sphere Colliderを無効化する

「TiltPoint」は物理演算や衝突判定を必要としないため、Colliderを無効化します。

  1. ヒエラルキーウィンドウで「TiltPoint」を選択します。
  2. インスペクター画面の「Sphere Collider」コンポーネントのチェックボックスをオフにします。

これで、「TiltPoint」が他のオブジェクトと衝突しないようになります。


3. TiltPointを透明化する

ゲームプレイ中に「TiltPoint」が見える必要はないので、透明化します。

  1. プロジェクトウィンドウを右クリックします。
  2. 「Create」→「Material」を選び、新しいマテリアルを作成します。
  3. マテリアルの名前を「TransparentMaterial」に変更します。
  4. インスペクターで「Rendering Mode」を「Transparent」に設定し、「Alpha」の値を0にします(完全に透明になります)。
  5. 作成した「TransparentMaterial」を「TiltPoint」にドラッグ&ドロップして適用します。

これで、「TiltPoint」は完全に透明になります。




7. 傾き制御スクリプトの作成

傾きを制御するためのオブジェクト「TiltPoint」を使って、クリックした位置に応じてバットを傾ける仕組みを作ります。このステップでは、新しいスクリプトを作成して設定を行います。


Step 1: 「TiltMove」スクリプトを作成

  1. プロジェクトウィンドウを右クリックし、「Create」→「C# Script」を選択して新しいスクリプトを作成します。
    スクリプト名を「TiltMove」とします。
  2. 作成したスクリプトを「TiltPoint」オブジェクトにドラッグ&ドロップしてアタッチします。

Step 2: スクリプトを編集

スクリプトを開き、以下のコードを入力してください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TiltMove : MonoBehaviour
{
    private Vector3 mousePosition;
    private Vector3 spherePosition;
    public GameObject bat; // バットのオブジェクトを指定する変数

    void Update()
    {
        // マウスの左クリックを検出
        if (Input.GetMouseButtonDown(0))
        {
            // マウスの位置を取得
            mousePosition = Input.mousePosition;
            mousePosition.z = 10.0f; // カメラからの距離を設定
            
            // マウス位置をワールド座標に変換
            spherePosition = Camera.main.ScreenToWorldPoint(mousePosition);

            // 「TiltPoint」をクリック位置に移動
            this.transform.position = -spherePosition;

            // バットのスイングを実行
            bat.GetComponent<BatSwing>().TiltChange();
        }
    }
}



8. オブジェクト間のリンク設定

作成したオブジェクトとスクリプトを正しくリンクさせていきましょう!

「TiltPoint」の設定

  • ヒエラルキーウィンドウで「TiltPoint」を選択します。
  • Inspectorウィンドウの「TiltMove」スクリプトにある bat フィールドを確認してください。
  • このフィールドに「BatControl」オブジェクトをドラッグ&ドロップします。これにより、バット制御用スクリプトとリンクされます。

「BatControl」の設定

  1. ヒエラルキーウィンドウで「BatControl」を選択します。
  2. Inspectorウィンドウの「BatSwing」スクリプトにある target フィールドを確認してください。
  3. このフィールドに「TiltPoint」オブジェクトをドラッグ&ドロップします。これにより、バットが「TiltPoint」に向かって回転する動きが設定されます。



9. 動作確認

さて、ここまでで「バット」と「傾き制御用オブジェクト」、そしてそれぞれに必要なスクリプトが完成しました。最後に、プレイモードで動作を確認していきます。


1. プレイモードで動作確認

  1. ゲームの実行
    • 上部の「Play」ボタンをクリックして、プレイモードに入ります。
  2. クリックして動作を確認
    • シーンビューまたはゲームビューで、マウスの左ボタンをクリックしてください。
    • クリックした場所に応じて「TiltPoint」が移動し、それに合わせてバットが傾きながらスイングする動作を確認できます。

2. よくあるトラブルシューティング

  1. バットが動かない場合
    • 「BatControl」に「BatSwing」スクリプトが正しくアタッチされているか確認してください。
    • 「TiltPoint」と「BatControl」のリンクが正しいか再確認してください。
  2. クリック位置がずれている場合
    • カメラが「Main Camera」として設定されていることを確認してください。
    • スクリプト内の ScreenToWorldPoint に適切なZ値が設定されているか確認してください(mousePosition.z = 10.0f;)。
  3. エラーが発生する場合
    • コンソールウィンドウを開き、エラー内容を確認してください。スクリプトの綴り間違いや未設定のフィールドが原因であることが多いです。

3. 動作の調整と改善

動作確認が無事完了したら、バットの回転速度やクリック位置の計算を調整して、より理想的な動きになるようにカスタマイズしてみましょう。たとえば、BatRotate メソッド内の transform.Rotate(0, -10, 0); の角度や回転スピードを調整することで、スイングの速さを変えることができます。


これで、クリックした方向にバットを傾けてスイングする仕組みが完成しました!次は、この動きをゲームに組み込んでみるのも面白いですよ。例えば、ボールを打ち返す仕組みを追加して、さらにゲームらしくしてみてください!



9. おわりに

お疲れさまでした!この記事では、クリックした方向にバットを傾けてスイングする仕組みをUnityで作成する手順を解説しました。Unityの基本的な3Dオブジェクトの操作から、スクリプトを使った挙動の制御まで、一通りの流れを体験できたのではないでしょうか?


今回のプロジェクトを通して、以下のポイントを学びました:

  • ヒエラルキーウィンドウの使い方:3Dオブジェクトや空のオブジェクトを作成して、親子関係を設定する方法。
  • Rigidbodyの設定:物理挙動をコントロールするための基本設定。
  • スクリプトの作成とアタッチ:オブジェクトの動作を制御するスクリプトを実際に書いて動作させる方法。
  • マウス入力の処理:プレイヤーの操作に応じた動きをスクリプトで実現する方法。

この仕組みは、例えば野球ゲームや剣を振るアクションゲームなど、様々なゲームに応用することができます。バットだけでなく、剣やハンマーなど他の3Dモデルに置き換えてみたり、よりリアルなアニメーションを追加してみたりすることで、さらに高度な表現も可能になります。

これからもUnityを使って自由なアイデアを形にしていきましょう!もし次のチャレンジとしてやりたいことがあれば、ぜひコメントや質問をお寄せください。一緒により楽しいプロジェクトを作り上げましょう!




よくある質問

Q1: クリックした位置にバットが向かない場合はどうすればいいですか?
A1: カメラの位置や角度、オブジェクトの配置を確認してください。特にカメラのScreenToWorldPointのz値が重要です。

Q2: バットのスイング速度を調整するにはどうすればいいですか?
A2: BatRotateメソッド内のWaitForSecondsの値を変更することで調整できます。値を小さくすると速く、大きくすると遅くなります。

Q3: スクリプトがエラーを出す場合はどうすればいいですか?
A3: エラーメッセージを確認し、指定された行番号や内容に基づいてコードを修正してください。特にGetComponenttransformの使用方法に注意してください。