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

概要


実行時にMagicaClothを内包したキャラクターをインスタンス化すると、MagicaClothの初期化が自動で実行され動作が開始します。
そのため、基本的には何も操作する必要はありません。
しかし、この初期化の際に状況によってはキャラクターの姿勢などに制限が発生する場合があります。
これはMagicaClothのバージョンや構築タイプにより次の3つに分類されます。

  • v2.13.0以前の実行時構築
  • v2.13.0以降の実行時構築
  • 事前構築

ここではこれらについての詳細と、インスタンス化の内部処理について解説します。

実行時構築と事前構築


まず、MagicaClothの動作方法には「実行時構築」と「事前構築」の2種類があります。
通常利用されるのは実行時構築です。

実行時構築

実行時構築では実行時にその場でクロスデータが作成されます。
このクロスデータの作成には平均して10ms~30msほどの時間がかかります。
この作業はバックグラウンドで行われるためゲームの進行には影響はありません。
しかし、この作業のため、インスタンス化してから実際にクロスシミュレーションが開始されるまでに数フレームの遅延が発生します。

事前構築

事前構築ではクロスデータを編集時に作成してアセットとして保存します。
そのため、実行時にはすぐにシミュレーションを開始できます。
ただし、事前構築にはアセットのデータが増えることや、手動で構築作業を行う必要があるなどデメリットも存在します。
詳しくは事前構築のドキュメントを参照してください。

構築種類による利点と欠点


詳細説明の前に、各構築タイプによるメリット・デメリットを簡単にまとめておきます。
v2.13.0で実行時構築が大きく改善したため、以前にあったデメリットが大きく減っている点に注目してください。

メリット デメリット
v2.13.0以前の実行時構築 MagicaClothのバージョン変更やメッシュやボーンの構造に変化があっても影響が無い。
パラメータが変更されても特別な操作は必要無い。
初期化の負荷が高い。
データ構築に時間が掛るためシミュレーションが開始されるまでに遅延が発生する。
キャラクターは編集時と同じポーズとスケールで初期化しなければならない。
v2.13.0以降の実行時構築 MagicaClothのバージョン変更やメッシュやボーンの構造に変化があっても影響が無い。
パラメータが変更されても特別な操作は必要無い。
初期化時のキャラクターのポーズとスケールはどのような状態でも良い。
初期化の負荷が低い。
データ構築に時間が掛るためシミュレーションが開始されるまでに遅延が発生する。
事前構築 初期化の負荷が低い。
シミュレーションは即座に開始される。
初期化時のキャラクターのポーズとスケールはどのような状態でも良い。
クロスデータを作成するための操作が必要。
MagicaClothのバージョン変更やメッシュやボーンの構造変化により容易にクロスデータが利用できなくなる。
パラメータが変更されるたびにクロスデータを再構築する必要がある。

V2.13.0以前の実行時構築


v2.13.0以前では、キャラクターは編集時と同じ姿勢で初期化する必要があります。
これは通常であればAポーズやTポーズです。
編集時と同じ姿勢でないと、頂点属性データなどがずれて動作しない場合があります。
具体的には次の項目が編集時と同じである必要があります。

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

キャラクターの座標や回転は変更しても問題ありません。
もし、インスタンス化後にすぐにキャラクターの姿勢を変更したい場合は、変更前に手動で初期化を呼び出しておく必要があります。
この方法については、このページの最後に記載されています。

V2.13.0以降の実行時構築


v2.13.0以降では編集時にキャラクターの姿勢を自動的に保存するようになりました。
このデータを初期化用データと呼びます。
このため、以前は初期化時に編集時と同じ姿勢である必要がありましたが、その制限がなくなりました。
キャラクターの姿勢やスケールは、初期化前に変更しても問題ありません。

初期化用データの確認

コンポーネントが初期化用データを持っているかは、インスペクターの情報ウインドウに表示されます。
[Init Data]がTrueならば初期化用データを保持しています。

また、実行時に初期化用データが利用されているかも、インスペクターの情報ウインドウに表示されます。
ここが”Success”である場合は、正しく初期化用データを利用して構築されています。

もし、何らかの番号とメッセージが表示された場合はエラーが発生しています。
その場合は、初期化用データの再作成を行ってください。

初期化用データの作成

初期化用データは自動で作成されます。
そのため、基本的には何もする必要はありません。
ただし、何らかの理由で初期化用データがうまく作成されない場合は、次のように頂点ペイントを一度起動してすぐに閉じてください。
これにより初期化用データが作成されます。

もしくは、コンポーネントメニューから”Rebuidl InitData”を選択することで、強制的に初期化データを再作成することもできます。

v2.13.0以前のコンポーネントに初期化用データを対応させる方法

v2.13.0以前のコンポーネントは初期化用データを持っていませんが、簡単に対応させることができます。
その場合は次の2つのどちらかの方法を実行してください。

  • キャラクターがプレハブ化されている場合は、一度プレハブモードに入る
  • キャラクターを一度シーン上に配置する

これで新しく初期化用データが作成されます。

初期化場所の変更


初期化はMonoBehaviourコンポーネントのStart()で実行されますが、これをAwake()に変更することも可能です。
この変更を行うにはMagicaSettingsコンポーネントを利用します。

詳細はMagicaSettingsコンポーネントの解説を参照してください。

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

MagicaManager.SetInitializationLocation(MagicaManager.InitializationLocation.Awake);

手動による初期化


また、初期化は手動で呼び出すことも可能です。
これにはInitialize()を利用します。
特にv2.13.0以前ではキャラクターのポーズやスケールを変更する前に、初期化を呼び出しておく必要があります。
次の例はキャラクターをインスタンス化し手動で初期化を呼び出し、その後にキャラクターのスケールを変更するものです。

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);