★お知らせ(2023/12/27)
いつもLive2D公式コミュニティをご利用いただき誠にありがとうございます。
本コミュニティは2023年12月27日 11:00をもって閉鎖いたしました。
今後の運営はすべて新Live2D公式クリエイターズフォーラムに移行します。
閉鎖に伴い、以下機能は利用不可となります。
・アカウントの新規作成
・トピック投稿、返信
たくさんのご利用誠にありがとうございました。

新Live2D公式クリエイターズフォーラムは以下バナーよりご利用いただけます。
Live2D公式クリエイターズフォーラム

なお、本コミュニティに投稿されたトピックはすべて残りますが、今後削除する可能性がございますので予めご了承ください。
閉鎖に関するお問い合わせにつきましてはLive2D公式クリエイターズフォーラムへご連絡ください。

表情変化でArtMeshを表示非表示で値を変更すると透明度正しく変化しない

編集済: 6月 2017 Cubism SDK 2.1
こんな感じです。

パラメーターを見ての通り、1-0のみなのに半透明が残っています。

表情変化を基本はパラメーターでいじりつつ、
ある一定量を超えると、口を大きく開けた別のArtMeshの透明度をいじって表示する。
といった事をすると、透明度が消えたままだったり、半透明に残ったままの事象が発生します。
BODYは0だから完璧に消えてなければならず、HAIRは0なので消えなければならないですが、しっかり残っています。
これが重なると表示位置すらぶっ飛んだ感じになってしまいます。

リファレンスを見ると、unityでの透明度の描写は不安定というのを見ましたが、
とはいえ、発生が不安定だから気を付ける、では対策のしようがないです。

どういった条件で発生するのか、そもそもできない機能なのか、
透明度の再描画の指示をこちらで明示的に指示する別の方法があるなど、
なにか回避する方法はないのでしょうか。

コメント

  • @SakataHarumiRT さん

    この不具合ですが、Inspectorから不透明度を操作したタイミングと、SDKが設定された不透明度をモデルに適用するタイミングが入れ替わってしまうことが原因となっております。

    パーツの不透明度自体は、[モデル]/Parts以下のパーツごとに保持しており、
    Inspectorの拡張によってそれらを一括で操作できるようにしております。

    不透明度の値を更新したあと、SDKのフレームワークがその値からパーツの不透明度を
    更新するのが想定通りの動作なのですが、Inspectorのスライダーで値を変更した場合、
    UnityのGUIの仕様から、更新の順序が入れ替わってしまい、一つ前の不透明度の値が参照されてしまいます。
    そのため、スライダーをゆっくり動かしていれば誤差は小さいのですが、素早く値を変更した場合はその誤差が大きくなり、表示状態に齟齬が発生するのがこの不具合となります。

    回避方法としては、Inspector上での操作であれば、スライダーをゆっくり操作する、右側の数値入力欄に直接数値を入力する、という方法があります。
    ただし、0(=非表示状態)の場合は、負荷軽減のためにMeshRendererをDisableにしています。
    0で止まってしまった場合、スライダーを一度0に戻してからでないと不透明度が反映されませんのでご注意ください。

    現在はこの不具合の修正を検討しております。
    ご不便をおかけしますが、どうぞよろしくお願いいたします。
  • ありがとうございます。
    表示テストのため、inspectorで確認をおこなっていました。
    今度はC#上で制御テストしてみます。
    制御的には透明度をいじるよりdisabledさせたほうがよいでしょうか。
  • 編集済: 6月 2017
    @SakataHarumiRT さん

    フェードせずに切り替えるだけであればDisableの操作でも構いません。

    C#上での制御ですが、アップデート処理をUnityのメインスレッドで行う場合、
    OnRenderObject() よりも前のタイミングで操作すればフレームがずれることはありません。

    ちなみに、パーツの不透明度の値は、以下の変数となっているため、AnimationClipで制御することも可能です。
    [モデル]/Parts/[パーツID]/Opacity
  • いまいじってみましたが、cubism3のSDKを探るのに、前バージョンの検索結果が出てきて答えにたどり着いていません。

    =================================
    using Live2D.Cubism.Core;
    public class TestL2D : MonoBehaviour {

    [SerializeField]
    public CubismModel Model;
    bool test = false;

    void OnRenderObject()
    {
    if (!test)
    {
    CubismParameter[] para = Model.Parameters;
    Debug.LogFormat("para {0}", para[6]);
    Model.Parameters.SetValue(para[6], 2);
    test = true;
    }
    }
    }
    ==================================


    みたいなので、DebugLogはちゃんと狙いのパラメーター名が取得でき、ここ値が入ってくれればと思ったのですが、そうでもないようで…。不勉強で申し訳ありません。
    シンプルモデルにあった「live2DModel.setParamFloat("PARAM_ANGLE_X", (float)angle_x);」みたいな制御を望んでます。
    参考になるリファレンスはありませんか。それとも前バージョンに戻したほうがいいでしょうか。
  • @SakataHarumiRT さん

    Model.Parameters.SetValue(para[6], 2);
    という部分を以下のようにしてみてください。
    para[6].Value = 2;

    マニュアル、チュートリアルは現在整備中です。
    ご迷惑をおかけいたします。

    よろしくお願いいたします。
コメントするにはサインインまたは登録して下さい。