【Unity】モデルパーツの透明度について

【Cubism SDKのバージョン】 Cubism 4 SDK for Unity R3

【OS名・バージョン】
エディション Windows 10 Home
バージョン 21H2
インストール日 ‎2022/‎01/‎23
OS ビルド 19044.1466
エクスペリエンス Windows Feature Experience Pack 120.2212.3920.0

【開発使用ツール】
Visual Studio Community 2017 ver15.6.5
Unity 2020.3.21f1 Personal

【不具合の状況】
Unityにインポートしたモデルデータのパーツの透明度を
スクリプトから制御したいのですが
「Opacity」を使用してもUnity上で反映されません。
どうしたらよいでしょうか。

下記の記述では透明度を変化させられませんでした。
初期状態ではパーツの不透明度は0です。
Model.Parts[20].Opacity = 1.0f;

以下C#スクリプト一部

[SerializeField] GameObject L2DM;
public CubismModel Model;

// Start is called before the first frame update
void Start()
{
     L2DM = GameObject.Find("LookIn_model(Ars)");
    Model = L2DM.GetComponent<CubismModel>();
}

// Update is called once per frame
void Update()
{
    
}
public void LateUpdate()
{

}
public void AddSwitch()
{
    Debug.Log("OK");
    Model.Parts[20].Opacity = 1.0f;       
}

============================================

こちらの情報を参考にしました。

@Lexer_Flanagan

ご質問誠にありがとうございます。
Live2Dスタッフでございます。
いつも弊社製品をご愛顧くださり誠にありがとうございます。

こちらの現象は、おそらくCubismのコンポーネント「CubismParameterStore」によって値が上書きされているためだと思われます。

「CubismParameterStore」は毎フレームのモーション適用直前に、すべてのパラメータやパーツ不透明度の値を直前のフレームのモーション適用直後の状態にリセットするコンポーネントです。
これは直前のフレームに適用した表情など相対的に値をセットする処理が次のフレームに重ねて適用されないようにするために行っています。
このリセットするための直前のフレームの値が記録される前に、パーツの不透明度の値を設定することで回避が可能です。

こちらの現象の回避手順は以下のとおりです。

  1. 実装していただいたコンポーネントに「独自のコンポーネントの実行順を制御させる」の手順通り加工する
  2. Opacityの値操作をOnLateUpdate()で行うよう修正する
  3. コンポーネントの実行順を101~149に設定する

以上、よろしくお願いいたします。

お世話になっております。Lexerです。
CubismParameterStoreが原因なのですね。
先程ご提案頂いた方法を試してみました。
しかしながらまだ上手くいきません。

そもそもModel.Parts[20].Opacity = 1.0f;の数字20の部分は
CubismEditorのインスペクタで確認できるIDのことでよろしいでしょうか。

また教えて頂きました1番のCubismExampleControllerはC#スクリプトを新規作成し
UnityのLive2DのPrehabにアタッチする、
3番のコンポーネントの実行順はUnityEditorのProjectSettingにある
Script Execution Orderの数値を変更するということで合っていますでしょうか。

以下C#スクリプト一部

public class CubismExampleController : MonoBehaviour,ICubismUpdatable
{
[SerializeField] GameObject L2DM;
public CubismModel Model;
// Sceneの非実行中に実行順の制御を行うか
public bool NeedsUpdateOnEditing
{
get { return false; }
}
//このコンポーネントの実行順
//ExecutionOrderは、このコンポーネントの実行順を決める値になります。
//この値が小さいほど他のコンポーネントよりも先に呼ばれます。
public int ExecutionOrder
{
get { return 150; }
}
// 実行順序が制御されるアップデート関数
public void OnLateUpdate()
{
// CubismExampleControllerの更新処理
Debug.Log(“追加処理中・・・”);
Model.Parts[20].Opacity = 1.0f;
}
// 実行順が制御されているか
public bool HasUpdateController { get; set; }

private void Start()
{
    // CubismExampleControllerの初期化処理
    L2DM = GameObject.Find("LookIn_model(Ars)");
    Model = L2DM.GetComponent<CubismModel>();
    // モデルのPrefabにCubismUpdateControllerがアタッチされているかをチェック
    HasUpdateController = (GetComponent<CubismUpdateController>() != null);
}

private void LateUpdate()
{
    // CubismExampleControllerの更新処理
    // CubismUpdateControllerがアタッチされていない場合、CubismExampleController自身のイベント関数から更新処理を行う
    if (!HasUpdateController)
    {
        OnLateUpdate();
    }
}

先程モデルの透明度の変更に成功しました。
Model.Parts[1].Opacity = 0f;

しかし私は画像のゲームオブジェクトをクリックした際
Live2Dモデルのあるパーツの不透明度を変化させたいのです。
そのパーツがモデルデータにおいて何番なのか
そもそも上記の内の数字がどういう仕組みなのか知りたいです。

リファレンスを読み漁ってもどこにもOpacityについて
詳しく書いていなくて困っています。
Partsについてもう少し詳しく教えて頂けないでしょうか。

ちなみに以下のリンク先を参考にモデル全体の透明度を下げることも出来ました。

以下参考スクリプト

private CubismRenderController rc;
private void Start()
    {
        // CubismExampleControllerの初期化処理
        rc = GetComponent<CubismRenderController>();
    }
public void OnLateUpdate()
    {
        // CubismExampleControllerの更新処理
        rc.Opacity = 0.5f;
    }

@Lexer_Flanagan

この度はリファレンスの不備のためご不便をおかけして誠に申し訳ございません。
こちらの内容につきましてはマニュアルに記載を追加させていただきます。

CubismModel.Partsで取得できる配列の並び順は、[Prefab]/Parts/ 以下にあるGameObjectの並び順と同じなので、こちらでインデックスを確認することは可能です。

しかし、CubismPartにはパーツIDをもつプロパティがございますので、こちらで任意のIDを探して取得することを推奨します。

    private CubismPart _part;

    private void Start()
    {
        var parts = GetComponent<CubismModel>().Parts;

        // 特定のパーツIDを検索して取得
        for (var i = 0; i < parts.Length; i++)
        {
            if (parts[i].Id != ("PartArmAL"))
            {
                continue;
            }

            _part = parts[i];
            break;
        }
    }

    public void OnLateUpdate()
    {
        _part.Opacity = 1.0f;
    }

また、あらかじめ参照を直接コンポーネントに持たせておくことも可能です。

// Inspectorに表示させる
public CubismPart Part;

public void OnLateUpdate()
{
    Part.Opacity = 1.0f;
}

2022-02-16_11h46_38

以上、よろしくお願いいたします。

「いいね!」 1

解決しました。ありがとうございます!