読者です 読者をやめる 読者になる 読者になる

(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

Unityの仕様を無視して、画像をそのまま使おうという試み【Unity】

Unity

このエントリーをはてなブックマークに追加

この記事はUnity 2 Advent Calendar 2016の19日目の記事です。


この記事でのバージョン
Unity 5.4.1f1


はじめに

Unityの躓き所(?)の一つに画像の設定があります


f:id:kan_kikuchi:20161215132622j:plain


Formatだけでも多数あるし、設定項目も多岐にわたります。

しかも適切に設定しないと色が変になったり、アプリの容量が増えたり、

使用メモリが増えたりとなかなかの鬼門です。




そこで今回は、このUnityの仕様を無視して、画像を(擬似的に)使おうというそんな試み。


実装方法

仕様を無視して画像を使うと言っても画像をインポートしたら、自動的に設定されてしまうので、

画像をテキストに変換して、そのテキストをアプリに入れるという方法を使いました。

実際に画像を表示したい時は、テキストを画像に変換して使う、といった感じです。


f:id:kan_kikuchi:20161216121848g:plain


なお、画素値をそのまま並べてしまうと、容量がとんでもない事になってしまうので、

ある程度の圧縮はしています。

pngの圧縮方法で言う所のフィルタの処理がなく、圧縮だけしてる感じです。





TextToTexutreConverter

以下のコードがテキストと画像の相互変換を行うためのクラス、TextToTexutreConverterです。



実際の使い方は、以下のようにメソッドを実行するだけです。

//string(text)からTexture2Dを作成する
Texture2D texture2D = TextToTexutreConverter.TextToTexutre(text);
//Texture2D(texture2D)からstringを作成する
string text = TextToTexutreConverter.TexutreToText(texture2D);

/*
生成した文字列をテキストファイルとして書き出したい場合は以下の通り
(using UnityEditorとusing System.IOが必要)
*/

//書き出し(true=追記 false=上書き)
string exportPath = "Assets/" + texture2D.name + ".txt";
StreamWriter sw = new StreamWriter(exportPath, false);
sw.WriteLine(text);
sw.Flush();
sw.Close();

//更新
AssetDatabase.Refresh();


なお、変換するテクスチャは、Read/Write Enabledにチェックが入ってる必要があります。


f:id:kan_kikuchi:20161216112925j:plain


これで設定を気にせず、元の画像のまま使う事が出来ます!


おわりに

普通に画像を使った場合との比較は特にしませんでしたが、

true colorで使う場合よりは容量が軽くなりますが、

圧縮が半端なため、そもそもの画像より重いです。


また、画像生成にそこそこ時間がかかるため、

実用的かどうか各々で判断して頂ければ幸いです。


改良出来そうな所は多々あるので、

機を見てもうちょっと実用的なやつをそのうち作るかもしれません(:3っ)∋〜