Version: 2017.2
ライトマップの継ぎ目の縫合
Look Dev

ScriptedImporter

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

Create a custom importer by specializing the abstract class ScriptedImporter and applying the ScriptedImporter attribute. This registers your custom importer to handle one or more file extensions. When a file matching the registered file extensions is detected by the Asset pipeline as being new or changed, Unity invokes the method OnImportAsset of your custom importer.

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

注意: 制限

これは Scripted Importer 機能の実験的なリリースであり、Unity Scripting API を使用して作成できるアセットに限定されています。 これは、この機能の実装または設計の制限ではありませんが、実際の使用には制限があります。

以下は、Scripted Importer の簡単な例です。拡張子が cube のアセットファイルを、キューブプリミティブの Unity プレハブにメインアセットとしてインポートします。また、アセットファイルからフェッチしたカラーのデフォルトマテリアルをインポートします。

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

[ScriptedImporter(1, "cube")]
public class CubeImporter : ScriptedImporter
{
    [SerializeField]
    float m_ColorShift = 0f;

    public override void OnImportAsset(AssetImportContext ctx)
    {
        // メインアセット
        var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        ctx.SetMainAsset("MainAsset", cube);

        // サブアセットとしてのマテリアル
        string text = File.ReadAllText(ctx.assetPath, Encoding.UTF8);
        var channels = text.Split(',');
        var color = new Color(float.Parse(channels[0]) + m_ColorShift,
                              float.Parse(channels[1]) + m_ColorShift,
                              float.Parse(channels[2]) + m_ColorShift);

        var material = new Material(Shader.Find("Standard")) { color = color };
        cube.GetComponent<Renderer>().material = material;
        ctx.AddSubAsset("Material", material);
    }
}

ノート:

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

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

using UnityEditor;
using UnityEditor.Experimental.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();
    }
}

スクリプトしたインポーター

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

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

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

ScriptedImporter の実際の使用例

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

  • USD: USD インポータープラグインは ScriptedImporter を使用して更新されています。




ライトマップの継ぎ目の縫合
Look Dev