unimgpicker-plusでプレイヤーにとっての課題を作れるようにする(その2)
その1でやろうと思ったことを進めていきます。
実際に出てくる時のサイズで画像を表示
AddImage.csにssImage(表示するimage)をもう一個追加する形で解決。
本来の敵のサイズとここで表示してるサイズ、微妙に違うんです。
UI側とオブジェクト側では参考にする寸法みたいなのが変わるのか…?
この微妙な違いは大して影響はないだろうと判断。特に調整はしないです。
読み込んだ画像を保存する
これをどうするか悩んでいましたが、やっと思いつきました。
取り込んだ画像を改めてpngとして保存して、自由に扱えるようにします。
これで端末から画像を消しちゃっても大丈夫。
取り込んだ画像はAddImage.csのTexture(Texture2D), Texture2(Sprite)に格納されているらしいです。
新しく保存ボタンを用意しました。押下すれば画像を保存するようにします。
Texture2の方を利用して画像を保存します。事前準備としてTexture2をstaticにして他のところでも使えるようにします。
ボタンに適用するスクリプトを用意するため、TaskMade.csを新規作成。
こちらのサイトを参考にして、課題のpngファイルを作成、保存するように書いていきます。
【Unity(C#)】テクスチャを画像データに変換して端末に保存、読み込み - Qiita
回りくどい事してんな…と思いつつ、このスクリプトをMainCameraにつけて、ボタンにイベントを割り当てて実行してみる。
保存した時は何も出てきませんが、Ctrl+Rで読み込み直せば…
やったぜ!!!
あとは画像の保存場所を考え直したり、複数の課題の画像を保存出来るように(今のままだと一枚だけしか保存されない)して実際に敵として倒せるようにしていきます。
複数の画像を保存出来るようにする
a_test.pngとして画像を保存する、としていたので一枚の画像しか生成されない状態になっています。
ファイル名に番号を含ませ、同じ番号のファイル名がある場合は次の番号で生成できるか確認する、という流れで複数の画像を保存出来るようにします。(いわゆる連番?)
コードとしてはこんな感じになりました。参考にしたサイト↓
C# フォルダ作成時、同名フォルダがあれば連番を振る - Qiita
これで保存ボタンを5回押してCtrl+Rしたら5個同じ画像が保存されます。
ちなみに、どれか一枚を削除してから、また画像を保存すると存在しない番号の中で最も若い番号が割り振られたファイル名で保存されます。
task2.pngを削除してからまた画像を保存するとtask2.pngとして新しく保存されました。
画像の保存場所作成(editor)
現在、生成した画像をImagesフォルダに保存しています。このフォルダには元々用意している課題の画像などがあるので、混じると面倒そうです。
まずは新しく自作課題専用のフォルダを作りたいと思います。
ImagesフォルダにYourTaskフォルダを作り、その中に画像を作成するように変更します。
以下のようにパスを変更しました。
自作課題を閲覧できるようにする
TaskMuseumシーンを新規作成し、生み出した課題を見れるようにします。
見た目はこんな感じにしました。
→を押せばタイトル画面に戻るようにします。
謎の幅広いテキストは、画像までのパスと何枚画像があるかを表示するために用意しました。(android端末で動作確認する時はDebug.Logが見えなくなるので…)
そしてcreate emptyでYourTaskparentを作成。子として自作課題画像を入れます。
以下、TaskMuseum.csのコードです。参考にしたサイト↓
PNGファイルを読み込んでTextureとして使う方法 | My note
YourTaskParadeという関数は実際のゲームで課題を表示する時とほぼ同じことをしているので、それをほぼコピーしています。Checktxt関連はパス表示のためです。
実行するとこんな感じになりました。
画像でかくね??ルンバがピーマンを食べてるみたいになりましたが、ちゃんと表示は出来ました。パスが一部変な表示になっていますが、とりあえずは問題なさそうだと確認。
画像の保存場所作成続き(android)、画像表示
このままでもandroid端末で動くんじゃないかと思ってBuild and Runして実機で動かしてみたんですがダメでした。
表示されない原因はパスが上手く通っていないからだろうと仮定し、ググっているとこんなサイトを発見。
【Unity(C#)】テクスチャを画像データに変換して端末に保存、読み込み - Qiita
したい事と似てる!保存しているところを引用すると、
Application.persistentDataPath
??こちらのサイトにも記載されていましたが、永続性のあるデータを保存するためのパスをこれで得られるみたいです。
こいつを組み込んでやってみよう。
追記した部分だけ抜き出したTaskMuseum.csのコードです。
#ifとか見慣れないやつも入れてみました。
これにより、エディタで動かしている場合の動き、androidで動かしている時の動き、のように条件付きで操作を変えられます。
UNITY_ANDROID
だけで条件分けしていない理由はこちらのサイトを見たためです。
【解決】#if UNITY_ANDROIDがPCでも実行される | ゲーム制作の骨(Tips)
引用すると、
Build SettingsでTarget PlatformをAndroidに切り替えている場合、エディタでの実行でも「UNITY_EDITOR」と「UNITY_ANDROID」2つのプラットフォーム情報を持つのを確認。
エディタとandroid端末は別の動きをしてほしいので、このように書いています。
画像を作成するシーンもこんな感じに追記してandroid端末で動かしてみると…
パスが表示されてるぞ!
画像も表示されてる!成功です。
次回やることリスト
次回はこのあたりをしようと思います。
- 自作画像のトリミング、リサイズ
- 敵として自作課題を登場、破壊する(ゲームに組み込む)
その3はこちら↓