FadeIn FadeOutを使用するとAndroidで表示がおかしくなる

505 views
Skip to first unread message

kar...@tatsu-mi.co.jp

unread,
Dec 21, 2017, 9:26:41 AM12/21/17
to 宴ユーザーグループ
質問の前によくある質問や、過去のQ&Aや古いQ&Aに、同様の質問がないかご確認ください。

宴のバージョン: 例)3.2.6
UnityのバージョンとOS: 例)Unity5.6.4p1 Windows
UnityのConsoleウィンドウのエラーメッセージ:


などをあらかじめ記述していただくと、スムーズに問題が解決できます。

お世話になっております。
上記環境でAndroidにビルドを転送しFadeInFadeOutをおこなうと画面がバグります。
対処法はありますでしょうか。
サンプルのエクセルの途中にFadeをいれただけの変更です。
確認したおかしくなるAndroidの機種は
GalaxysS6 Android7.0
F-01F Android6.0


Huawei M3 Lite Android7.0
iOS
につきましては正常に動作しております。

よろしくお願いいたします。
2017_12_21_23_15_22.mp4
キャプチャ.PNG

マッドネスラボ

unread,
Dec 21, 2017, 10:07:54 AM12/21/17
to 宴ユーザーグループ
Unity自体のバグの可能性が高いです。
手元の機種で確認してみましたが、不具合を再現できませんでした。
初めて受けるご報告で、Androidの機種依存のバグなのと、
画面を見る限り、論理的なバグというよりも、GPU自体が不正に働いてしまうようなバグりかたをしているので
Unityのコア部分に近い部分が原因かなと思います。

Unityをバージョンアップするか、Unity5.6.4p2以降にパッチのバージョンを上げるとなおるかもしれません。

バージョンアップで直らなかったり、バージョンアップ自体が難しい場合は
こちらで調査してみます。

フェードインアウトでは、カメラにイメージエフェクトをかけいます。
もし、サンプルシーンをビルドしているのであれば、
「宴3の新機能>宴3の演出>その1>イメージエフェクト>色々表示」を選択して、
ほかのイメージエフェクトが動作しているか見てもらえるでしょうか。
ほかのイメージエフェクトもバグっているのであれば、Unity自体の仕組みがやはりバグっている可能性が高いです。

該当箇所でなにかエラーメッセージがでているようであれば、それを教えていただければと思います。
Androidでのデバッグ出力は、LogCatなどで確認できると思います。
もし、Unityのエラーメッセージがでていたら知らせていただければと思います。



Message has been deleted

kar...@tatsu-mi.co.jp

unread,
Dec 22, 2017, 12:24:56 AM12/22/17
to 宴ユーザーグループ
返信ありがとうございます。
Unity5.6.4p4で試してみましたが状況は同じでした
ですがLogcatを確認すると以下のエラーが出ておりました。
(一部情報を修正しております)
12-22 14:18:38.695 17872-17900/? E/Unity: NullReferenceException
                                            at Utage.AdvCommandFadeBase+<OnStartEffect>c__AnonStorey0.<>m__1 (Utage.Timer x) [0x0003b] in ...Assets\Utage\Scripts\ADV\Command\Wait\Effect\AdvCommandFadeBase.cs:84
                                            at Utage.Timer.OnCompleteCallback () [0x0001f] in ...Assets\Utage\Scripts\GameLib\Timer\Timer.cs:226
                                            at Utage.Timer.OnComplete (Utage.WaitTimer timer) [0x00002] in ...Assets\Utage\Scripts\GameLib\Timer\Timer.cs:214
                                            at Utage.WaitTimer.Waiting () [0x000ab] in ...Assets\Utage\Scripts\GameLib\Timer\WaitTimer.cs:86
                                            at Utage.WaitTimer.get_keepWaiting () [0x00002] in ...Assets\Utage\Scripts\GameLib\Timer\WaitTimer.cs:52
                                            at UnityEngine.CustomYieldInstruction.MoveNext () [0x00002] in /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/BaseClassBindings.gen.cs:411
                                            at UnityE

よろしくお願いいたします。

マッドネスラボ

unread,
Dec 22, 2017, 5:45:15 AM12/22/17
to 宴ユーザーグループ
ご報告ありがとうございます。
問題と思われる箇所を修正しました。
かなりうっかりミスのコードを書いてしまっていたので、おそらくこれが原因だと思います。
修正パッケージを添付いたしましたので、ご確認ください。

FixImageEffect.unitypackage
Message has been deleted

kar...@tatsu-mi.co.jp

unread,
Dec 25, 2017, 12:38:24 AM12/25/17
to 宴ユーザーグループ
お世話になっております。
上記パッケージ試してみましたが動作しませんでした
おなじくDestroyのところでNullPointerExceptionが発生します。
                engine.Page.ToSkippedTime(this.time),
                (x) =>
                {
                    colorFade.Strength = x.GetCurve(start, end);
                },
                (x) =>
                {
                    OnComplete(thread);
                    if (inverse)
                    {
                        imageEffect.enabled = false;
                                      UnityEngine.Object.Destroy(imageEffect);
                    }
                });

調べたところ上記コードの
colorFade.Strength = x.GetCurve(start, end);
のcolorFadeがnullになっているようです。
コードの上のほうにある
ColorFade colorFade = imageEffect as ColorFade;
の部分ではnullではないことを確認しました。

UnityEngine.Object.Destroy(imageEffect);
この部分でもimageEffectがnullであることを確認しました。

何かわかることはありますでしょうか。
よろしくお願いいたします。

マッドネスラボ

unread,
Dec 25, 2017, 1:10:59 AM12/25/17
to 宴ユーザーグループ
ありがとうございます。
となると、その時点でnullになること自体がおかしいです。
コードを見直してみたのですが、ほかに原因となりそうな個所が見当たりませんでした。


ほかに考えられるのは、宴のコードを書き換えていたり、外部からカメラやイメージエフェクトの操作を行っててイメージエフェクトを消してしまっているケースです。
この場合は、私のほうでは修正できません。

また、原因とは考えづらいのですが、
                    if (inverse)
                    {
                        imageEffect.enabled = false;
//                                      UnityEngine.Object.Destroy(imageEffect);
                    }
として、
UnityEngine.Object.Destroy(imageEffect);をコメントアウトしてみてもらえるでしょうか。
もしこれで直るようなら、Unityのバグに近い可能性があります。

マッドネスラボ

unread,
Dec 25, 2017, 1:30:46 AM12/25/17
to 宴ユーザーグループ
すみません。
上記のところ、コメントアウトのほかに、

                    if (inverse)
                    {
imageEffect.enabled = false;
UnityEngine.Object.DestroyImmediate(imageEffect);
                    }

のように書いて動くか試していただけるでしょうか。
おそらくなのですが、コンポーネントの破棄が即座に終わらないことが原因なようですので。

tatsu...@gmail.com

unread,
Dec 25, 2017, 1:34:27 AM12/25/17
to 宴ユーザーグループ
返信ありがとうございます。

UnityEngine.Object.Destroy(imageEffect);
こちらコメント化するとログでエラーはなくなりますが画面の挙動はバグのままでした。

上記のバグは宴インストール直後のサンプルで発生していますのでソースコードを書き換えたりオブジェクトの配置を変えたりも行っておりません。
Unityのバグか私の環境に問題がある可能性が高そうなのでこちらでなんとか原因を探してみようと思います。
ありがとうございました。

kar...@tatsu-mi.co.jp

unread,
Dec 25, 2017, 2:41:06 AM12/25/17
to 宴ユーザーグループ
返信ありがとうございます。

UnityEngine.Object.DestroyImmediate(imageEffect);
こちら試してみましたが状況は改善しませんでした。
ご報告まで。

マッドネスラボ

unread,
Dec 25, 2017, 4:12:24 AM12/25/17
to 宴ユーザーグループ
よく見てみると、フェードの時間が0に指定されているので、それが原因かもしれません。
こちらの修正を試してみてください。

もし、直らない場合、時間を0.01など0以上にしてみてください。

FixZeroDivide.unitypackage

kar...@tatsu-mi.co.jp

unread,
Dec 25, 2017, 6:33:24 AM12/25/17
to 宴ユーザーグループ
上記パッケージと0より大きくする対応それぞれ試してみましたが改善はされませんでした。

一度フェードのブラックをホワイトに変更してみました。
フェードの処理は動いているが描画がおかしいような感じがします。
フェードの処理は最初の画像の通りですべて3秒に変更しております。

2017_12_25_20_26_45(1).mp4

マッドネスラボ

unread,
Dec 25, 2017, 2:32:02 PM12/25/17
to 宴ユーザーグループ
うーん・・・となるとやはり、イメージエフェクト自体がおかしい気がします。
描画されるべき映像が消えてしまっているので。

こちらのほうはどうでしょうか?

マッドネスラボ

unread,
Dec 25, 2017, 6:13:54 PM12/25/17
to utag...@googlegroups.com
こちらでUnityのバージョンを5.6.4p4をインストールし
ビルドしてAndroid実機で試した見たところ、不具合を確認できました。
やはりイメージエフェクト全般が壊れてしまっているようです。
もう少し調査してみます。

マッドネスラボ

unread,
Dec 25, 2017, 7:20:14 PM12/25/17
to 宴ユーザーグループ
宴の作成環境である、Unity5.5.03fと、最新版のUnity2017.2.03fではバグは再現できませんでした。
やはり、Unity5.6.4特有のバグかと思われます。

kar...@tatsu-mi.co.jp

unread,
Dec 25, 2017, 8:06:55 PM12/25/17
to 宴ユーザーグループ
調査ありがとうございます。
Unityのバグとなるとソースコードの修正では厳しそうですね。
現在Unityのバージョンを変更することはできないので画面全体を覆う真っ黒なキャラを作成し
それをfadeの代わりに使用することを考えておりますがそのような対処法しか方法はなさそうでしょうか。

マッドネスラボ

unread,
Dec 25, 2017, 8:25:53 PM12/25/17
to 宴ユーザーグループ
原因の特定を試みていたのですが、
・シーン内で3Dカメラ(ProjectionがPerspective)のカメラを使っている
・3Dカメラの描画順より後にある、2Dカメラでフェードなどのイメージエフェクトを使う
という条件だと、イメージエフェクトはかかるのですが、2Dカメラが描画するべきオブジェクトが表示されなくなってしまうようです。

サンプルでは3Dモデル表示の拡張のために、3Dカメラを使っていますが、
これを削除すれば問題ないようです。



また、サンプルではなく、通常のUTAGEの作成環境ではカメラは2Dのものしか使わないので問題ないと思います。



ただ、会話シーンなどに使う場合など、3Dカメラがある状態で宴を使うと、この問題は避けられなさそうです。
また、あくまで私の環境での検証結果なので、ほかの端末でどうなるかはわかりません。
そもそものバグの原因自体もUnityの内部であるため、これで本当にバグが回避できるかはわかりません。

Unity公式のサポートにバグ報告をして修正を待つしかないと思いますが、
経験上、修正までかなり時間がかかると思いますし、最新バージョンで修正済みの過去のバージョンの不具合は、修正される望みが薄いかと思います。





kar...@tatsu-mi.co.jp

unread,
Dec 25, 2017, 8:42:49 PM12/25/17
to 宴ユーザーグループ
上記了解いたしました。
Unityのバージョンアップを検討しようと思います。
ありがとうございました。

hoshi.m...@tatsu-mi.co.jp

unread,
Dec 27, 2017, 3:03:27 AM12/27/17
to 宴ユーザーグループ
お世話になっております。
こちらのスレッドの件の症状が出る範囲を把握したいのですが(対象端末やOSなど)
何か情報はお持ちでしたら共有して頂けませんでしょうか?
よろしくお願い致します。

マッドネスラボ

unread,
Dec 27, 2017, 3:35:39 AM12/27/17
to utag...@googlegroups.com
バグの発生は、Unity5.6.4p4で確認しました。
宴の作成環境である、Unity5.5.03fと、最新版のUnity2017.3.03fではバグは再現できませんでした。

OSはAndroid
ご報告のあった端末は
・GalaxysS6 Android7.0
・F-01F Android6.0
私のほうで発生を確認している機体は
FTJ162E-Raijin

発生条件は、
1「3DカメラでViewportRectにデフォルト値以外の値を設定して、描画範囲を限定する」
2「2DカメラでUI等を表示しつつイメージエフェクトをかける」
3「Androidの一部の端末」
1~3がそろうと発生します。

1のViewPortRectというのは、宴ですと想定のアスペクト比とことなる場合のレターボックス表示のために使っています。
ただし、3Dカメラにこの処置をするのは手動で3D用のカメラを追加し、そのカメラに宴のレターボックス用のスクリプトを追加するという処理をしない限りは起きません。
サンプルではこの処理をしているため、バグが発生したようです。

2のイメージエフェクトは、セピア表示などの標準的なイメージエフェクトのほかに、単純なフェードインフェードアウトでも使用しています。

3の端末は上記のとおりです。
もしかすると、厳密には端末依存のバグではなく
1のレターボックスが必要ない、つまり想定アスペクト比通りの端末では発生しないだけなのかもしれません。

ちなみに、バグ自体は宴のプログラムを完全にのぞいた状態でも発生します。
・3Dカメラとスカイボックス
・2Dカメラにボタンひとつと、Unity公式のイメージエフェクトのスクリプト
という最低限の条件でも発生を確認して、それをすでにUnityにはバグレポート済みです。
バグレポートに対しては、いまのところ何も返信はありません。



hoshi.m...@tatsu-mi.co.jp

unread,
Dec 27, 2017, 4:38:51 AM12/27/17
to 宴ユーザーグループ
上記、了解致しました。
返答ありがとうございました。

マッドネスラボ

unread,
Dec 28, 2017, 4:26:05 PM12/28/17
to 宴ユーザーグループ
追記です。
Unityからバグレポートの返信が届きました。

向こうでもバグの発生を確認したそうです。

検証端末は下記のとおりです。
Razer Phone*, OS:7.1.1
Samsung S7 (G930F), OS:7.0
Samsung S8 (G950F), OS:7.0

回避方法は、2Dカメラのほうの「ClearFlag」を「Depth only」にすることだそうです。
Unity5.6、Unity2017.1の開発部門に修正を要望するそうです。


マッドネスラボ

unread,
Dec 28, 2017, 4:29:43 PM12/28/17
to utag...@googlegroups.com
同一の原因のバグはこちらになるようです。

tatsu...@gmail.com

unread,
Jan 5, 2018, 12:31:37 AM1/5/18
to 宴ユーザーグループ
バグ報告ありがとうございます。
とりあえずUICamera SpriteCamera のClear Flag をDepth Only に変更したところ
挙動が正常になることが確認できました。(もともとはDon't Clear)
一通り動作を確認し問題なければこれでいこうと思います。

また質問になってしまい恐縮なのですが上記設定を変更することにより何か影響が考えられる箇所は
ございますでしょうか。
こちらでも動作の確認は行うので軽微な影響であればとは思っておりま。

マッドネスラボ

unread,
Jan 5, 2018, 1:01:25 AM1/5/18
to 宴ユーザーグループ
宴やUnityの基本設定では問題ないかと思います。

ただし、UIや2Dカメラで描画するものに、「3Dオブジェクトより奥にある場合は隠れてほしいものがある」場合は、影響がでるかと思います。
Depth Onlyというのは、カメラ描画の準備として「Depthバッファをクリアする」ということです。
Depthバッファというのは、3Dオブジェクトによる奥行きの情報です。
これがクリアされてしまうため、2DやUIは3Dオブジェクトよりも常に手前に描かれるようになるかと思います。
ただ、ほとんどのUIや2Dオブジェクトは、デフォルトではそもそも「奥にあったら隠れる」という処理をしないため、影響がないと思います。
パーティクルを使っている場合だけ気にする必要があるかもしれません。


tatsu...@gmail.com

unread,
Jan 5, 2018, 2:09:51 AM1/5/18
to 宴ユーザーグループ
返答ありがとうございます。
上記であればおおむね問題なさそうですのでこのまま進めたいと思います。
重ね重ねありがとうございました。
Reply all
Reply to author
Forward
0 new messages