NowLoading...

NowLoading
  1. ホーム
  2. 技術備忘録
  3. Unityで画像を綺麗に表示させたい2023

Unity

  • facebook
  • twitter
  • line
  • hatena
  • pocket

Unityで画像を綺麗に表示させたい2023

2019年の記事でunityで画像をきれいに出力する方法として、マスクシェーダーでアルファなし画像をトリミングして表示させるというのをご紹介しましたが 「Unityで画像を綺麗に表示させたい」 その後、unityも端末も画像圧縮技術が進化し、以前とは少し状況が変わってきたようなので、改めてunity(iOS/Android)における画像圧縮に関して考えてみます。

進化した圧縮技術

記事を書いた当時、2019年頃はiphoneXが発売されてまだ間もない頃でiphone6~8端末のシェアが多く、画像圧縮形式はiOSではPVRTCが、AndroidではETCという形式が主流でした。
現在もunityのデフォルト設定ではiOSがPVRTC、AndroidはETC2.0に設定されているようです(verによる)。

高画質のTruecolorは容量が非常に大きくスマホゲームには不向き。
PVRTCの場合、アルファ(透過)を持つ画像はunityに組み込むと画像がひどく劣化し、ETCではアルファが持てないため、透過なしの画像をマスク処理する方法が、当時は軽量かつ綺麗に画像を出力できる現実的な方法で、2DUIで画像を使用するにはかなり工夫が必要な時代でした。 PYRTC
しかしunityがサポートする画像の種類も多様化し圧縮技術も進化してきたため、最近のunityでは以前ほど面倒な手順を踏まなくても、綺麗で軽い2D画像を扱うことができるようになってきました。
最近のスマホアプリ開発で主流となっているのが、扱いも容易く軽量な“ASTC”という画像圧縮形式です。

ASTC

ASTC形式は2012年頃からある比較的古い形式でunityでもサポートされていましたが、PVRTCに比べると容量が大きいため、導入するには当時はまだ扱いの難しい形式でした。
圧縮技術の進化により、現在ではPVRTCよりも綺麗で軽量になっています。
Developers「Android App Bundle のテクスチャ圧縮形式をターゲット設定する」 UWA「ASTC テクスチャ圧縮形式の紹介」

Androidでは依然ETC

ASTCはiphone6以降A8プロセッサーでサポートされるようになったので、現在市場に流通しているiphoneはほぼASTCを使えるといえますが、Androidではまだ一部の端末ではサポートが追い付いていない状況なので、画像フォーマットの基本はETCが一般的なようです。
しかし、2019年時点の記事ではETC1.0が一般的でアルファを持てませんでしたが、現在はETC2.0に移行しており、こちらはアルファを持てるうえ、画像の劣化も少ないのでASTC同様Androidでもマスク処理の心配をすることはなさそうです。

圧倒的に軽く、綺麗になったASTC

ASTCはアルファを持てるので、PVRTCのようなマスク処理の必要がありません。
アルファを持った状態でUnityに組み込んだ場合の比較画像がこちら↓

比較画像
画像サイズ: 512×512 形式: ASTC
Unity設定
FilterMode: Point(NoFilter)
Quality: HighQuality

比較 512×512の画像で256KB。アルファを持った状態で圧縮もかかっているのに、この軽さです。
PVRTCではマスク画像と2枚持ちになるため、ASTCのほうがむしろ軽量。
画像の劣化もほとんど見られません。
ちなみにETC2.0のアルファ持ちでも同じく256KBで画質も同じです。

組み込み時の設定を高画質向けにしていますが、NormalQualityにしてもそれほど劣化しないので、Normalで十分かもしれません。
Normalでのファイルサイズは約115KBです。(512×512の場合)
テラシュールブログ「iOSでASTCフォーマットのテクスチャ圧縮を使う」

unityの新パッキングシステムSpriteAtlas

unity2017までのunityでデフォルトだった画像パッキング機能のspritepacker。(2020.1以降は非推奨)
当時のunityが持つ圧縮形式に準拠していたので、画像を綺麗にしようとすると容量が増えるし、容量を抑えようとすると画像が劣化するし、
パッキング結果がコントロールできないため、スプライトのスライス位置がズレたり、予期せずアトラスサイズが大きくなったりと、非常に扱いづらい機能でした。

unity2017から標準機能として搭載された新しいunityのパッキングシステム「SpriteAtlas」はASTC/ETC2.0をサポートしていることもあり、画質は綺麗で軽量。

Atlas化したいフォルダを丸ごと指定したり、spriteを個別に追加したり、マージン設定やグラフィックのクオリティを指定したりと、spritepackerの時には難しかったパッキング結果をコントロールすることもある程度できるようになりました。 【渋谷ホトトギス通信】「SpriteをパックするSpriteAtlasの使い方」


2023年時点では一部のAndroid端末がASTCに対応していないこともあり、Overrideで設定していなければ、unityの画像フォーマットはデフォルトで iOSでPVRTC、AndroidでETC2.0となっており、現在のunity開発ではこの設定が主流なようです。
詳しくはunityのフォーラムをご覧ください。 推奨、デフォルト、およびサポートされているテクスチャ形式 (プラットフォーム別)
ASTCがiOS/Androidで統一化されるのか、また新しい圧縮技術が登場するのか、unity(スマホアプリ)開発における2D画像の悩みは絶えませんね。

関連記事

もっと見る

技術備忘録 でよく読まれている記事

人気記事TOP10