p_chinのおっぱいブログ

UnityとPerlなど

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

ファイル演算子便利

 

unity

Object.DestroyImmediate


MiniJSONのOverflowException

  • PerseするJSON文字列の構文のどこかをtypoしてる場合に起こる

Bounds構造体

 

c#

c#のusingについて


call non-staic method from static


列挙体やarrayで特定の要素が有るか調べたいとき

  • Collectionの中が昇順降順に並び替えられてる場合のみ,System.Array.BinarySearch使った方が速い
  • 比較する候補が300個くらいあるならBinarySearchかなという感じだけど
  • 5こしかないならContainsでいいきはする
  • 比較回数5回も比較できねーよ! BinarySearchで3回の比較になるぜ! みたいな感じ
  • 他にはIList.Countains使うのが分かりやすいかも

.bundleファイルについて

 

shell

shellのxargs


[zsh]Ctrl+wで直前の/までバックスペース

 

AFXファイルとは

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と、丁度使いたいフォーマットにも対応してた