【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
もウカツに使うとアカンという話でもあり。
こわいね
国内リリースでは機嫌よく動いてたゲームが海外に出すと動かん、みたいなのはこういうところが原因だったり。
続き
【Unity】UIをキーボードから操作するサンプル
UnityUIのボタンやらをキーボードで操作するサンプルプロジェクト。動画の前半はマウスで、後半はキーボードで操作している。https://t.co/QBPndoJgu8#gamedev pic.twitter.com/xIu8ziI8dS
— enu@C97火南モ06b (@_enu) 2019年12月1日
なんかの拍子に「マウスとキーボード両対応したい」みたいになった時にウチはこんなのを組んでますというやつ。
別にそんなん要らん…という場合でも、「右クリックを閉じるボタンに割り当てる」というのも仕組みとしては同じなので、組んでおくとわりと操作性がよくなったりします。
大まかな仕組みとしては、たとえばEnterキーが押されたらUI表示を上から順に探し、キーがバインドされてるボタンが見つかったらInvoke
するという感じ(ざっくり)。実際はさらに方向キーによるカーソル移動やらUIのリンク処理やらメンドクサイあれこれを書いてやる必要がある。
CursorControllerUtil.cs
あたりの書き殴り感がひどいのでアレですが、あの辺こそが秘伝ソース的奥儀的だったりするわけだ。(そのうち綺麗に書けるようになったりしろ)
というか、なんか似たようなことをしてくれる既存アセットはないんすか。
何かと思ったらslackの通知音が入っとる
— enu@C97火南モ06b (@_enu) 2019年12月1日
【Unity】アツマールにUnityWebGLをアップロードするときの画面サイズ対応
やること
UnityWebGLビルドをRPGアツマールにアップロードした場合、そのままだと画面サイズが固定になってスマホで遊べない。のでその対応。
index.htmlの書き換え
bodyタグを以下のようにする。0.75というのがアスペクト比4:3の数値。
<body> <div id="unityContainer" style="width: 100%; height: calc(100vw * 0.75);"></div> </body>
参考
[css]アスペクト比を固定して可変させる方法 ~よく見る75%ってなに!?~|blog(スワブロ) | スワローインキュベート
前記事
【Unity】RPGアツマール対応
やること
UnityでつくったゲームをRPGアツマールに対応させる。
使ったUnityのバージョンは2019.3.0f1。
成果物
0.ググれ
すでにネット上に記事があるので、「Unity アツマール」とかでググりましょう。
1.最小構成 まずは動かす
WebGLでビルドし、zipにまとめてアップロードすれば動いてくれる。
アツマールではzip内にあるindex.html
が表示される。
ちなみにアツマール標準サイズである816x624は微妙に4:3からずれているので注意。
2.機能対応 ニコニコのコメント
まず結論。以下のようなコードを用意する。
Assets/Niconico.cs
using System.Collections; using System.Collections.Generic; using System.Runtime.InteropServices; using UnityEngine; // https://atsumaru.github.io/api-references/comment/ // https://docs.unity3d.com/ja/current/Manual/webgl-interactingwithbrowserscripting.html namespace TSKT { #if !UNITY_EDITOR && UNITY_WEBGL public static class Niconico { [DllImport("__Internal")] public static extern void ChangeScene(string str); [DllImport("__Internal")] public static extern void ResetAndChangeScene(string str); [DllImport("__Internal")] public static extern void PushContextFactor(string str); [DllImport("__Internal")] public static extern void PushMinorContext(); [DllImport("__Internal")] public static extern void SetContext(string str); } #else public static class Niconico { public static void ChangeScene(string str) { Debug.Log("ChangeScene : " + str); } public static void ResetAndChangeScene(string str) { Debug.Log("ResetAndChangeScene : " + str); } public static void PushContextFactor(string str) { Debug.Log("PushContextFactor : " + str); } public static void PushMinorContext() { Debug.Log("PushMinorContext"); } public static void SetContext(string str) { Debug.Log("SetContext : " + str); } } #endif }
Assets/Plugins/Niconico.jslib
mergeInto(LibraryManager.library, { ChangeScene: function (str) { window.RPGAtsumaru.comment.changeScene(Pointer_stringify(str)); }, ResetAndChangeScene: function (str) { window.RPGAtsumaru.comment.resetAndChangeScene(Pointer_stringify(str)) }, PushContextFactor: function (str) { window.RPGAtsumaru.comment.pushContextFactor(Pointer_stringify(str)) }, PushMinorContext: function () { window.RPGAtsumaru.comment.pushMinorContext() }, SetContext: function (str) { window.RPGAtsumaru.comment.setContext(Pointer_stringify(str)) }, });
使い方
コメントを流したいタイミングでいい感じにChangeScene
やPushContextFactor
、PushContextFactor
を呼べば良い。例えばBattleシーンに入ったらChangeScene("Battle")
といった具合。
おおざっぱに言うと、状態が一致するときに打ち込まれたコメントが画面に流れることになる。どうすればいい感じにコメントが流れるかはゲームの設計に依るので、アツマールのリファレンスを読み込んで考えよう。
ツクールMVの実装にあわせるなら、マップの移動でChangeScene(マップid)
、セリフの表示でPushContextFactor(セリフid)
といった具合か。
ちなみにPushContextFactor
とPushMinorContext
はサーバーアクセスが発生しないっぽいのでこの二つは気軽に呼んでよさそう。
どういうコードなのか
UnityWebGLからjsの関数を呼ぶためのあれこれ。以下を参照。
docs.unity3d.com atsumaru.github.io
課題
スマホ対応
そもそもUnityWebGLがスマホ非対応で警告が出る。が、警告を無視すると動いてくれたりする。画面サイズがおかしなことになる。
ほかのAPI対応
優先順位が高そうなのはスコアボードあたりか。
つづき
デジゲー博2019参加します・直前告知
17日に秋葉原です。スペースはC-18a
開発中ゲーム展示
8月にやったメガビット版と内容はあんまり変わらないですが、デモ用ステージが遊べます。
立ち絵ができてきたのでキャラが表示されたりします。
折本頒布
開発中ゲームの内容を小出しにした感じの折本です。なんと今回はペーパーではなく4Pの折本、れっきとした同人誌だ。
過去作頒布
Steamカードの頒布です。
MagicScrollTactics 1000円、Ethanol in Dungeon 300円。セールで買ったほうが安いな!
リンク
【Unity】押したら凹むボタン
結局Animationじゃなくてスクリプトで書くことにする、押したら凹むボタン pic.twitter.com/ngoZbMKZsV
— enu@C97火南モ06b (@_enu) 2019年11月11日
凹むっつってもスケールを小さくするだけですが。
ボタンの押下時アニメーションはデフォルトだとColorTintなんだけど、少し複雑なことをさせようとするとAnimation
でやれよ、という作りになっている。が、Animation
はメンドクサイ。できるだけ使いたくない。
というわけでコードで動かすことにする。
UniTaskやTweenパッケージに依存するのでコードをコピペすれば一発で動くというわけではないんだけど、中身としてはOnPointerUp
とOnPointerDown
が発火してるだけなので似たようなものはすぐ作れるんじゃないでしょうか。