UnityUnityメモ

UnityでPhysics Materialを切り替えて動きを制御する方法

Unity

1.はじめに

Unityを使ったゲーム開発では、物理挙動を利用することで、リアルな動きやエフェクトを簡単に実現することができます。その中でも、「Physics Material(フィジックス マテリアル)」は、オブジェクトの滑りや反発力を調整するために非常に便利な機能です。

例えば、氷のようにツルツル滑る床や、止まりやすい粗い床を再現したいときに使われます。本記事では、Physics Materialを活用して、Cube(キューブ)をクリックしたときに滑らせ、1秒後にピタッと止まる挙動を実現する方法を解説します。

このチュートリアルでは、Unity初心者でも理解しやすいように、丁寧に手順を追いながら進めていきます。スクリプトを使った簡単な動きの制御を学ぶことで、物理挙動を活かしたゲーム開発の第一歩を踏み出しましょう!

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



2.準備


UnityでPhysics Materialを使ってオブジェクトを滑らせる機能を作るために、まず環境を整える必要があります。ここでは、必要なUnityバージョンやプロジェクトの作成方法を説明します。


1. 必要なUnityバージョンと環境

このチュートリアルでは、Unity 2021.3以降のバージョンを使用することをおすすめします。それより古いバージョンでも動作する場合がありますが、できるだけ最新のLTSバージョンを利用するとよいでしょう。

  • Unity Hubをインストール済みであることを確認してください。
  • 新規プロジェクトを作成する際に「3D」を選択してください。

2. 新しいプロジェクトの作成方法

  1. Unity Hubを開きます
  2. 画面右上の「New Project」をクリックします。
  3. テンプレートから「3D」を選びます。
  4. プロジェクト名を入力します。例:「SlidingCubeTutorial」。
  5. 保存先を選び、「Create」をクリックします。

数秒後にUnityエディターが開きます。


3. プロジェクトの初期設定

Unityプロジェクトが開いたら、以下の設定を確認してください。

  1. シーンの保存
    • メニューバーで「File」→「Save As」を選びます。
    • シーン名を「MainScene」として保存します。
  2. フォルダ構成の整理
    • プロジェクトウィンドウで右クリックして「Create」→「Folder」を選択します。
    • 以下のフォルダを作成しておきましょう。
      • Scripts
      • Materials

これで準備が整いました。次にオブジェクトを作成し、実際に物理挙動を設定していきます!



3.オブジェクトの作成

1. 3Dオブジェクトの作成

  1. Planeを作成する
    • Unityエディターのヒエラルキー(Hierarchy)ウィンドウで右クリックします。
    • メニューから「3D Object」→「Plane」を選択します。
    • シーンビューに床となるオブジェクトが表示されます。
  2. Cubeを作成する
    • Unityエディターのヒエラルキー(Hierarchy)ウィンドウで右クリックします。
    • メニューから「3D Object」→「Cube」を選択します。
    • シーンビューにキューブが表示されます。これが今回操作するオブジェクトになります。
    • キューブの名前はデフォルトの「Cube」のままで問題ありませんが、変更する場合はヒエラルキーで名前をダブルクリックして編集できます。

2. Rigidbodyの追加

  1. Rigidbodyコンポーネントを追加する
    • ヒエラルキーで作成したCubeを選択します。
    • インスペクター(Inspector)ウィンドウで「Add Component」ボタンをクリックします。
    • 検索バーに「Rigidbody」と入力し、リストから「Rigidbody」を選択して追加します。
    • Rigidbodyを追加することで、オブジェクトが物理エンジンの影響を受けるようになります。

3. Physics Materialの作成

3-1. 滑るためのMaterialを作成する
  1. 新しいPhysics Materialを作成
    • プロジェクト(Project)ウィンドウで右クリックし、「Create」→「Physic Material」を選択します。
    • 作成されたPhysics Materialに「SlipperyMaterial」という名前を付けます。
  2. 摩擦を設定する
    • Inspectorで「Dynamic Friction」と「Static Friction」を0に設定します。
    • これにより、このMaterialを使用するとオブジェクトが滑りやすくなります。

3-2. 停止させるMaterialを作成する

  1. 新しいPhysics Materialを作成
    • 再び右クリックし、「Create」→「Physic Material」を選択します。
    • 作成されたPhysics Materialに「StopMaterial」という名前を付けます。
  2. 摩擦を設定する
    • Inspectorで「Dynamic Friction」と「Static Friction」を1に設定します。
    • この設定により、このMaterialを使用するとオブジェクトが完全に停止するようになります。

4. Physics Materialの適用

  1. MaterialをCubeに適用
    • 作成した「SlipperyMaterial」と「StopMaterial」を、CubeBox Colliderコンポーネントの「Material」フィールドにドラッグ&ドロップします。
    • (この記事のコードではスクリプトでMaterialを切り替えるので、どちらを最初に設定しても問題ありません。)

これで、オブジェクトの基本設定は完了です!次はスクリプトを作成して、クリック操作によるオブジェクトの動きを実現していきましょう。



4. スクリプトの作成

ここでは、Cubeをクリックしたときに滑り出し、1秒後に滑りを止めて完全に停止させるスクリプトを作成します。


① スクリプトを作成する

まずは新しいC#スクリプトを作成します。

  1. プロジェクトウィンドウを開きます。
  2. 任意のフォルダ(例えばScriptsフォルダ)を右クリックします。
  3. 「Create」→「C# Script」を選択して、新しいスクリプトを作成します。
  4. スクリプトの名前を CubeMove に設定します。

② コードを記述する

作成したスクリプトをダブルクリックして開き、以下のコードを入力します。

using UnityEngine;

public class CubeMove : MonoBehaviour
{
    private Rigidbody rb; // Rigidbodyコンポーネントへの参照
    public int force; // 力の大きさ
    private BoxCollider collider; // BoxColliderコンポーネントへの参照
    public PhysicMaterial slipperyMaterial; // 滑るマテリアル
    public PhysicMaterial stopMaterial; // 停止するマテリアル
    private float time; // タイマー用変数

    void Start()
    {
        // コンポーネントの参照を取得
        rb = GetComponent<Rigidbody>();
        collider = GetComponent<BoxCollider>();
        
        // 初期値を設定
        force = 10;
        time = 0;
    }

    void Update()
    {
        // 時間をカウントダウン
        time -= Time.deltaTime;

        // マウスクリックを検知
        if (Input.GetMouseButtonDown(0))
        {
            // タイマーをリセットし、力を加える
            time = 1;
            rb.AddForce(0, 0, force, ForceMode.Impulse);
        }

        // タイマーに応じてPhysics Materialを変更
        if (time <= 0)
        {
            collider.material = stopMaterial;
        }
        else
        {
            collider.material = slipperyMaterial;
        }
    }
}

③ コードの解説

  1. 変数の定義
    • Rigidbody:物理挙動を制御するためのコンポーネントです。
    • BoxCollider:コライダーにPhysics Materialを設定するために使用します。
    • PhysicMaterial:滑りや摩擦の設定を切り替えるために利用します。
    • force:クリックした際に加える力の大きさを設定します。
    • time:滑りを制御するためのタイマー変数です。
  2. Start()メソッド
    • 初期化処理として、RigidbodyBoxColliderの参照を取得します。
    • forcetimeの初期値を設定します。
  3. Update()メソッド
    • タイマー制御timeをデクリメントして、経過時間を管理します。
    • クリック検知Input.GetMouseButtonDown(0)で左クリックを検知します。
    • Physics Material切り替えtimeの値に応じてslipperyMaterialstopMaterialを切り替えます。

④ スクリプトの保存

記述が終わったら、スクリプトを保存(Ctrl + S)して閉じます。


次は、このスクリプトをCubeにアタッチして、必要な値を設定する方法を解説します!



5. スクリプトをアタッチ

作成した「CubeMove.cs」スクリプトをCubeにアタッチする手順を説明します。


手順1: スクリプトをUnityに認識させる

  1. 作成した「CubeMove.cs」スクリプトがプロジェクト(Project)ウィンドウに表示されていることを確認してください。
    • スクリプトを作成したときに保存を忘れているとUnityに反映されない場合があります。

手順2: Cubeにスクリプトをアタッチ

  1. Hierarchyウィンドウで作成した「Cube」をクリックして選択します。
  2. Projectウィンドウから「CubeMove.cs」スクリプトをドラッグします。
  3. 「Cube」にドラッグしたスクリプトをそのままドロップします。

これで、スクリプトがCubeにアタッチされました。


手順3: インスペクターで設定を確認

  1. Cubeを選択した状態でInspectorウィンドウを確認します。
  2. 「CubeMove (Script)」というセクションが追加されているはずです。
  3. 必要な変数を設定します。
    • Force: オブジェクトを滑らせる力(例: 10)。
    • Slippery Material: 滑らせるためのPhysics Materialを割り当てます。
    • Stop Material: 停止するためのPhysics Materialを割り当てます。

注意: Physics Materialを割り当てるには、作成した「Slippery Material」と「Stop Material」をProjectウィンドウからそれぞれドラッグ&ドロップします。


次にプレイモードを開始して、Cubeがクリックで滑り出し、1秒後に停止するか確認してみましょう。



6. 動作確認


ここでは、作成したスクリプトと設定が正しく動作するかを確認します。順を追ってテストしてみましょう。


1. プレイモードを開始する

  1. Unityエディターの上部にある「▶︎」ボタンをクリックしてプレイモードを開始します。
  2. シーンビューやゲームビューで、先ほど設定したCubeが表示されていることを確認します。

2. Cubeをクリックして挙動を確認

  1. ゲームビューでCubeにマウスカーソルを合わせ、左クリックをします。
  2. Cubeが前方(Z方向)に滑り出すか確認します。
    • この動きは、スクリプト内の rb.AddForce(0, 0, force, ForceMode.Impulse); が実行されている証拠です。

3. 1秒後にCubeが停止するか確認

  1. Cubeが滑り始めた後、1秒経過したときに滑りが止まるかを確認します。
    • 滑りが止まるのは、 collider.material = stopMaterial; によって物理マテリアルが停止用に切り替わるためです。

4. 問題がある場合のトラブルシューティング

動作が期待通りにならない場合は、以下のポイントを確認してください。

  1. クリックしてもCubeが動かない場合
    • Rigidbodyコンポーネントが正しく追加されているか確認します。
    • Rigidbodyの Use Gravity オプションがチェックされているか確認してください。
    • スクリプト内の force の値を増やしてみてください(デフォルトは10ですが、20や30にしてみると動きがわかりやすくなります)。
  2. 滑りが止まらない場合
    • インスペクターで StopMaterial が設定されているか確認してください。
    • StopMaterial のフリクション(摩擦係数)が十分に高い値になっているか確認してください(通常は 1 に設定)。
  3. エラーメッセージが出る場合
    • スクリプト内で slipperyMaterial または stopMaterial が設定されていないとエラーになります。インスペクターで適切なマテリアルが割り当てられているか確認してください。

5. 再調整とテスト

問題が解決したら、もう一度プレイモードでテストします。必要に応じて以下を調整してみましょう:

  • 滑り出す速度(force の値を調整)。
  • 滑る時間(time = 1 の値を変更)。

これで動作確認が完了です!正常に動作すれば、Cubeがクリックで滑り出し、1秒後にピタッと停止する様子を楽しむことができます。



7. 応用編:Physics Materialとスクリプトのカスタマイズ

Unityでオブジェクトをクリックで滑らせる基本がわかったところで、さらに応用してみましょう!このセクションでは、スクリプトやPhysics Materialを調整して、さまざまな動きを実現する方法を紹介します。


1. 滑りのスピードや方向を調整する

現在のコードでは、Cubeは固定された速度と方向で前方に滑ります。この設定をカスタマイズしてみましょう。

スクリプト変更例:方向を自由に設定

void Update()
{
    time -= Time.deltaTime;

    if (Input.GetMouseButtonDown(0))
    {
        time = 1;

        // カメラの前方向にCubeを動かす
        Vector3 forward = Camera.main.transform.forward;
        rb.AddForce(forward * force, ForceMode.Impulse);
    }

    if (time <= 0)
    {
        collider.material = stopMaterial;
    }
    else
    {
        collider.material = slipperyMaterial;
    }
}

このコードでは、カメラの向きを基準にCubeが動きます。視点に応じて動きの方向を変えられるので、応用範囲が広がります。


2. 滑り時間を長くする

現在は1秒間滑る設定ですが、この時間を調整してみましょう。例えば、滑る時間を変数で管理できるようにします。

コード変更例:滑り時間をInspectorで設定可能に

public float slideDuration = 1.0f; // 滑る時間を設定

void Update()
{
    time -= Time.deltaTime;

    if (Input.GetMouseButtonDown(0))
    {
        time = slideDuration; // 設定した時間に変更
        rb.AddForce(0, 0, force, ForceMode.Impulse);
    }

    if (time <= 0)
    {
        collider.material = stopMaterial;
    }
    else
    {
        collider.material = slipperyMaterial;
    }
}

Inspectorで設定する方法

  1. スクリプトを選択したオブジェクト(Cube)をクリックします。
  2. Slide Durationという項目が表示されるので、例えば「2.0」などに設定します。
  3. これで滑り時間をカスタマイズ可能になります!

3. 他のオブジェクトへの応用

この仕組みをCubeだけでなく、他のオブジェクトにも応用できます。

応用例:複数のオブジェクトに対応

  • Cube以外の形状(SphereやCapsule)にも適用可能です。
  • スクリプトをプレハブにアタッチし、Prefabとして再利用すると効率的です。

注意点

  • オブジェクトによって摩擦の挙動が異なる場合があります。これは形状やColliderの種類によるものなので、Physics Materialの調整が必要です。

4. 力の方向をランダムにする

オブジェクトがランダムな方向に滑るようにすると、さらにダイナミックな動きが作れます。

コード変更例:ランダム方向

void Update()
{
    time -= Time.deltaTime;

    if (Input.GetMouseButtonDown(0))
    {
        time = slideDuration;

        // ランダムな方向に力を加える
        Vector3 randomDirection = new Vector3(
            Random.Range(-1f, 1f),
            0,
            Random.Range(-1f, 1f)
        ).normalized;

        rb.AddForce(randomDirection * force, ForceMode.Impulse);
    }

    if (time <= 0)
    {
        collider.material = stopMaterial;
    }
    else
    {
        collider.material = slipperyMaterial;
    }
}

ランダムな動きは、パーティクルや物理シミュレーションのような要素にも応用できます。


5. 滑りのエフェクトを追加

さらに、滑る間にエフェクトを加えると、視覚的な演出が強化されます。

方法例:トレイルを追加

  1. Cubeに「Trail Renderer」コンポーネントを追加します。
    • 手順: Cubeを選択し、Add ComponentTrail Rendererを選択。
  2. Trail Rendererの設定を調整します。
    • Timeを1秒程度に設定。
    • カラフルなグラデーションを設定。

エフェクトとスクリプトの組み合わせ

  • Trail Rendererが滑り中だけ有効になるよう、スクリプトで制御することもできます。

これらの応用例を試すことで、Physics Materialを使ったシンプルなスクリプトが、より多彩でインタラクティブな体験に進化します。自分のプロジェクトに合わせて調整してみてくださいね!



8. まとめ

今回の記事では、UnityでPhysics Materialを使ってオブジェクトをクリックで滑らせ、1秒後に完全に停止させる方法を学びました。以下に、重要なポイントを振り返ってみましょう。


Physics MaterialとRigidbodyの連携

  • Physics Materialを使用することで、オブジェクトの表面の滑りや摩擦を簡単に調整できます。
  • Rigidbodyを追加することで、物理挙動がシーン内で再現され、実際の力や摩擦の影響をプログラムで制御できます。

スクリプトでの動きの制御

  • スクリプトでAddForceを利用して、オブジェクトに力を加える方法を学びました。
  • 時間制御(Time.deltaTime)を活用して、一定時間後にMaterialを切り替え、停止させる仕組みを作りました。

このテクニックの応用例

今回学んだ方法は、さまざまな場面で応用できます。

  • キャラクターの移動やブースト効果の再現
  • 物理ベースのミニゲームでの動きの表現
  • オブジェクト同士の衝突後の動きを滑らかにする演出

今後の学習ポイント

Unityの物理エンジンをさらに深く理解するには、以下のトピックもおすすめです。

  • Physics Materialの詳細設定(ダイナミック摩擦と静的摩擦)
  • ForceModeの使い分け(Impulse、VelocityChangeなど)
  • 衝突検知(ColliderとOnCollisionメソッド)

Physics MaterialやRigidbodyを活用することで、ゲーム内でよりリアルな物理表現が可能になります。今回の学習をきっかけに、さらに自由なアイデアを実現していきましょう!🎮

疑問点や試してみたいアイデアがあれば、ぜひ挑戦してみてください!



よくある質問

Q
滑りの時間を長くしたい場合はどうすればいいですか?
A

スクリプト内のtime変数の設定を変更するだけで簡単に調整できます。以下のコードを修正してください:

time = 2; // 滑りを2秒間に変更

また、Updateメソッドでのtime -= Time.deltaTime;の挙動が期待通りか確認しましょう。

Q
Physics Materialを使うときに注意することは?
A

Physics Materialはオブジェクトの「摩擦」と「バウンス(反発力)」を制御するために使用します。ただし、以下の点に注意してください:

  • Rigidbodyを持たないオブジェクトには効果がありません。
  • 摩擦値が低すぎると制御が難しくなる場合がありますので、適切な値を設定しましょう。
  • 動作確認の際は他のオブジェクトや地形に干渉しないか確認することが重要です。
Q
他の形状のオブジェクトでも同じ方法で動かせますか?
A

はい、可能です。このチュートリアルで使用したスクリプトはCube以外のオブジェクトにも適用できます。ただし、Colliderの形状が変わる場合は、適切なColliderを使用してください(例: SphereにはSphereColliderを使用)。

おすすめのアセット

50 Games Bundleは、様々なジャンルのゲームを一つのパッケージにまとめたお得なアセットです。パズル、カジュアル、レトロ、サバイバル、プラットフォームなど、50種類ものゲームが収録されています。これにより、初心者から上級者まで、誰でも簡単にゲーム開発を始めることができます。

特徴としては、すぐに使える完全なプロジェクトファイルが含まれており、各ゲームにはカスタマイズ可能なスクリプトとアートアセットが付属しているので、自分だけのオリジナルゲームを作成することも可能です。これからゲーム開発を始めたい方や、様々なジャンルのゲームを試してみたい方に最適なバンドルです。