UnityUnityメモ

Unity初心者でもできる!クリックした位置に応じてボールを飛ばす方法

Unity

1. はじめに

Unityでゲームを作るとき、「クリックした場所に応じてオブジェクトが動く」という仕組みは、インタラクティブなゲーム体験を作るうえで非常に役立ちます。例えば、シューティングゲームでターゲットに向かって弾を飛ばしたり、パズルゲームで特定の場所に物を移動させたりと、応用範囲は無限大です。

この記事では、クリックした位置に応じてボールが飛ぶ方向を変える方法を初心者向けにわかりやすく解説します。この方法では、UnityのRaycast機能を使ってクリック位置を特定し、その方向に力を加えてオブジェクトを動かします。

まずは、シンプルなシーンを作成し、必要な設定を行います。その後、スクリプトを使ってクリックした位置に基づいた動作を実現していきます。Unity初心者でも簡単に実装できる内容なので、安心して進めていきましょう!


この記事で学べること:

  • UnityのRaycast機能を使った位置取得の基本
  • Rigidbodyを使った物理挙動の設定
  • クリック操作を基にしたオブジェクトの制御方法

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



2. シーンのセットアップ

このステップでは、Unityのシーンに必要なオブジェクトを配置し、それぞれを適切に設定していきます。これらの設定をしっかり行うことで、後のスクリプトが正しく動作するようになります。


1. 平面(Plane)の作成と設定

  1. ヒエラルキーウィンドウで右クリック
    3D Object」→「Plane」を選択し、平面を作成します。
    これはボールが動き回る基盤となるオブジェクトです。
  2. Inspectorでレイヤーを設定
    作成した「Plane」を選択し、Inspectorウィンドウの「Layer」を「Ignore Raycast」に変更します。
    これにより、RaycastがPlaneに反応しなくなり、他のオブジェクトが正しく機能します。

2. ボール(Sphere)の配置と設定

  1. ヒエラルキーウィンドウで右クリック
    3D Object」→「Sphere」を選択し、ボールを作成します。
  2. 位置を調整
    「Sphere」を選択し、Inspectorの「Transform」で以下の値に設定します:
    • Position: (0, 0.5, 0)
  3. Rigidbodyを追加
    Inspectorの「Add Component」ボタンをクリックし、「Rigidbody」を検索して追加します。これにより、ボールに物理挙動が適用されます。
  4. Physics Materialを作成してアタッチ
    • プロジェクトウィンドウで右クリックし、「Create」→「Physics Material」を選択します。
    • 作成したPhysics Materialを「Sphere」にドラッグしてアタッチします。
    • Inspectorで以下の値を設定します:
      • Dynamic Friction: 0
      • Static Friction: 0.6
      • Bounciness: 1



3. ターゲット(Target)の配置とカスタマイズ

  1. ヒエラルキーウィンドウで右クリック
    3D Object」→「Sphere」を選択し、新たにスフィアを作成します。
    作成したオブジェクトの名前を「Target」に変更します。
  2. 位置とサイズを調整
    「Target」のTransformを以下のように設定します:
    • Position: (0, 0, -10)
    • Scale: (0.1, 0.1, 0.1)
  3. 色を変更
    • 新しいMaterialを作成し、好きな色を設定します。
    • 作成したMaterialを「Target」にドラッグしてアタッチします。これにより、視認性が向上します。

4. ボールを飛ばすオブジェクト(Cube)の透明化と設定

  1. ヒエラルキーウィンドウで右クリック
    3D Object」→「Cube」を選択し、Cubeを作成します。
  2. レイヤーを設定する
    • 「Cube」のレイヤーを「Ignore Raycast」に設定します。
  3. 位置とサイズを調整
    「Cube」のTransformを以下の値に設定します:
    • Position: (0, 0.5, -4)
    • Scale: (0.5, 0.5, 0.5)
  4. Rigidbodyを追加
    「Add Component」で「Rigidbody」を追加し、以下の設定を行います:
    • Mass: 10
  5. 透明化
    • プロジェクトウィンドウで右クリックし、「Create」→「Material」を選択して新しいMaterialを作成します。
    • Materialの「Rendering Mode」を「Fade」に設定し、「A(透明度)」の値を0にします。
    • 作成したMaterialをCubeにドラッグしてアタッチします。

以上で、シーンのセットアップは完了です!次はスクリプトを作成して、クリック操作を追加していきましょう。



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

ここでは、クリックした位置にボールを飛ばすためのスクリプトを作成し、それをUnityオブジェクトにアタッチする手順を解説します。初心者の方でも簡単に理解できるように、コードの解説も交えながら進めていきます!


3.1 ボールを飛ばすスクリプト「BaseShot」の作成

  1. スクリプトを作成する
    プロジェクトウィンドウを右クリックして「Create」→「C# Script」を選択し、新しいスクリプトを作成します。名前は BaseShot にします。
  2. スクリプトをCubeにアタッチする
    作成した BaseShot スクリプトをヒエラルキーウィンドウのCubeオブジェクトにドラッグ&ドロップします。
  3. 以下のコードを入力する
    作成したスクリプトをダブルクリックして開き、次のコードを入力します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BaseShot : MonoBehaviour
{
    private float power; // ボールを飛ばす力
    public Rigidbody rb; // Rigidbodyの参照
    public GameObject target; // ターゲットオブジェクト
    
    void Start()
    {
        power = 30; // 力の初期値を設定
    }

    public void KickStart()
    {
        transform.LookAt(target.transform); // ターゲットの方向を見る
        rb = GetComponent<Rigidbody>();
        rb.velocity = transform.forward.normalized * power; // ボールを飛ばす力を設定
    }
}
  • ターゲットを設定する
    BaseShot スクリプトの target フィールドに、ヒエラルキー上のターゲットオブジェクト(target)をドラッグして設定します。

スクリプトのポイント

  1. 力を設定する(power
    • powerはボールを飛ばす力の大きさを決めます。この値を調整することで、ボールの飛距離を変えることができます。
  2. ターゲットの方向を向く(transform.LookAt
    • このコードでターゲット(target)の方向を向き、正確に狙うことができます。
  3. Rigidbodyの速度を設定(rb.velocity
    • オブジェクトの前方(transform.forward)に対して、powerを乗じた速度を設定します。これにより、物理挙動に基づいてボールが飛びます。

3.2 ターゲットをクリックした位置に移動させるスクリプトの作成

  1. スクリプトを作成する
    プロジェクトウィンドウで再び右クリックし、「Create」→「C# Script」を選択して新しいスクリプトを作成します。名前は PutTarget にします。
  2. スクリプトをtargetにアタッチする
    作成した PutTarget スクリプトをヒエラルキーウィンドウのtargetオブジェクトにドラッグ&ドロップします。
  3. 以下のコードを入力する
    作成したスクリプトをダブルクリックして開き、次のコードを入力します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PutTarget : MonoBehaviour
{
    public GameObject cube; // Cubeオブジェクトの参照
    
    void Update()
    {
        if (Input.GetMouseButtonDown(0)) // マウス左クリックを検出
        {
            RaycastHit hit; // Raycastの結果を格納
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // マウス位置からRayを発射
            
            if (Physics.Raycast(ray, out hit)) // Rayがヒットした場合
            {
                transform.position = new Vector3(hit.point.x, hit.point.y, hit.point.z); // ターゲットをクリック位置に移動
                cube.GetComponent<BaseShot>().KickStart(); // CubeのKickStartメソッドを呼び出す
            }
        }
    }
}
  • Cubeを設定する
    PutTarget スクリプトの cube フィールドに、ヒエラルキー上のCubeオブジェクトをドラッグして設定します。

スクリプトのポイント

  1. マウスのクリック位置を取得(Input.GetMouseButtonDown
    • 左クリックが押された瞬間に処理を開始します。
  2. Rayを飛ばす(Camera.main.ScreenPointToRay
    • マウスのクリック位置からRayを飛ばし、クリックした地点を特定します。
  3. ターゲットを移動(transform.position
    • Rayが衝突した地点(hit.point)にターゲットを移動します。
  4. Cubeに力を加える(cube.GetComponent<BaseShot>().KickStart()
    • Cubeにアタッチされている「BaseShot」スクリプトを呼び出して、ボールを飛ばす処理を行います。

以上で、スクリプトの作成とアタッチは完了です!次のセクションでは、シーンを再生して正しく動作しているか確認します。



4. 動作確認

ここまでの設定が完了したら、いよいよ動作確認を行いましょう!以下の手順でシーンを再生し、正しく動作するかをチェックします。


1. 再生ボタンを押す

Unityエディターの上部にある「▶」ボタン(再生ボタン)をクリックします。シーンが再生モードに切り替わります。


2. ゲームビューでクリック操作を試す

再生中の「ゲームビュー」で、ターゲットを動かしてみましょう。

  1. クリック操作をする
    • マウスで任意の位置をクリックします。このとき、クリックした位置にターゲット(target)が移動するはずです。
    • ターゲットの移動を確認してください。
  2. ボールが飛ぶか確認する
    • ターゲットが移動した後、「Cube」からボールがターゲットに向かって飛んでいきます。
    • ボールの挙動が滑らかで、ターゲットに向かって正しく飛んでいれば成功です。

3. 期待する動きにならない場合

もし以下のような問題が発生した場合は、設定やスクリプトを確認しましょう。

  • クリックしてもターゲットが動かない
    • 「target」にアタッチしたスクリプト「PutTarget」の設定を確認してください。
    • スクリプト内でcubeフィールドに「Cube」が設定されているかをチェックしましょう。
  • ボールが飛ばない
    • 「Cube」にアタッチしたスクリプト「BaseShot」の設定を確認してください。
    • スクリプト内でrbが正しく取得されているか、powerの値が適切かを確認します。
  • ターゲットの位置が変でものが見えづらい
    • ターゲット(target)のスケールや色を調整すると視認性が上がります。

4. 必要に応じてデバッグを行う

エラーが発生する場合や思った通りに動かない場合は、以下の方法でデバッグを行いましょう。

  • コンソールをチェック
    • Unityエディターの「Console」タブを開いて、エラーや警告が出ていないか確認します。
  • スクリプトにDebug.Logを追加
    • スクリプト内にDebug.Logを追加して、変数や関数の動きを確認しましょう。
    • 例:Debug.Log("ターゲットが移動しました!");など。

設定やスクリプトを微調整して、自分だけのシステムを完成させましょう!例えば、ボールの飛ぶ速度やターゲットの移動範囲を変えると、より面白い動きを作り出せます。



よくある質問

Q
クリック位置が正しく反映されない場合の対処法は?
A

クリック位置が正しく反映されない場合、以下のポイントを確認してください:

  • Planeのレイヤー設定:Planeのレイヤーが「Ignore Raycast」になっているか確認してください。これが設定されていないと、Raycastが正しく機能しないことがあります。
  • カメラの設定:シーン内にカメラが配置されていて、クリックした位置を正しく認識できる角度であるかを確認してください。
  • RaycastのコードPhysics.Raycast部分でエラーがないか確認し、クリック位置が正しく取得できるようになっているか再確認してください。
Q
クリックした位置にボールが飛ばない場合の原因と対処法は?
A

この問題が発生する場合、以下を確認してください:

  • スクリプト「BaseShot」のアタッチ:スクリプトがボールを飛ばすCubeに正しくアタッチされているか確認してください。
  • Rigidbodyの設定:SphereやCubeにRigidbodyが追加されており、適切なパラメーターが設定されているか確認してください。
  • 力(Power)の設定powerの値が小さすぎるとボールがほとんど動きません。値を調整して動作を確認してください。
  • ターゲットの位置:ターゲット(target)の位置が適切で、クリック位置に基づいて正しく移動しているか確認してください。
Q
ターゲットが見えづらい場合、どう調整すれば良いですか?
A

ターゲットが視認しづらい場合、以下の方法で調整できます:

  • 色の変更:ターゲット(Sphere)にマテリアルをアタッチし、目立つ色(例:赤や緑)に変更します。
  • サイズの調整:ターゲットのScale値を少し大きくして、視認性を向上させます。例えば、Scale 0.2, 0.2, 0.2などに設定すると見やすくなります。
  • UI要素の追加:ターゲットの位置を示すために、UIの矢印やラベルを追加するのも効果的です。

おすすめのアセット

「Grown Assets Billiards Template」は、リアルなビリヤードゲームを簡単に作れるUnityアセットです。シングルプレイヤー、ローカルマルチプレイヤー、AI対戦が可能で、物理演算に基づいた正確なショットやボールの動きを再現。カスタマイズ可能なUIやスコアボードも含まれており、モバイル対応も完備。ゲーム開発の時間を大幅に短縮でき、ビリヤードゲームを作成したい方に最適です。