11月 142016
 

前回の記事「AndroidのpersistentDataPathがカオス」の続きです。

UnityでAndroidManifest.xmlを利用する方法のメモです。

前回の記事からの続き

※この節は前回の記事からの誘導なので、UnityでのAndroidManifest.xml利用方法を知りたいだけの人は読み飛ばしてください。

「外部」のアプリ固有パスにしかアクセスしないならば、Android 4.4(KitKat)以降は権限が不要ですが、それより前のバージョンも対象にする場合には、互換性のために権限を持たせることになるという話でした。しかし、これは無駄なので、特定のバージョン以降でその権限を要求しないようにする設定項目が追加されました。

ただ、やはりというか、残念なことにUnity側でそれを指定する設定は存在しないんですね。なので、もう少しAndroid側に寄って、自分で直接設定を書くことにしましょう。そのための手段ならUnityも提供しています。

Androidアプリの設定は、AndroidManifest.xmlというファイルにまとめられます。Unityから直接Androidアプリをビルドするときも、プロジェクトのルート直下に一時的に作られるTemp/StagingAreaディレクトリに、自動生成されたAndroidManifest.xmlがあることが確認できます。これだけ見ると、Androidプロジェクトを吐き出させて、AndroidManifest.xmlを編集してから、自前でAndroidのビルドを行わなければいけないようにも思えますが、そこまで不便ではありません。

これから任意のAndroidManifest.xmlをUnityで利用するための方法を説明していきます。

やりたいこと

WRITE_EXTERNAL_STORAGE権限を、Android 4.3以前では要求し、4.4以降では要求しない、という設定を指定したいです。

uses-permissionタグが権限を与える設定ですが、これの属性としてandroid:maxSdkVersionを与えてやればいいです。指定する値は、その権限が有効な最大APIレベルです。

上記記事にも書いてある通り、uses-sdkタグにも同名の属性がありますが、まったく別物なので、調べ物するときには気をつけてください。

WRITE_EXTERNAL_STORAGEをAndroid 4.4(API Level 19)より前のバージョンでのみ要求したい場合、API Level 18を最大として設定すればいいので、下記の設定をAndroidManifest.xmlに書きたいわけです。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />

Continue reading »

10月 112016
 
  • 2017/12/23
    • 記憶違いの部分があったのでAndroid 2.2の説明を修正。今更。
    • 変更が多くなったので若干記述を整理。
  • 2017/05/06
    • targetSdkVersionの決定方法が間違っていたので修正。
  • 2017/02/06
    • Unity 5.3.6での仕様変更について追記。
  • 2016/11/14
    • Android 4.4でのREAD_EXTERNAL_STORAGE対応、maxSdkVersionについて追記。
    • Android 6.0でのユーザによる権限の付け外しについて追記。
    • 掲載スクリプトの読み取り可能チェック処理でREAD_EXTERNAL_STORAGEを見ないように修正し、実行結果を更新。
    • 一部、誤植の修正。

Unityで外部ファイルにデータを読み書きするとき、普通Application.persistentDataPathを使うと思うのですが、AndroidだけpersistentDataPathの返すパスが権限によって変わります。

これドキュメントに書かなきゃいけない重要事項だと思うんですが、全く触れられていない・・・。

詳しいことはこれから説明していきますが、やりたいことによっては必要な追加権限があるにも関わらず、それを設定したときには、persistentDataPathはセーブデータの保存先として信用できないという衝撃的な問題が存在します。Unityのバージョンは5.3.4f1です。

但し、Unity 5.3.6でpersistentDataPathおよびtemporaryCachePathがAndroid 4.4(コードネーム:KitKat、API Level 19)以降、「外部」を指すよう仕様変更となったそうです(リリースノート)。また混乱することを・・・。いずれにせよ、AndroidでpersistentDataPathを利用することは推奨しません。

以下、死ぬほど長いまとめ書きましたので、覚悟してください。

Continue reading »

9月 042016
 

引き続きUnityの記事を書き溜めていたので放出。

Unityでシリアライズ可能なコレクションは、Listだけです。但し、当然ですが、型引数もシリアライズ可能型を指定してやる前提です。

C#のListはいわゆる配列リストってやつで、C++でいうvector、JavaでいうArrayListに相当します。C#にもArrayListは存在しますが、古い機能のため非ジェネリックです。

ともかく、Listは内部実装として配列を持つため、List<T>ならば、T型配列としてUnityがシリアライズしてくれるわけですね。Listだけシリアライズ可能なのはまあ納得です。

とはいえ、Listだけで事足りるかというと、LinkedList(連結リスト、線形リスト)やDictionary(ハッシュマップ)あたりは欲しい感じです。

ScriptableObjectやJsonUtilityでシリアライズ・デシリアライズするとき、ISerializationCallbackReceiverを実装していると、シリアライズ前、デシリアライズ後に決まったメソッドが呼ばれます。これを利用してコレクションをListに変換してシリアライズできます。公式ドキュメントでもこれを利用してDictionaryをシリアライズ・デシリアライズするサンプルが掲載されています。

※OnBeforeSerializeとOnAfterDeserializeを実装しますが、何故かOnBeforeSerializeに解説が集中しているのでそっちのリンクを掲載。

この場合、インスペクタを介したリアルタイムな編集はできませんが、永続化が目的ならばこれで十分でしょう。LinkedListやDictionaryをインスペクタで触れるようにするとむしろ怖い。

そんなこんなで、Unityで使用可能なC#のコレクションをISerializationCallbackReceiver実装クラスで一通りラップしてみたので、以下に公開します。

Continue reading »

9月 042016
 

(2017/10/14 EnumUtilの初期化を静的コンストラクタに変更。何故最初からそうしなかったのか)

なんだかんだUnityとの付き合いが多いので、メモがてらあんまりネット上で見なかったり見つけにくかったりする情報をまとめる感じで。

今回はenum型(列挙型、列挙体)のシリアライズについての話です。前回「C#のenumの使い方」の続きでもあります。本当は同じ日に仕上げるつもりでしたが、長くなったので分離しました。enumそのものの使い方は前回の記事にまとめておいたので、その知識は前提とします。

Continue reading »

8月 142016
 

仕事が忙しすぎて書きたかったネタが全然まとまらずに、技術関連の文章がまとまっていくアレ。

C#でのenumの使い方を簡単にまとめ。

私はWPFよりかは基本的にUnityでC#使ってます。Debug.Log()はUnityでのコンソール出力です。

public enum Type
{
    Invalid,
    A,
    B,
    C,
}

特に断りなければ、こんな定義のenum使ってると思ってください。

C#のenumは内部的には整数型です。値の割り当てを省略すれば、先頭では0が割り当てられ、以降は直前の定義に+1した値となります。C/C++でもおなじみのよくあるルールです。Javaはすっこんでいてください。

公式ドキュメントはこのあたり。言語機能そのものの説明はあまりしないので、詳しく知りたかったら自分で調べてねという感じで。

Continue reading »

8月 092012
 

色々書きたいことがあったんですが、今月は院試を控えていて暫く落ち着かないのでひとまず後回しにして、夏コミに関して宣伝を少々。

ゲーム制作サークル

明日から3日間に渡って夏コミが開催されますが、2日目、私のゲーム制作サークルも参加します。今回は2作目として新作を出します。1作目とそのサントラもあるよ。

2作目の位置付けとしては1作目の続編にあたり、ジャンルも同様に縦STGです。強力な弾消し攻撃を交えて能動的にガンガン攻めていくスタイルのゲーム性はそのままっていうか、むしろ追加システムでもっとアグレッシブなものになった気もします。
今回は制作に1作目よりも多い時間をかけることになりましたが、その分、1作目でできなかったことや至らなかったことを改善し、様々な付加機能も追加されました。前作を知る人からすれば、目に見えた進化に「おっ」となるはずです。演出やらアルゴリズムやら色々ね。

前作では私は主にドット絵やってましたが、今作ではボススクリプトがメインでした。Luaはシンプルで高速でコルーチンやクロージャも強力で楽しかったですね。できることが一気に増えました。
他に担当したのは、大部分のGUIデザイン(某弾幕STGっぽいって言われないようにしたり)とか、一部敵グラフィックや、その他雑用って感じですかね。ある事情で私は制作から外れていた期間も長かったのですが、その割には広い範囲には関わってたと言えるのかもしれません。

まあ、まあまあ、そんなわけで、時間はかかりましたが無事に2作目を出すことができますよ。やったー。

当日は足を運べないよーとか、宣伝遅くて気付かなかったとかいう方がいましたら委託販売もありますので、そっちも確認してみてください。買うとまではいかなくても、興味がありましたら体験版も公式サイトに置いていますので、遊んでみてください。

とにかく、詳細はサークル公式サイトを見ろってことだ!

Mercenary’s Blog
窓の杜 – 【週末ゲーム】第494回:同人ゲーム体験版特集 2012夏(※窓の杜様による体験版紹介記事)

ちなみに、当日(2日目)、サークルスペースに私は多分いません。

全く関係ないデュープリズムサークル

2日目は多分いませんが、1日目は何故か全く関係してない企画のお手伝いをしてます。o.sさんがラーメンおごってくれるそうですので、こっちも宣伝しておいてあげるか。

星霜を逆髪に戴きて

デュープリズムというゲームの同人誌やらアレンジCDを出すのかな?(←ちゃんと確認できてない)

デュープリズムは知人の間で度々名前の上がるゲームでしたので、私もずっと気にはしていて、これを機に(たまたま購入タイミングがかぶっただけですが)、夏コミまでにクリアしようということで、つい最近駆け足プレイでクリアしました。ついでに配信してましたし、その時の録画も全部残ってます。

USTREAM:wizaman/live:録画ビデオ、1 / 1 – 過去のライブ配信

何か1本まるごとゲーム配信したいなーと思っていたのと、そこそこ良いノートPCが手に入ったということもあり(ファンがややうるさいが)、ちょうどいい機会でした。今後も気まぐれになんかやるでしょう。

まあ、こっちはファンの創作なので、元の作品をまったく知らない人が興味持つことはないと思うのですが、そういうのもあるよということで、よろしくお願いします。

Top