キャラクターのインスタンス化

概要


実行時にMagicaClothをセットアップしたキャラクターを生成するにはInstantiate()を利用すると思います。
ここではキャラクターをインスタンス化する際の注意点と、MagicaClothの初期化の重要性について解説します。

初期化の重要性


MagicaClothを利用する際には、まず初期化を行うことが必要です。
これによりMagicaClothはキャラクターの必要な情報を収集してセットアップを開始します。
初期化はMonoBehaviourコンポーネントのStart()で自動的に実行されます。
そのため、基本的には何もする必要はありません。

注意する点は、この初期化が実行される前にキャラクターのアニメーションポーズやスケールを変更してはならないという事です。
インスタンス化された時のキャラクターの状態や姿勢は、MagicaClothをセットアップした編集時と同じである必要があります。

具体的には次に上げる事項は初期化前に行ってはいけません。
これらの事項を初期化前に行うと、様々な予期せぬ問題が発生します。

  • キャラクターの姿勢(アニメーションポーズ)の変更
  • キャラクターのスケールの変更

キャラクターの座標や回転は変更しても問題ありません。

初期化場所の変更


初期化はMonoBehaviourコンポーネントのStart()で実行されますが、これをAwake()に変更することも可能です。
これによりキャラクターをインスタンス化した直後に初期化が自動的に実行されます。
そのため、すぐにスケール変更やアニメーションポーズの変更を行うことができます。
この変更を行うにはMagicaSettingsコンポーネントを利用します。

このコンポーネントをシーンに配置して、[Initialization Location]をAwakeに変更することで準備完了です。
詳細はMagicaSettingsコンポーネントの解説を参照してください。

また、同じ変更をスクリプトAPIから行うことも可能です。
これにはSetInitializationLocation()を利用します。

MagicaManager.SetInitializationLocation(MagicaManager.InitializationLocation.Awake);

手動による初期化


また、初期化は手動で呼び出すことも可能です。
これにはInitialize()を利用します。
次の例はキャラクターをインスタンス化し手動で初期化を呼び出し、その後にキャラクターのスケールを変更するものです。

var obj = Instantiate(prefab);

// MagicaCloth Initialize
var clothList = obj.GetComponentsInChildren<MagicaCloth>();
foreach (var cloth in clothList)
  cloth.Initialize();

// Scale
obj.transform.localScale = new Vector3(2, 2, 2);

事前構築の利用


これまでの初期化にまつわる問題はMagicaClothが実行時にシミュレーションデータをその場で構築するシステムに起因しています。
このシステムのために初期化を編集時と同じ姿勢で行う必要がありました。

しかし、事前構築機能を利用することでこれらの問題を完全に取り除くことも可能です。
事前構築機能は編集時に実行に必要なシミュレーションデータを予め作成してアセットとして保存します。
そのため、実行時には初期化の負荷も少なくなり、また今回の初期化関連の問題も発生しません。
ただし、事前構築にはアセットのデータが増えることや、手動で構築作業を行う必要があるなどデメリットも存在します。

詳しくは事前構築のドキュメントを参照してください。