UnityのAssetBundleのCacheについて
Cacheしてくれる条件
- WWW.LoadFromCacheOrDownload(url, version);でurlに配信されているAssetBundleを取って来れるけど、どの条件でCacheを使うのか分からなかった。
- どうやら、AssetBundleのversionで指定した物が以前にDownLoad済みで、且つCacheもストレージに残ってる場合にのみ
どうやってAssetBundleのversionを決めるの?
- WWW.LoadFromCacheOrDownload してcacheをストレージに保存する時に、引数のversionを指定できる。
- サーバに置いているAssetBundleを更新した時に、versionをサーバから受け取れる様にして、それを引数に入れてloadする運用になると思う
まとめ
最初はBuildPipeline.BuildAssetBundleでversion指定出来るのかなって探したけど、違った
参考
xcodebuildコマンドを打つと/Developer/usr/bin/xcodebuild' (No such file or directory)と出る時
しかしwhich xcodebuildすると/usr/bin/xcodebuildにあるから意味分かんなかった。
対処法
なんかXcode.app以下のxcodebuildを見てるみたいなので、sudo xcode-select -switch /Applications/Xcode.app/Contents/Developerすれば、Developperディレクトリ以下のxcodebuldコマンドを観に行ってくれる
古いXcodeだと、Developper以下にxcodebuildを置いてしまうらしいので、xcode-selectで明示的に場所を指定しなきゃいけないっぽい。
参考
http://stackoverflow.com/questions/9849034/how-to-run-install-xcodebuild
StackOverFlowの英語読んだけど、間違ってたら教えて下さい
(5)先週の小さい技術メモを全部まとめた(perl,unity,c#)
perl
ファイル演算子便利
- http://www2u.biglobe.ne.jp/MAS/perl/ref/filetest.html
- 適切なファイル情報が引けるので、existなら-eに代用出来る
unity
Object.DestroyImmediate
- 該当のオブジェクトだけでなく、そのオブジェクトが参照してるAssetも削除してしまう(Prefabと参照関係にあったらとか
- http://www.wallflux.com/link/167184853341463/1346967861
MiniJSONのOverflowException
- PerseするJSON文字列の構文のどこかをtypoしてる場合に起こる
Bounds構造体
- http://www.wisdomsoft.jp/45.html
- 3D空間の範囲を指定する構造体。Rect構造体の3Dversion
c#
c#のusingについて
- 構文とディレクティブで効果が違う
- http://msdn.microsoft.com/ja-jp/library/yh598w02(v=vs.80).aspx
- http://msdn.microsoft.com/ja-jp/library/sf0df423(v=vs.80).aspx
- 構文の方は、明示的に必要なくなったらGCに破棄(Dispose)する様に指定出来る
call non-staic method from static
- http://stackoverflow.com/questions/6716450/call-non-static-method-from-static-method-c-sharp
- delegateから呼べばstaticMethodからnon-staticMethodを呼べた。
列挙体やarrayで特定の要素が有るか調べたいとき
- Collectionの中が昇順降順に並び替えられてる場合のみ,System.Array.BinarySearch使った方が速い
- 比較する候補が300個くらいあるならBinarySearchかなという感じだけど
- 5こしかないならContainsでいいきはする
- 比較回数5回も比較できねーよ! BinarySearchで3回の比較になるぜ! みたいな感じ
- 他にはIList.Countains使うのが分かりやすいかも
.bundleファイルについて
- macのパッケージングの仕組み、またはmacのshared libraryの名前
- 前述したリソースのパッケージに使っている場合もある
- OSXに入っているgccコンパイラには-sharedの代わりに-bundleがあるからshared library
- https://developer.apple.com/library/mac/#documentation/CoreFoundation/Conceptual/CFBundles/AboutBundles/AboutBundles.html#//apple_ref/doc/uid/10000123i-CH100-SW1
shell
shellのxargs
- git ls-files --deletedでdeleteされたファイルが取れるので
- git ls-files --deleted | xargs git rm見たいに、パイプで左辺の標準出力の結果を引数で渡せる
- http://x68000.q-e-d.net/~68user/unix/pickup?xargs
[zsh]Ctrl+wで直前の/までバックスペース
- WORDCHARS='*?_-.[]~=&;!#$%^(){}<>'
- 参考:tsakaの日記
AFXファイルとは
- AFXファイルは主にAuto FX Photo/Graphic Edges Imageで使用されるラスターイメージファイルです。
- 画像を加工する情報の設定ファイル的なやつっぽい
- http://www.autofx.com/products/pge_mac/gallery2.html
WebPlayerでtwitterの投稿ページを開く
twitterの投稿ページを投稿する文字指定して開く
というのを試して盛大にハマッたのでメモ。
結論としては、OpenURL
関数使うのが一番いい。
- jsとcsのURIエンコーディング問題
- OpenURL関数とExternalEval関数
- WebPlayerのデモ
jsとcsのURIエンコーディング問題
コードのファイルの文字コードに気をつけなければならない。
jsではUTF-8LEBOM
csではUTF-16LEBOM
でないと、WWW.EscapeURL("日本語文字列")
でエンコードしても、期待した表示が出来なかった。
jsは勝手に色々と良い感じにしてくれるっぽい感じ。
C#とJS混在してもいいって人はtweetするコードだけJSで書いちゃえば良いと思う。
OpenURL関数とExternalEval関数を比較
まず前提として、
OpenURL()
は引数に指定したURLをpcならデフォルトブラウザで、スマフォならアプリを選択して開く関数。
ExternalEval()
は、WebPlayerで再生中のページで引数で指定したJavaScript関数を呼び出す関数。そのためWebPlayerでしか使えない。
OpenURL()を使用した場合
これは、どのPlatformでも使える汎用的なものだが、WebPlayerでゲームが起動しているページからURLをロードしてしまうので、またゲームのページに戻るとUnityPlayerのロード画面からになってしまう。
Application.OpenURL("http://twitter.com/intent/tweet?text=" + WWW.EscapeURL(text));
ExternalEval()でwindow.location.hrefを実行
この場合は、OpenURLと同じく、WebPlayerのページからURLに飛んでしまう。 あと、何故かdropBoxにupして試してみると、日本語表示がおかしくなる。 デモ見ればそれが分かる
Application.ExternalEval("window.location.href = 'http://twitter.com/intent/tweet?text=" + text + "'");
ExternalEval()でwindow.openを実行
これをwindowサイズ指定で実行すると、ブラウザのポップアップブロックが作動して、手動でそれを許可しなければならない。 これは、例えばゲームをプレイしてる人がスコア情報などをtweetするのを妨害している様な物なので、つらい。 あと、何故かdropBoxにupして試してみると、日本語表示がおかしくなる。
Application.ExternalEval("window.open('http://twitter.com/intent/tweet?text = " + text + "','','width=500,height=400');");
WebPlayerのデモ
一応、英語と日本語で、上記の3種類の方法を試すデモ作ってみた。 何故かJSのメソッド実行してる方法は、日本語表示が全滅している、くそが。
デモ
perlで時間を固定するの処理で色々ハマった時のメモ
クライアントサイド(Unity)の時間依存の処理(2013-07-10〜2013-07-20までにログインしたら報酬プレゼントとか)のテストを書きたかったので、サーバの時間を固定する処理が欲しくて書いた時に悩む事が多かったのでメモ
BEGINEブロックでCORE::GLOBAL::timeなどをoverrideする
以下の様な空気感で、自作の関数を定義してコードリファレンスを代入する
package Fugu::FixedTime; sub time() { # 固定した時間のEpochTimeを返す処理 } sub gmtime(;$) { my $time = shift; # 引数に何も無かったら上のtime関数から参照する # $time = $time // Fugu..と同じ $time //= Fugu::FixedTime::time(); # 上のtime関数の返り値をbuilt-inのオリジナルのgmtime関数で計算する CORE::gmtime($time); } sub localtime(;$) { # ここも上のgmtime関数と同じノリで書く } BEGINE { *CORE::GLOBAL::time = \&Fugu::FIxedTime::time; # gmtime, localtimeも同じノリで代入しちゃう }
この処理の肝はEpochTimeの計算
- overrideしたFugu::FixedTime::gmtime, Fugu::FixedTime::localtimeは,Fugu::FixedTime::timeからEpochTimeを取得して値を計算しているので、Fugu::FixedTime::timeで適切な処理を行う必要が有る.
sub time() { # 固定したい時間の文字列を取得する処理を呼ぶ my $time_str = get_global_time(); # 固定時間を指定してなかったら素のtimeを返す return CORE::time unless $time_str; # TimeZoneを日本に指定 my $time_zone = '+0900'; # EpochTimeの計算だけなのでHttp::Date使う # (Time::PIece::Plus使いたかったけど、プロジェクト内のどこかで先に読み込まれてしまっていたので) return str2time($time_str . $time_zone); }
TIme系モジュールの挙動や読み込むタイミング
- Time系のモジュールは、built-inのtimeから時間を読んで、それをモジュール内のlocaltime関数に独自の処理を書いて、useされた時にExportしてるので、CORE::Globalをoverrideしてる訳じゃ無いらしい
- 自分の名前空間上にある関数をbuilt-inよりも先にperlは見てくれるらしいので、そのような事が出来る
Time::Piece::Plusでのtimezoneの修正
- strptime関数はGMTで計算してしまうので、「2013-07-07 10:00:00」をただ単に引数に渡しても、GMTの10時は日本の19時と解釈されるので、「2013-07-07 19:00:00」が返ってきてしまう。
Time::Piece::Plus->strptime('2013-07-07 10:00:00 +0900', '%Y-%m-%d %H:%M:%S %z')->epoch;
のようにやれば、timezone指定でstrptimeが出来る。
Http::DateでEpochTimeを計算した理由
- Time::Piece::Plusを使ってepoch timeを出していた
- もっと早いタイミングでTime::Piece::Plusが呼ばれてlocal timeが置き換わってしまったらしい。
その他メモ
COREとCORE::Global
- CORE::localtimeが元々のlocaltime
- CORE::Global::local timeが書き換えられるbuilt-in関数(local time呼ぶとこっちが参照される)
日付の比較
- Date::Time, Time::Piece:Plusでは日付のオブジェクト同士で"="などの比較が使える
- 実際のDBデータと比較する時はstrftimeで文字列に戻して比較してやる必要があった
built-in関数のtime(epochタイムの計算)にはHttp::Dateを使った
"1994-02-03 14:15:29 -0100" -- ISO 8601 format
と、丁度使いたいフォーマットにも対応してた