SerializeReferenceのrid

SerializeReferenceでシリアライズする参照にはユニークなID(rid)が割り振られる。

シリアライズされたPrefabでは以下のような挙動になっていた

  • 参照先のインスタンスが変わった時点でridがランダムな値に変わる。
  • インスタンスの中身が同じでもridは別になる。
  • Prefabをコピーしてもridは変わらない。
  • ridが変わるとGetAssetDependencyHashの結果も変わる。

安易にnewするとridが変わってしまうのでツール等を作る際はインスタンスを再利用する等、注意した方が良さそう。

次にScriptedImporterでインポートするたびにインスタンスが変わるようなアセットを作ってみたが、GetAssetDependencyHashの結果が変わることは無かった。

using UnityEngine;

[System.Serializable]
public class TestClass
{
    public int Value;
}

public class TestAsset : ScriptableObject
{
    [SerializeReference]
    public TestClass Instance;
}
using UnityEngine;
using UnityEditor;
using UnityEditor.AssetImporters;

[ScriptedImporter(1, "test")]
public class TestAssetImporter : ScriptedImporter
{
    public override void OnImportAsset(AssetImportContext ctx)
    {
        var asset = ScriptableObject.CreateInstance<TestAsset>();
        asset.Instance = new TestClass();
        ctx.AddObjectToAsset("Main", asset);
    }
}

ScriptedImporterでは気兼ねなく使って良さそう。