Material Icons
アセットバンドル備忘録
//キャッシュファイルのパス設定 var cachePath = System.IO.Path.Combine(Application.persistentDataPath, "cache"); System.IO.Directory.CreateDirectory(cachePath); var cache = Caching.AddCache(cachePath); Caching.currentCacheForWriting = cache; // キャッシュの寿命設定 cache.expirationDelay = 200; var c = new CachedAssetBundle() { name = "key", hash = Hash128.Parse("hash128") }; UnityEngine.Networking.UnityWebRequestAssetBundle.GetAssetBundle("url", c);
OpenXMLのラッピング
ゲーム開発にExcelを使うケースは結構ある。
そこでOpenXML…となるんだけど、これがそのまま使うにはだいぶしんどい。まずラップしないとやってられない。
というわけでそのためのクラスを作った。
細かい機能はない。Excelからの読み出しはシーケンシャルにできればとりあえず足りる。(まずは全セルをコピーすれば良い)
ファイルの書き出し機能は一応あるものの、今まで必要になったことはないんよな。
usage
using var fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); using var document = SpreadsheetDocument.Open(fs, isEditable: false); var doc = new Bonn.Document(document); foreach (var sheet in doc.Sheets) { foreach (var cell in sheet.Cells()) { var c = cell.position.columnIndex; var r = cell.position.rowIndex; var value = cell.value; } }
ClosedXML使えばいいんじゃんという話ではあり。
個人開発者はSteamの最小収益額を目いっぱい大きく設定しろ
海外送金額はバカにならないぐらい高いので、負担を小さくするために下記のような機能がある。
Q. Steam 売上の受取額の大部分が銀行手数料で消えてしまいます。 支払額が一定額に達するまで支払いを保留することはできますか?
A. 収益がしきい値を超えるまで支払いの送金を行わないように、最小しきい値を選択できる機能を追加しました。 銀行手数料によって受取額が大幅に減少する場合があることを認識しています。
Steamworks にログインして「ツールとリンク」セクションから「会社情報の確認と編集」をクリックし、「支払いの保留」を見つけてください。 弊社からの支払いを保留するためのしきい値を選択するドロップダウンメニューがあります。
InputActionの各種コールバック購読をIDisposableで扱う拡張メソッド
【Unity】InputSystem使ってみた
導入するうえで検索しづらかった機能について。
コードで入力を受け付けたい : InputActionReference
実は自動生成クラスは不要で、インスペクタで参照設定すればできる。
[SerializeField] InputActionReference submit = default; void Start() { submit.ToInputAction().Enable(); } void Update() { if (submit.ToInputAction().triggered) { hogehoge } // 追記:ToInputAction()はactionプロパティでもいい if (submit.action.triggered) { fugafuga } }
ランタイムで挙動を切り替えたい : MaskByGroup
InputBiding.MaskByGroup
を使うことで、ControlScheme
ごとに有効/無効を設定することができる。(有効にするgroupを指定する)
渡す文字列はControl Scheme
のbindingGroup
に対応している。これはおそらくname
と等しい。inputactionsファイルを開くとjsonになっているので確認できる。
[SerializeField] InputActionAsset inputActionAsset = default; public void EnableKeyboard() { inputActionAsset.bindingMask = InputBinding.MaskByGroup("Keyboard"); } public void EnableGamepad() { inputActionAsset.bindingMask = InputBinding.MaskByGroup("Gamepad"); }
PS4コントローラを振動させたい
UnityEngine.InputSystem.Gamepad.current.SetMotorSpeeds(0.5f, 1f);
参考
Unityでnull許容参照型を使ってみた
Unityでもnull許容参照型。どう書くか好みの別れそうな部分があったので、個人的な方針。
Unity 2021.1.7f1。
1.どう有効にするか
コンパイラオプションでプロジェクト全体を有効にできるけど、それではアセットのコードなんかも影響して警告を出し始めるのでちょっとやってらんない。
対応
ファイルごとに#nullable enable
を書く方式でやります。(まあusing
だって毎回やってることですし。)
2.Unityのnullチェックでは警告が出る問題
UnityEngine.Object
のnullチェックはコンパイラが追えず、チェック後も警告が出てしまう。
対応
!
演算子を使う。
if (hoge) // Unityはnullチェックをこう書けるが { hoge.Piyo(); // 警告が出る。 } if (fuga) { fuga!.Piyo(); // !演算子を使えば警告は出ない。 }
3.Linqはちょっと不便なところがある
たとえばWhere
でnullチェックを行っても、null許容型が非nullになったりはしない。
ついでにToArray()
の戻り値はnull許容型。
対応
!
演算子を使う。
List<string?> list; var array1 = list.Where(_ => _ != null).ToArray(); //string?[]?型 var array2 = list.Where(_ => _ != null).Select(_ => _!).ToArray()!; //string[]型
4.GetComponentキャッシュ書き方
Text? text; Text Text => text ? text! : text = GetComponent<Text>();
5.SerializeField フィールドは非nullにするのが丸い
SerializeField
の配列やクラスはUnityの仕様上null
にならない。なので非null指定にしてしまうのがよさげ。
対応
default!
で初期化する。
[SerializeField] int[] array = default!; [SerializeField] int[] array = new int[0]; // これでも良い。 [SerializeField] int[] array = default; // これは警告がでる [SerializeField] int[]? array = default; // 警告はでないけど、せっかくだから非null指定したい。
6.SerializeField オブジェクト参照で非null指定したいケース
SerializeField
で参照しているコンポーネントなどがnullかどうかはユーザーの設定次第。よってnull許容にするのが自然。
なんだけど、値が入ってないとエラーにするしかないコアな部分なら、非null指定にしても支障はない。
対応
必須のフィールドなら非null指定にする。
// 動作に必要なフィールドは非nullにしてしまう [SerializeField] GameObject prefab = default!; // nullでも動くならnull許容型にする。 [SerializeField] AudioClip? sound = default;
7.ジェネリクスはどうしようもない場合がある
参照型か値型かの制限が要る。これはcsharpのバージョンアップを待つことになりそう。
対応
諦めて#nullable disable
する。