実行時の変更

概要


MagicaCloth2は実行中のパラメータ変更をサポートします。
変更にはスクリプトから操作する方法と、アニメーションキーによりアニメーションから操作する方法の2つがあります。
ただし、アニメーションからは一部のパラメータしか操作することができません。
スクリプトからはすべてのパラメータにアクセス可能です。

スクリプトによる変更手順


変更は次の手順で行います。

  1. MagicaClothコンポーネントのSerializeDataクラスを取得する
  2. SerializeDataの内容を変更する
  3. MagicaClothコンポーネントのSetParameterChange()を呼び出す

MagicaClothの変更可能なパラメータはすべてこのSerializeDataクラスに内包されています。
このクラスを直接書き換えます。

ただしすべてのパラメータが変更できるわけではありません。
そのパラメータが実行時に変更できるかできないかはソースコードのコメントに記載されています。

/// [OK] Runtime changes.
/// [NG] Export/Import with Presets

最後にSetParameterChange()を呼び出すことでシステムに変更を通知します。
使われるAPIについてはScripttingAPIのページを参照してください。

パラメータ変更事例(1)

using MagicaCloth2;
using UnityEngine;

public class RuntimeParameterTest : MonoBehaviour
{
  public MagicaCloth cloth;
  public ColliderComponent col;

  bool sw = false;

  void Start()
  {

  }

  void Update()
  {
    if (cloth == null || col == null)
      return;

    // Check if MagicaCloth is running
    if (cloth.IsValid() == false)
      return;

    if (Time.frameCount % 100 == 0)
    {
      sw = !sw;
      UpdateParameter();
    }
  }

  /// <summary>
  /// Parameter change.
  /// </summary>
  void UpdateParameter()
  {
    // It manages all parameters that cloth.SerializeData can change at runtime.
    var sdata = cloth.SerializeData;
    if (sw)
    {
      // add collider.
      sdata.colliderCollisionConstraint.colliderList.Add(col);

      // gravity on
      sdata.gravity = 5.0f;
    }
    else
    {
      // remove collider
      sdata.colliderCollisionConstraint.colliderList.Remove(col);

      // gravity off
      sdata.gravity = 0.0f;
    }

    // change notification
    cloth.SetParameterChange();
  }
}

この例では100フレームごとにコライダーを追加/削除します。
また重力を変更します。

この事例はパラメータ変更のすべてを内包しています。
この操作を応用することで他のパラメータも変更が可能です。

アニメーションによる変更手順


一部のパラメータはアニメーションキーとして公開されています。
これらのキーをアニメーションに追加して操作することでパラメータが変更可能です。

アニメーションキーによる変更の場合は、スクリプトのように別途SetParameterChange()を呼ぶ必要はありません。