Version: 2023.1
言語: 日本語
ビルトインインポーター
インポーターの一貫性

Scripted Importer

Scripted Importer は Unity スクリプティング API の一部です。Scripted Importer を使用すると C# でカスタムアセットインポーターを作成できます。これにより、Unity でネイティブにサポートされていないファイル形式の独自のサポートを加えることができます。

抽象クラス ScriptedImporter を特化し、ScriptedImporter 属性を適用してカスタムインポーターを作成します。これにより、カスタムインポーターが登録され、1 つまたは複数のファイル拡張子を処理します。登録されたファイル拡張子に一致する新規または変更されたファイルが Asset パイプラインによって検出されると、Unity はカスタムインポーターのメソッド OnImportAsset を呼び出します。

ノート: Scripted Importer は、すでに Unity によってネイティブに処理されているファイル拡張子を処理できません。

以下は、Scripted Importer の簡単な例です。拡張子が “cube” のアセットファイルを、メインアセットのキューブプリミティブと、デフォルトのマテリアルとカラーと一緒にインポートし、アセットファイルから読み込んだその位置を割り当てます。

using UnityEngine;
using UnityEditor.AssetImporters;
using System.IO;

[ScriptedImporter(1, "cube")]
public class CubeImporter : ScriptedImporter
{
    public float m_Scale = 1;

    public override void OnImportAsset(AssetImportContext ctx)
    {
        var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        var position = JsonUtility.FromJson<Vector3>(File.ReadAllText(ctx.assetPath));

        cube.transform.position = position;
        cube.transform.localScale = new Vector3(m_Scale, m_Scale, m_Scale);

        // 'cube' は ゲームオブジェクトで、自動的にプレハブに転換されます
        // ( 'Main Asset' だけがプレハブになります)
        ctx.AddObjectToAsset("main obj", cube);
        ctx.SetMainObject(cube);

        var material = new Material(Shader.Find("Standard"));
        material.color = Color.red;

        // アセットには、インポートで一貫した固有の ID 文字列を割り当てられる必要があります
        ctx.AddObjectToAsset("my Material", material);

        // インポート出力としてコンテキストに渡されないアセットは破棄する必要があります
        var tempMesh = new Mesh();
        DestroyImmediate(tempMesh);
    }
}

ノート:

  • CubeImporter クラスに ScriptedImporter 属性を配置することによって、インポーターは Unity のアセットパイプラインに登録されます。
  • CubeImporter クラスは抽象クラス ScriptedImporter のベースクラスを実装します。
  • OnImportAsset の ctx 引数には、インポートイベントの入力データと出力データの両方が含まれます。
  • 各インポートイベントは、SetMainAsset への呼び出しを 1 回だけ発生させる必要があります。
  • 各インポートイベントは、必要に応じて制限なく AddSubAsset を呼び出します。
  • 詳細については、 スクリプトリファレンス のドキュメントを参照してください。

また、ScriptedImporterEditor クラスを特化し、それをクラス属性 ’CustomEditor` で修飾してどのタイプのインポーターによって使われるかを指示ことにより、カスタムインポート設定エディターを実装することもできます。

例:

using UnityEditor;
using UnityEditor.AssetImporters;
using UnityEditor.SceneManagement;
using UnityEngine;

[CustomEditor(typeof(CubeImporter))]
public class CubeImporterEditor: ScriptedImporterEditor
{
    public override void OnInspectorGUI()
    {
        var colorShift = new GUIContent("Color Shift");
        var prop = serializedObject.FindProperty("m_ColorShift");
        EditorGUILayout.PropertyField(prop, colorShift);
        base.ApplyRevertGUI();
    }
}

Scripted Importer の使用法

Scripted Importer のクラスをプロジェクトに加えると、Unity にサポートされるその他のネイティブのファイル形式同様に使用できます。

  • サポートされているファイルをインポートするアセットディレクトリ階層にドロップします。
  • Unity エディターを再起動すると、最後の更新以降に変更したファイルすべてが再インポートされます。
  • アセットファイルをディスク上で編集して Unity エディターに戻ると、再インポートが開始されます。
  • Asset > Import New Asset… を使用して新しいアセットをインポートします。
  • 明示的にメニューから再インポートを起動します:Asset > Reimport
  • Asset をクリックすると、Inspector ウィンドウ にその設定が表示されます。設定を変更するには、Inspector ウィンドウで編集し Apply をクリックします。

Scripted Importer によってインポートされたアセット (An Alembic Girl) の Inspector ウィンドウ
Scripted Importer によってインポートされたアセット (An Alembic Girl) の Inspector ウィンドウ

Scripted Importer の実際の使用例

  • Alembic: Alembic インポータープラグインは Scripted Importer を使用して更新されています。詳しい情報は Unity github: AlembicImporter を参照してください。

  • USD: USD インポータープラグインは Scripted Importer を使用して更新されています。 詳しい情報は Unity github:: USDForUnity を参照してください。

ビルトインインポーター
インポーターの一貫性