型名の変更

NodeComponent型の名前変更について説明します。

NodeComponentなどはUnityのSerializeReferenceによってシリアライズする仕様となっています。

SerializeReferenceとは内部的にアセンブリ名や名前空間、型名を保存し、その情報を元にデシリアライズする機能です。
各種名前で参照するため名前が変更された際にデシリアライズできずに参照切れとなってしまう問題が発生します。

データの参照切れを回避するには、MovedFromAttributeを適用する方法と、YAMLファイルを直接編集する方法があります。

MovedFromAttribute

アセンブリ(asmdef)や名前空間、型名を変更した場合、型にMovedFromAttributeを適用することでUnityのシリアライズ機能に型名の変更を知らせることができます。

コード例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
using UnityEngine;
using UnityEngine.Scripting.APIUpdating; // MovedFromAttributeを使用するために記述
using LogicToolkit;

namespace NewNamespace
{
    [MovedFrom(false, "OldNamespace", "OldAssembly", "OldType")]
    public class NewType : ActionComponent
    {
        // 中身
    }
}

移行処理

MovedFromAttributeを適用していると、Unityはデータを読み込む際に型が見つからない場合に自動的に移行処理を行います。
ただし変更結果はファイルに反映されないため、移行後のデータを保存するには改めて保存しなおす必要がある点に注意してください。

複数のファイルをまとめて移行したい場合は、ファイルの再シリアライズを行ってください。

  1. 必ずバックアップを行ってください。
  2. Projectウィンドウから移行したいファイルもしくはフォルダを右クリック。
  3. メニューからLogic Toolkit > Force Reserializeを選択。

これにより、選択中のファイルもしくは選択フォルダ内のすべてのファイルが再シリアライズされます。

なおUnity2023.2現在、ジェネリック型およびジェネリックパラメータに使用されている型が変更された場合には対応していません。
後述するファイルの直接編集を参照してください。

ファイルの編集

MovedFromAttributeが機能しない場合や、アセンブリや名前空間の変更を一括で行いたい場合にはYAML形式のファイルを直接変更することで移行できます。  

編集ミスによりデータが破損する可能性がありますので、必ずバックアップを取ってから行ってください。

Asset Serialization Modeの設定

YAML形式でシーンファイルなどを保存するには、Project Settingsの設定が必要です。

  1. メニューからEdit > Project Settingsを選択。
  2. 「Editor」カテゴリを選択
  3. 「Asset Serialization」の「Mode」を「Force Text」に設定。
    • もともと「Force Text」だった場合は特に問題ありません。
    • 「Force Text」以外だった場合は、対象のファイルを再度保存しなおす必要があります。

YAMLファイルを編集

  1. 変更したいファイルをテキストエディタで開く。
  2. 以下のような参照箇所を見つける
1
2
3
4
5
6
7
references:
    version: 2
    RefIds:
    - rid: 2053174280601206785
      type: {class: OldType, ns: OldNamespace, asm: OldAssembly}
      data:
        ...
  1. 正しい情報に変更する
5
type: {class: NewType, ns: NewNamespace, asm: NewAssembly}

正しい情報の記述方法が不明な場合は、対象のNodeComponentを使用するシーンなどを別途作成し、保存内容を確認してください。