LoginSignup
2
2

More than 5 years have passed since last update.

Unityのバージョン上げたら外部URLから取得した画像の表示がおかしくなったので直した。

Last updated at Posted at 2018-06-14

結論

UnityWebRequestTexture.GetTexture(url) を使えば治る。

経緯

1.
iOS/Android用ゲームを、Unity5.3からUnity2018.1に更新する際に
「外部サーバーから引っ張ってきた画像が、何故かUnity2018.1で異様に画質劣化する」
という現象が発生し何だこいつ、と思って調査。

2.
スマホ実機での画質劣化が判明。
Unity5.3とUnity2018.1をエディタ並べて比較調査してたところ、
300KBぐらいのpng画像がUnity2018では何故か400KBぐらいに容量膨れていることが発覚。

コルーチン内で new WWW(url) して www.texture で取得していただけだったので
特になにか加工していたわけでもなく「???」となる

3.
Unity公式リファレンスを見に行ったら、こっちが推奨されてた。
https://docs.unity3d.com/ja/current/ScriptReference/Networking.UnityWebRequestTexture.GetTexture.html

4.
差し替えてエディタで確認したところ普通に直った。
え、なんでWWWクラスの挙動変わってるんですかね、こわ……

あとがき

Unity2017系とかでもあったのかもしれないがそこは知らない。
とりあえず公式リファレンスを信じろ


補足

原因推察:

www.texture 勝手にミップマップ作って肥大化してた可能性あり。
WWWクラスじゃなくて、Texture2Dクラスの仕様変更??
まぁどちらにしろ面倒なんですけれどもね?

新バグ:

https://forum.unity.com/threads/assertion-failed-on-expression-m_instanceid-instanceid_none.466327/
UnityWebRequestTexture、ここの#7~#9で報告されてるバグと同じログのものが発生。
Unity2018.1.9f1のリリースノートでTexture2D修正が報告されてますけど、この件との関係どうなんですかね……

対応(元々バグ再現率は低いので、効果あるか不明):

先のフォーラム記事によると、
「シーン変更と画像取得のタイミングが重なると死ぬ(超意訳)」らしいので、
下記URL先を参考に、取得したバイト列から直接Texture2D作成しました。
https://qiita.com/r-ngtm/items/6cff25643a1a6ba82a6c

ミップマップが作成されると困るので、コンストラクタは下記の方を使用。
new Texture2D(width, height, TextureFormat.RGBA32, false)

TextureFormat.RGBA32については、
公式リファレンスでデフォルトがこれだと書いてあるのでそうしてます。
https://docs.unity3d.com/ScriptReference/Texture2D-ctor.html

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2