さけのさかなのブログ

同人ゲーム開発やってます。Unity使ったりする。

Material Icons

fonts.google.com

Googleはアプリ向けにアイコン画像を配布している。ライセンスはApache License Version 2.0。

ゲーム開発でも使い道がありそうで、ぱっと見た感じこのへんがよさげ。

Settings f:id:enuenupi:20210831204927p:plain

Language f:id:enuenupi:20210831204828p:plain

Lock f:id:enuenupi:20210831204843p:plain f:id:enuenupi:20210831204442p:plain

Menu f:id:enuenupi:20210831204259p:plain

Radio Button f:id:enuenupi:20210831204157p:plain f:id:enuenupi:20210831204212p:plain

Toggle f:id:enuenupi:20210831204230p:plain f:id:enuenupi:20210831204244p:plain

Arrow Back f:id:enuenupi:20210831204314p:plain

Close f:id:enuenupi:20210831204330p:plain

ゲーム用だとColorをWhiteにしてダウンロードすると使いやすい。

アセットバンドル備忘録

//キャッシュファイルのパス設定
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…となるんだけど、これがそのまま使うにはだいぶしんどい。まずラップしないとやってられない。

というわけでそのためのクラスを作った。

github.com

細かい機能はない。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 にログインして「ツールとリンク」セクションから「会社情報の確認と編集」をクリックし、「支払いの保留」を見つけてください。 弊社からの支払いを保留するためのしきい値を選択するドロップダウンメニューがあります。

partner.steamgames.com

InputActionの各種コールバック購読をIDisposableで扱う拡張メソッド

InputActionのperformedstartedcanceledコールバックはマルチキャストっぽいインターフェースになっており、+演算子Action追加、-演算子で削除を行うようになっている。

inputAction.performed += _ => {};

このままでは使いづらいので作ったのがこの拡張メソッド。IDisposableが返ってくるので、あとはUniRxに任せてAddToで解放するなりなんなり。

inputAction
    .SubscribePerform(_ => { })
    .AddTo(this)

コード

github.com

【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 SchemebindingGroupに対応している。これはおそらく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);

参考

gamedev65535.com

inoookov.hatenablog.com

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する。

参考

ufcpp.net