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 »

12月 282015
 

珍しくがっつりC++の話。

C++について勉強していて、未だにstatic_castとdynamic_castの挙動をよくわかってない感じだったので、実験して確認したことをまとめます。文章にするとめちゃ時間かかりますね・・・。

まず前提知識として、メモリレイアウトやらvtableやらRTTIやらの話をします。何故なら、おそらく多くの人がなんとなく以下の理解でいると思われ、その辺どうなっているかという話から始めないといけないためです。

  • dynamic_castは実行時に型チェックするから安全にダウンキャストできる。
  • static_castはコンパイル時に型チェックするが実行時に型チェックしないためダウンキャストが安全でない。

間違っちゃないんですが、もう少し突っ込んで理解して、正しい挙動を把握したいわけです。

とはいえ、私もオフィシャルなドキュメントを読んでいたりするわけではないので、ここに書くことも間違ってるかもという疑いを持って読んでください。間違ってたら指摘欲しいです。

特に断りがない限り、Visual Studio 2015でx86としてDebugビルドしてます。基本的にpublic継承の話しかしません。

Continue reading »

2月 212014
 

どうも。お久しぶりです。
色々と書きたいこと、やりたいこと、あるんですけども、なんだかんだで就活大変ですね。まあまあ頑張ってます。

それはともかくとして、今回はC++の話です。

とあるSDKがヘッダでusing namespace std;してるって話題を見まして、要は、名前空間を汚す(※)のって良くないよね行儀悪いよねということですよね。でも、名前空間の指定を省略できるようにすれば、冗長さがなくなって実装しやすいわけですから、グローバルな名前空間を汚さずにその恩恵を受けたいものです。たとえば、あるクラスがstd::vectorとかstd::stringとかメンバ変数に持っていたり、メンバ関数の引数や戻り値に持っていたりしたら、私は冗長に思うわけです。クラス定義の範囲でusing namespace(using指令)したいよねと。あるいは、クラス名を直接指定するusing宣言でもいい。しかし、どちらもクラス定義に書けないわけです。

という話題を投げたら、typedefでできる?って言われまして。あ、できるねと。テンプレート書いてる時ぐらいにしかtypedef使ってなかったので盲点になってました。せっかくなので、usingとtypedefを使ってみて、どんな違いがあるのか確めてみようと思いました。これが今回の内容になります。

※「名前空間を汚す」以外の言い回しが思いつきませんでした。ここでいう「名前空間」は、C++の言語機能である名前空間(namespace)ではなくて、一般的な意味での名前空間です。混乱させてたらごめんなさい。

Continue reading »

8月 162013
 

WordPressには色んなテーマがあるんですが、多すぎてお目当ての物を探すのには苦労します。そこらへんに転がってる野良テーマを使うとセキュリティ面で問題があるという話もあるし、公式に配布されているものを使うのが無難でしょう。タダだし、更新チェック効くし。そうして私が探した中で、唯一これだ!と思えたのが、現在使っている「Suffusion」です。

Suffusionはカスタマイズ項目が豊富なのですが、ほとんど手つけてないです。ヘッダの下にメニューバー追加したぐらいですかね。あとは直接コード書いてたりしてますが、それについてはあとで触れます。ともかく、ほとんどいじらなくていいぐらい完成度が高く気に入ってます。シンプルで見やすいのがいいんですよ。

WordPressは本体・テーマ・プラグインの最新版がないか自動でチェックしてくれます。Suffusionの開発は盛り上がってるみたいで、全然更新されなくて放置ということがないのも魅力だと思います。ただ、テーマを更新するとカスタマイズした項目がリセットされてしまいます。その度に設定し直すのはしんどいので、スマートな解決手段として、WordPressには子テーマというものが用意されています。

子テーマ(child theme)とは、ある既存のテーマを親として、親テーマの一部を書き換えたり、内容を追加したりすることができます。既存のテーマを拡張することになるので、一からテーマを作るより手間がかかりません。そして、親テーマに対するカスタマイズを子テーマとして切り出すことで、設定項目は子テーマとして管理されますから、親テーマを更新してもカスタマイズ内容が失われないわけです。便利ですね。なので、何らかのカスタマイズをしたいならば、子テーマで対応するのがいいでしょう。ということで、やったことをメモ書きの意味も兼ねてまとめます。

Continue reading »

Top