UnityでのScriptableObjectと車両システムの作成チュートリアル

このチュートリアルでは、UnityでScriptableObjectを使って、異なる特性を持つ車両を定義し、シーン内でその車両を動かすシステムを構築します。複数のファイルに分割して開発し、最後にメニューから車両オブジェクトを自動生成する機能を実装します。


ベースとなるUnity公式スクリプトのドキュメント

チュートリアルの目標

  • ScriptableObject を用いたデータ管理の方法を学ぶ
  • 車両の動作を制御するクラス を作成し、Unityのシーンでオブジェクトを移動させる
  • Unityエディタ拡張 の基本を学び、メニューから車両オブジェクトを生成する

ステップ 1: プロジェクトのセットアップ

  1. Unityプロジェクトを作成: Unity Hubを開き、新しい3Dプロジェクトを作成します。プロジェクト名は「VehicleSystemTutorial」にします。
  2. スクリプトファイルの準備: Assetsフォルダー内に「Scripts」というフォルダーを作成し、その中に3つのスクリプトファイルを作成します。
  • VehicleTypeInfo.cs
  • VehicleInstance.cs
  • ScriptableObjectVehicleExample.cs

ステップ 2: VehicleTypeInfo.csの作成

このクラスは車両の最大速度や加速度を保持し、車両タイプを定義するためのScriptableObjectを作成します。

  1. VehicleTypeInfo.csファイルを開き、以下のコードを入力します。
   using UnityEngine;

   // 車両タイプ情報を表すScriptableObject
   [CreateAssetMenu]
   public class VehicleTypeInfo : ScriptableObject
   {
       [Range(0.1f, 100f)]
       public float m_MaxSpeed = 0.1f; // 最大速度

       [Range(0.1f, 10f)]
       public float m_MaxAcceration = 0.1f; // 最大加速度
   }
  1. コードの説明:
  • VehicleTypeInfoクラスは車両の基本データ(最大速度と最大加速度)を保持します。
  • [CreateAssetMenu]属性により、このクラスのアセットを簡単に作成できます。

ステップ 3: VehicleInstance.csの作成

次に、VehicleInstanceクラスを作成して、車両の現在の速度や加速度を管理し、VehicleTypeInfoのデータを参照して車両がシーン内を移動できるようにします。

  1. VehicleInstance.csファイルを開き、以下のコードを入力します。
   using UnityEngine;

   public class VehicleInstance : MonoBehaviour
   {
       [Range(0f, 200f)]
       public float m_CurrentSpeed; // 現在の速度

       [Range(0f, 50f)]
       public float m_Acceleration; // 現在の加速度

       public VehicleTypeInfo m_VehicleType; // 参照する車両タイプ

       // 車両タイプを初期化するメソッド
       public void Initialize(VehicleTypeInfo vehicleType)
       {
           m_VehicleType = vehicleType;
           m_CurrentSpeed = 0f;
           m_Acceleration = Random.Range(0.05f, m_VehicleType.m_MaxAcceration);
       }

       void Update()
       {
           m_CurrentSpeed += m_Acceleration * Time.deltaTime;

           if (m_VehicleType && m_VehicleType.m_MaxSpeed < m_CurrentSpeed)
               m_CurrentSpeed = m_VehicleType.m_MaxSpeed;

           gameObject.transform.position += gameObject.transform.forward * Time.deltaTime * m_CurrentSpeed;
       }
   }
  1. コードの説明:
  • Initializeメソッドで、車両タイプと現在の加速度をランダムな範囲で初期化します。
  • Updateメソッドで、車両が前進方向に動き、最大速度に達したら制限します。

ステップ 4: ScriptableObjectVehicleExample.csの作成

最後に、ScriptableObjectVehicleExampleクラスを作成し、Unityエディターのメニューから簡単に車両オブジェクトを生成できるようにします。

  1. ScriptableObjectVehicleExample.csファイルを開き、以下のコードを入力します。
   using UnityEngine;
   using UnityEditor;

   public class ScriptableObjectVehicleExample
   {
       // メニュー項目から呼び出すための静的メソッド
       [MenuItem("Example/Setup ScriptableObject Vehicle Example")]
       static void MenuCallback()
       {
           // 各車両タイプのアセットを作成または読み込み
           VehicleTypeInfo wagon = LoadOrCreateVehicleType("VehicleTypeWagon", 5f, 0.5f);
           VehicleTypeInfo cruiser = LoadOrCreateVehicleType("VehicleTypeCruiser", 75f, 2f);

           // 各車両オブジェクトを生成
           CreateVehicle("Wagon1", PrimitiveType.Sphere, wagon);
           CreateVehicle("Wagon2", PrimitiveType.Sphere, wagon);
           CreateVehicle("Cruiser1", PrimitiveType.Cube, cruiser);
       }

       // 車両タイプアセットを読み込みまたは作成するヘルパーメソッド
       static VehicleTypeInfo LoadOrCreateVehicleType(string assetName, float maxSpeed, float maxAcceleration)
       {
           VehicleTypeInfo vehicleType = AssetDatabase.LoadAssetAtPath<VehicleTypeInfo>($"Assets/{assetName}.asset");
           if (vehicleType == null)
           {
               vehicleType = ScriptableObject.CreateInstance<VehicleTypeInfo>();
               vehicleType.m_MaxSpeed = maxSpeed;
               vehicleType.m_MaxAcceration = maxAcceleration;
               AssetDatabase.CreateAsset(vehicleType, $"Assets/{assetName}.asset");
           }
           return vehicleType;
       }

       // 車両オブジェクトを生成して初期化するヘルパーメソッド
       static void CreateVehicle(string name, PrimitiveType primitiveType, VehicleTypeInfo vehicleType)
       {
           var vehicle = GameObject.CreatePrimitive(primitiveType);
           vehicle.name = name;
           var vehicleBehaviour = vehicle.AddComponent<VehicleInstance>();
           vehicleBehaviour.Initialize(vehicleType);
       }
   }
  1. コードの説明:
  • MenuCallbackメソッドはUnityエディターのメニュー「Example/Setup ScriptableObject Vehicle Example」から呼び出せます。
  • LoadOrCreateVehicleTypeメソッドで、車両タイプ(VehicleTypeWagonVehicleTypeCruiser)のアセットが存在しない場合、新規作成します。
  • CreateVehicleメソッドで、指定した車両タイプに基づいてシーンに車両オブジェクトを生成します。

ステップ 5: 車両オブジェクトの生成

Unityエディターで、以下の手順で車両オブジェクトを生成します。

  1. Unityのメニューから「Example/Setup ScriptableObject Vehicle Example」を選択します。
  2. この操作により、以下の処理が自動的に行われます:
  • VehicleTypeWagon.assetVehicleTypeCruiser.assetというVehicleTypeInfoアセットがAssetsフォルダーに作成されます。
  • 現在のシーンに、以下の3つのオブジェクトが生成されます:
    • Wagon1(球体) – VehicleTypeWagonに基づく車両
    • Wagon2(球体) – VehicleTypeWagonに基づく車両
    • Cruiser1(立方体) – VehicleTypeCruiserに基づく車両

ステップ 6: 動作確認

  1. Playモードに入り、各車両が設定に基づき移動するか確認します。
  • Wagon1Wagon2VehicleTypeWagonの設定に基づき、最大速度5、最大加速度0.5で動作します。
  • Cruiser1VehicleTypeCruiserの設定に基づき、最大速度75、最大加速度2で動作します。

以上で、UnityでScriptableObjectを使用して車両タイプと動作を管理するシステムのチュートリアルが完了です。このシステムは拡張可能で、より複雑なシミュレーションにも適用できます。

Unity

Posted by hidepon