2020年のこと
去年振り返り
やること
MST
去年に海外のSwitchで出せて一区切りついた……んだけど、実はまだやることが残ってたりする。というわけで今年はまずそれだ。そのうちなんか出せると思います。
次作品
なんやかんやで伸び伸びになってますね! この時点で難産なんですが。がんばる。
出すとすればまずはSteamアーリーアクセスになると思います。そこでバグ対応しつつ翻訳対応して正式リリースの流れかなあ。
(それはそれとしてさっさとストアページは作ろう つくりたい)
裏方
去年はあんまりなんもできてないなーみたいな感じなんですが、見えないところでちょこちょこ動いてたりします。
開発に全速を出すのも一つのやり方だとは思うんですが、そうではなくもうちょい防御的に、見えてる爆弾を片づけたり。とにかく即死しないように布石を置いてみたりだ。
というわけで去年に仕込んでおいたものを今年は回収していこう。まあ見えないんですが。
イベント
コミケとかのイベントで何をやるか?というのは、すっかりWebが主戦場になった当サークルではずっと課題なんですが、冬コミでMSTの小説本を書いてみて、こういうのでもいいかなあ。とか思ってみたり。
リリース済み作品関連で何か出す感じ。アクスタとか……アクスタとか
GitHub
去年の後半ぐらいからなんですが、UnityPackageという形でリポジトリをちょいちょい公開しています。まあ基本的に自分用なんですけど(複数プロジェクトでモジュール共有しようとするとこうなる)、コード公開は良い文化なので今年もやっていく。
欲を言えば他の開発者の役に立てれば良いんですが、ドキュメントなりサンプルなりを用意せえという話なのでメンドクササが倍増し、まあでも今年は欲をかいてその辺を目標にやっていきましょう。
【Unity】音まわりパッケージ
ナニコレ
そろそろ音まわりの処理が共通化できそうだなーということでやってみる。
とはいえ音に関してはこだわったことをしたことがないので、機能は必要最低限という感じ。FPSなんか作るともう少し演出的にやるべきことができるんだろうけど…。
リポジトリ
機能
- BGMのフェードアウトつき遷移
- BGMアセットの読み込み先切り替え(アセットバンドル or 内部アセット)
- ただし、アセットバンドル版だと起動時に全部読み込んでメモリに乗せるというゴリ押しの実装になっている。
- というのもロード処理に関してはハードの影響をモロに受けるので、ベストプラクティスな書き方がないように見える。なのでとりあえずはロード時間が問題にならない方式を用意しておいた。
- ロード処理はある程度アプリ側で書けるようにしてある。
IMusicStore
を実装すればいい。
- ただし、アセットバンドル版だと起動時に全部読み込んでメモリに乗せるというゴリ押しの実装になっている。
- 効果音同時再生の抑制
- 同じ音が大量に同じフレームに鳴って潰れる、みたいなのを回避する。
- ちょっとした工夫として、使い終わった音声ファイルは(設定されていれば)
AudioClip.UnloadAudioData
を呼んで使用メモリを減らすようにしている。
TODO
これまで作ったパッケージの機能を網羅するサンプルプロジェクトがあればいいかなあ。
コミケ97のこと・直前版
サークルスペース
火南モ06b オートリ電子
頒布物
- MagicScrollTactics小説本。4Pの折本です。新刊。無料。
- 次回作紹介折本。デジゲー博で頒布したやつです。無料
- Steamカード
というギリギリな感じですがなんとか新刊があります。
コミケ97のこと
サークル参加です。
場所
火南モ06b オートリ電子
カット
頒布物
- デジゲー博で頒布した折本(無料)。次回作について書かれてたりするやつです。
- あともうひとつぐらい新規で出したいんですがまだ準備中。めどが立ったら書きます。
【Unity】Googleスプレッドシートの値を取得する・2
やること
非公開設定のスプレッドシートからセルの内容を読み込む
環境:Unity2019.2.17、UniTask、Utf8Json
参考:前の記事
手順
1. クライアントID、クライアントシークレット発行
GoogleCloudPlatformでクライアントIDとクライアントシークレットを作る
2.コード
async void Start() { // リフレッシュトークンがない場合は認証してリフレッシュトークンを取得し、保存しておく var client = "クライアントId"; var secret = "クライアントシークレット"; var scope = "https://www.googleapis.com/auth/spreadsheets.readonly"; var refreshToken = await GoogleApi.RequestRefreshToken(scope, client, secret); // リフレッシュトークンからアクセストークンを取得 var accessToken = await GoogleApi.RequestAccessToken(refreshToken.refresh_token, client, secret); // スプレッドシート取得 var sheetId = "シートId"; var sheet = await GoogleApis.SpreadSheet.LoadByAccessTokenAsync(accessToken.access_token, sheetId, "シート1"); Debug.Log(sheet.JsonString); }
リフレッシュトークンを保存する際には暗号化をかけておきましょう。
Windows環境のみ対応。スマホアプリの場合、認証処理はリダイレクト処理をURIスキーマ経由にすることでうまくいく(はず)。Macは知らない
ひっかかりどころ
認証時に警告が出たりします。
リポジトリ
参考
【Unity】雑にUtf8Json
Utf8JsonでDictionary<string, object>
とかをガッとシリアライズできるようにします。
初期化
Utf8Json.Resolvers.CompositeResolver.RegisterAndSetAsDefault( new[] { Utf8Json.Formatters.PrimitiveObjectFormatter.Default }, new[] { Utf8Json.Resolvers.GeneratedResolver.Instance, // 作ってないなら要らない Utf8Json.Resolvers.BuiltinResolver.Instance, Utf8Json.Resolvers.DynamicGenericResolver.Instance });
バグ
現在のunitypackage(1.3.7)にはバグがあります。
たとえばこんなコード。
var obj = new Dictionary<string, object> { {"hoge", new [] { 1, 2, 3 } } }; var jsonString = Utf8Json.JsonSerializer.ToJsonString(obj); Debug.Log(jsonString); // -> {"hoge":[123]}
Json文字列の配列にカンマが抜けてますね。
↓の修正を反映しましょう。
何が雑かというと
コードジェネレータ使えっていう話ではあるんだけど、一方こういう使い方も許容されてますよという話ですね。
【Unity】古いMiniJsonは使うな
以下のコードでバグがでる。
System.Globalization.CultureInfo.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo("fr-FR"); var dict = new Dictionary<string, object>(); dict["hoge"] = 1.5f; var jsonString = MiniJSON.Json.Serialize(dict); // {"hoge":1,5} 不正なJson文字列が吐き出されて MiniJSON.Json.Deserialize(jsonString); // 解釈に失敗。エラー!
CurrentCulture
なんていじらねーよ!と思うかもしれませんが、OSがフランス語設定だと同じ現象が起こります。
原因
小数点表記がカルチャ依存になっていることに由来する。
フランス語圏においては小数点はカンマでなので、MiniJsonはそれにひっぱられて↑のコードだと{"hoge":1,5}
というJsonを吐き出す。
一方でJsonの規格は小数点をドットで統一しているので、このJson文字列は不正なものとなる。なんとMiniJson自身でも解釈に失敗する。
対応
どうしてもというなら、修正版があってこっちでは直ってるっぽい。 github.com
(CurrentCultureをインバリアントカルチャにいちいち設定してやる、というのは思いつくんですが、スレッドごとの指定だとか、影響範囲がわからん、とかでリスキーかと)
ついでに
float.Parse
やfloat.ToString
もウカツに使うとアカンという話でもあり。
こわいね
国内リリースでは機嫌よく動いてたゲームが海外に出すと動かん、みたいなのはこういうところが原因だったり。