【Unity】Addressable Assets のロケーション変更

アセットのダウンロード先を実行時に変更したい場合あるよね・・
例えば、
開発サーバとか、ステージングサーバとか、本番サーバとか
それぞれのURLを指定したいわけです。

UnityのAddressable Assetsでは AddressableAssetsSettings に設定できますが、
LoadPathはビルドに決められています。

そこで、

Addressables.InternalIdTransformFunc

がドキュメントに書かれていました

使ってみた。

1.AddressableAssetSettings からProfileを開く
f:id:kou_yeung:20200416121227p:plain
2.RemoteLoadPath の URLを "BASE_URL" に指定
f:id:kou_yeung:20200416121240p:plain
3.BASE_URLの部分を上書き
gist.github.com

必要であればログイン時にサーバから BASE_URL を返してもらえば環境によって切り替えできます。

【Javascript】Date.today()

Javascript では現在の日時を取得するメソッドがあります。

Date.now()

C#DateTime.Today(時刻部分は 00:00:00)が欲しいので
書いてみた。

Date.today = function(){
    const res = new Date();
    // memo
    // from javascript 1.4
    // dateObj.setHours(hoursValue[, minutesValue[, secondsValue[, msValue]]])
    // before javascript 1.3 : https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/setHours
    res.setHours(0, 0, 0, 0);
    return res;
}

使い方

const today = Date.today();
console.log(today.toString()); // Wed Oct 30 2019 00:00:00 GMT+0900 (Japan Standard Time)

wandbox.org

ログインボーナスを実装するぞ!

【Cocos2d-JS】cc.loader の拡張

リソースデータAに自前のデータBを依存していて、
データAをプリロード時にデータBも一緒にプリロードしたいです。
データAをインスタンス化してからデータBをプリロードしてもいいですが、
処理が複雑になってしまうです。

あるいは、同時時複数リソースを使用するデータが、
毎回パスを構築してプリロードするのもコード量が増える。

どう対処するかと
cc.loaderのソースとにらめっこしたら
cc.loader.register(...) を発覚しました。

cc.loader.register

cc.loader.registerを使って特定の拡張子でカスタムローダーを登録できます

cc.loader.register(['ext'], {
  load: function (realUrl, url, resource, cb) {
    /*....*/
    cb(); // ロードが終わったらコールバックを実行します
  }
});

spine データには json / atlas / png 3つのファイルが必要です。
毎回この3つのファイルを配列して cc.loader.load してもいいですが、

.spine 拡張子を定義して一気にこの3つのファイルをロードする

cc.loader.register(['spine'], {
  load: function (realUrl, url, resource, cb) {
    let urls = [];
    urls.push(url.replace('.spine', '.atlas'));  // atlas
    urls.push(url.replace('.spine', '.png'));  // png
    urls.push(url.replace('.spine', '.json'));  // json
    cc.loader.load(urls , (error, datas)=>{
      // datas を使ってさらに依存しているデータを読み込む
      cb();
    });
  }
});

使い方

cc.loader.load("res/assets/model.spine");

このように *.spine 拡張子をロードする場合、
登録したカスタムローダーが実行され、
必要なデータがロードされます。

【Unity】Unity WebGLのIME入力

UnityのWebGL対応でIME入力はほぼ必要ですが
検索したら、大体以下の公式リポジトリにたどり着きます。
GitHub - unity3d-jp/WebGLNativeInputField: WebGLでIME入力を可能にします

実はこの対応はあまり好みではないです。
なぜなら
ブラウザのダイアログオーバーレイなどにしちゃうと
ゲームから離れシステムっぽくなってしまうです。
フォントも選択できないしね。


それで、UnityのWebGLIME入力プラグインを書きました。

サンプルページ
kou-yeung.mygamesonline.org

unitypackage

ダウンロード

使い方

上記のunitypackageをimportし、
InputFieldのGameObjectにWebGLInputをAddComponentするだけです。
面倒な設定など必要ありません。

【javascript】function.bind()でハマった。

タイトル通り、javascriptの function.bind()でハマった。

gist.github.com
[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ

function.bind() で、文字列を分岐しようとしていますが、
default に分岐してしまったのです。

原因は

thisArg として渡されるプリミティブ値はオブジェクトに変換されます

Function.prototype.bind() - JavaScript | MDN

それで、

switch文は厳密等価演算子 === を使用している比較する

switch - JavaScript | MDN

ということは、
String( "STR" ) === "STR" のように比較するため、
defaultに分岐しました。

// 1.  bind する時に パラメータとして渡して使うか
func.bind(null, str)();

// 2.  toString() を使う
switch(this.toString()) {...} 

で変更すれば正しく分岐されます。