Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Drawableの透明度等の設定が反映されないことがあるバグを修正 #82

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from

Conversation

ppcuni
Copy link
Contributor

@ppcuni ppcuni commented Jul 10, 2024

CubismDynamicDrawableData.Flags で透明度等のフラグが変更されるフレームと
CubismModel.enabled が false になるフレームが同一フレームとなる場合、
CubismRenderController.OnDynamicDrawableData が呼ばれないため、Flags の消化がされない状態になる。

その後 CubismModel.enabled が true になると CubismRenderController.OnDynamicDrawableData の前に
CubismDynamicDrawableData.Flags が更新されてしまうためフラグの消化が漏れるケースがあった。

今回の修正は CubismModel.enabled が true になったフレームで未消化のフラグと or をとることでフラグが消化されるようにした。

CubismDynamicDrawableData.Flags で透明度等のフラグが変更されるフレームと
CubismModel.enabled が false になるフレームが同一フレームとなる場合、
CubismRenderController.OnDynamicDrawableData が呼ばれないため、Flags の消化がされない状態になる。

その後 CubismModel.enabled が true になると
CubismRenderController.OnDynamicDrawableData の前に
CubismDynamicDrawableData.Flags が更新されてしまうため
フラグの消化が漏れるケースがあった。

今回の修正は CubismModel.enabled が true になったフレームで
未消化のフラグと or をとることでフラグが消化されるようにした。
@tanakaso-at-live2d-com
Copy link
Contributor

@ppcuni
Thank you for pull request!

To investigate this further, would it be possible for you to provide a sample code and reproduction steps that demonstrate the above issue?
Thank you for your cooperation.

@ppcuni
Copy link
Contributor Author

ppcuni commented Jul 16, 2024

@tanakaso-at-live2d-com
回転デフォーマの透明度をパラメータで切り替えてパーツの切り替えをするモデルで、アニメーションで1フレーム目にパラメータにキーを打ってパーツの切り替えを行うような作りにしていました。
そのモデルをUnity上で表示させ、アニメーションのトリガーを行うフレームでCubismModelのenableを落としたら再現しました。

Naninovelというアセットを用いた際に起きたため、サンプルコードの提出はできません。
Naninovelのスクリプトで上記アニメーションの再生とhideコマンドを列挙すると、発生することがあります。

@tanakaso-at-live2d-com
Copy link
Contributor

@ppcuni
We apologize for the delayed response. We have been reviewing the information provided, including the Naninovel scripts, but are currently unable to reproduce the issue.

We will share the scripts with you, so please let us know if you are able to reproduce the issue using them. Alternatively, if you can provide a script that reproduces the issue, that would be very helpful.

# Start

@char Default.Paper pos:45,50 scale:4 wait:false

@printer Wide
Default: 次はグー

@char Default.Rock pos:45,50 scale:4 wait:false
Default: 次はパー&非表示

@char Default.Paper pos:45,50 scale:4 wait:false
@hideChars wait:false
Default: 次はグー

@char Default.Rock pos:45,50 scale:4 wait:false
Default: 振り出しに戻る


@hideChars wait:false
@hidePrinter

@goto .Start

Additionally, if you are able to share a video demonstrating the reproduction steps and the observed behavior, that would also be greatly appreciated.

We apologize for the inconvenience and thank you for your cooperation.

@ppcuni
Copy link
Contributor Author

ppcuni commented Jul 19, 2024

@tanakaso-at-live2d-com
再現時は以下のようなドラマの流れでした

@animate キャラ名 appearance:パーツ切り替えモーション
@hide キャラ名 time:0
@wait 0.5
@show キャラ名 time:0.5

また負荷対策として、Naninovel の Live2DCharacter.DrawLive2D に以下のような修正を入れてありました。

            var visibility = Renderer.Opacity != 0;
            if (visibility)
                Drawer.DrawTo(Renderer, ActorMetadata.PixelsPerUnit);

            if (_currentVisibility != visibility)
            {
                _currentVisibility = visibility;

                // 負荷対策として非表示のモデルの処理を一部止める
                var cubismRenderController = GameObject.GetComponentInChildren<Live2D.Cubism.Rendering.CubismRenderController>();
                cubismRenderController.enabled = visibility;
                var cubismModelController = GameObject.GetComponentInChildren<Live2D.Cubism.Core.CubismModel>();
                cubismModelController.enabled = visibility;
                var cubismUpdateController = GameObject.GetComponentInChildren<Live2D.Cubism.Framework.CubismUpdateController>();
                cubismUpdateController.enabled = visibility;
                var cubismMaskController = GameObject.GetComponentInChildren<Live2D.Cubism.Rendering.Masking.CubismMaskController>();
                cubismMaskController.enabled = visibility;
            }

この結果、hide時にCubismRenderController.enabledがfalseになるため、上述のパーツ透明度変更のDirtyがtrueになるフレームでCubismRenderController.OnDynamicDrawableDataが呼ばれなくなっていると思われます

@tanakaso-at-live2d-com
Copy link
Contributor

@ppcuni
I apologize for the delayed response. We have been continuing the investigation internally, but we are unable to confirm the difference between the pre-modification and post-modification states.

If possible, could you please provide a video showing the difference between the pre-modification and post-modification states, or share the project where the issue is occurring?

If you are able to share the project, please do so via the link below.
https://biz.datadeliver.net/posts/DOERCearrweu

Thank you for your cooperation.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants