ようこそ!

初めてですか? 参加するには、どちらかのボタンをクリックしてください!

【Live2D Creators Circleのご案内】
Live2Dでは現在、業務をお手伝いしていただけるユーザーの方々を募集しています。
もし、ご興味がありましたら下記URLより詳細をご確認ください。
https://goo.gl/0oBmkq
Live2Dの様々な情報をお届けするリアルイベント「alive 2017」参加応募受付中!

Live2Dを使ったゲームタイトルを持つ企業による開発秘話のセッションなど
さまざまなコンテンツを用意しています!

初心者の方も経験者の方も参加可能ですので、ぜひ一度特設サイトをご覧ください。
(応募期限2017/11/12まで)

詳しい募集要項はこちら↓↓

特設サイト:http://alive2017.live2d.com/ 

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

こんな感じです。

パラメーターを見ての通り、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させたほうがよいでしょうか。
  • edited 06/12
    @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;

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

    よろしくお願いいたします。
Sign In or Register to comment.