UnityでのScriptableObjectと車両システムの作成チュートリアル
このチュートリアルでは、UnityでScriptableObject
を使って、異なる特性を持つ車両を定義し、シーン内でその車両を動かすシステムを構築します。複数のファイルに分割して開発し、最後にメニューから車両オブジェクトを自動生成する機能を実装します。
目次
ベースとなるUnity公式スクリプトのドキュメント
チュートリアルの目標
- ScriptableObject を用いたデータ管理の方法を学ぶ
- 車両の動作を制御するクラス を作成し、Unityのシーンでオブジェクトを移動させる
- Unityエディタ拡張 の基本を学び、メニューから車両オブジェクトを生成する
ステップ 1: プロジェクトのセットアップ
- Unityプロジェクトを作成: Unity Hubを開き、新しい3Dプロジェクトを作成します。プロジェクト名は「VehicleSystemTutorial」にします。
- スクリプトファイルの準備:
Assets
フォルダー内に「Scripts」というフォルダーを作成し、その中に3つのスクリプトファイルを作成します。
VehicleTypeInfo.cs
VehicleInstance.cs
ScriptableObjectVehicleExample.cs
ステップ 2: VehicleTypeInfo.cs
の作成
このクラスは車両の最大速度や加速度を保持し、車両タイプを定義するためのScriptableObject
を作成します。
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; // 最大加速度
}
- コードの説明:
VehicleTypeInfo
クラスは車両の基本データ(最大速度と最大加速度)を保持します。[CreateAssetMenu]
属性により、このクラスのアセットを簡単に作成できます。
ステップ 3: VehicleInstance.cs
の作成
次に、VehicleInstance
クラスを作成して、車両の現在の速度や加速度を管理し、VehicleTypeInfo
のデータを参照して車両がシーン内を移動できるようにします。
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;
}
}
- コードの説明:
Initialize
メソッドで、車両タイプと現在の加速度をランダムな範囲で初期化します。Update
メソッドで、車両が前進方向に動き、最大速度に達したら制限します。
ステップ 4: ScriptableObjectVehicleExample.cs
の作成
最後に、ScriptableObjectVehicleExample
クラスを作成し、Unityエディターのメニューから簡単に車両オブジェクトを生成できるようにします。
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);
}
}
- コードの説明:
MenuCallback
メソッドはUnityエディターのメニュー「Example/Setup ScriptableObject Vehicle Example
」から呼び出せます。LoadOrCreateVehicleType
メソッドで、車両タイプ(VehicleTypeWagon
やVehicleTypeCruiser
)のアセットが存在しない場合、新規作成します。CreateVehicle
メソッドで、指定した車両タイプに基づいてシーンに車両オブジェクトを生成します。
ステップ 5: 車両オブジェクトの生成
Unityエディターで、以下の手順で車両オブジェクトを生成します。
- Unityのメニューから「
Example/Setup ScriptableObject Vehicle Example
」を選択します。 - この操作により、以下の処理が自動的に行われます:
VehicleTypeWagon.asset
とVehicleTypeCruiser.asset
というVehicleTypeInfo
アセットがAssets
フォルダーに作成されます。- 現在のシーンに、以下の3つのオブジェクトが生成されます:
Wagon1
(球体) –VehicleTypeWagon
に基づく車両Wagon2
(球体) –VehicleTypeWagon
に基づく車両Cruiser1
(立方体) –VehicleTypeCruiser
に基づく車両
ステップ 6: 動作確認
- Playモードに入り、各車両が設定に基づき移動するか確認します。
Wagon1
とWagon2
はVehicleTypeWagon
の設定に基づき、最大速度5、最大加速度0.5で動作します。Cruiser1
はVehicleTypeCruiser
の設定に基づき、最大速度75、最大加速度2で動作します。
以上で、UnityでScriptableObject
を使用して車両タイプと動作を管理するシステムのチュートリアルが完了です。このシステムは拡張可能で、より複雑なシミュレーションにも適用できます。
ディスカッション
コメント一覧
まだ、コメントがありません