Unity

【UniRx】MessageBrokerの使い方

UniRx に付属しているプロセス内の簡易型の広域メッセージ送受信ライブラリのMessageBroker の使い方の紹介です。 最近は MessageBroker の代わりによりモダンな MessagePipe というライブラリもリリースされていますが、Unity で単一シーン、簡単な UI しか…

【UniRx】MessageBrokerを拡張する

UniRx に付属しているプロセス内の簡易型の広域メッセージ送受信ライブラリのMessageBroker をちょっと拡張してみようと思います。 拡張内容 (1) pub/sub は型指定したい (2) 直接 Subscribe したい (3) MessageBroker には触らないで拡張する 確認環境 Unit…

【Unity】タッチ処理の実装(エディタ、実機両対応)

【Unity】スマホとPCの両方のタッチに対応する PCのクリックとスマホのタッチだと実は検出の実装方法が違うとのことで調べてみました。スマホ向けアプリを製作していてエディター上で動作確認しているシーンを想定しています。 // ★PC // 左クリックが押し込…

【C#】MagicOnion(gRPC)+IPC通信

タイトルの通り gRPC のライブラリである MagicOnion を使いつつ IPC(プロセス間) 通信したいと思います。 ちなみに、MagicOnion を使うと WCF を使った RPC の API 呼び出しのワークフローと極めて似た感じで実装できるようになります。特に proto からの型…

Odinでオプションが有効(or 無効)の時だけメニューを表示する

Unity の Editor 拡張が簡単にできる有料アセット「Odin Inspector and Serializer」で、ある bool 型の変数値が true(or false) の時だけインスペクターに表示されるメニューの作成方法です。 以下のスクリプトをオブジェクトにアタッチします。 using Sire…

【Unity】Vector3(構造体)に自分自身の値を変更する拡張メソッドを定義する

Unity の Vector3 (Vector2 など構造体)に自分自身を書き換える処理を追加する拡張メソッドの定義方法の紹介です。 前提として以下のように Vector3 に拡張メソッドを定義して値を変更しようとしても値は変わらない事を確認します。 public static class Vec…

【Unity】StreamingAssetsからデータを読み取る

Unity の StreamingAssets に置いたファイルを読み取る実装例です。 Android と WebGL は特別な処理が必要だそうで UnityWebRequest を使ってデータを読み取るようです。それ以外のプラットフォーム(iOS, Windows, デバッグ中のエディタ上)では普通にファ…

【Unity】パララックス(多重スクロール)を実装する

Unityの2Dの表現で視差の効果を使ったパララックスのスクロール(Parallax)を実装例を紹介したいと思います。かつてレトロゲームの背景スクロールでよくありましたね。 この表現方法は、スクロールの速度が奥のほうがゆっくりで手前ほど早くスクロールする…

JAN,FEB/MAR... 英語の月の略語

英語で各月の略号は3文字の短い形式があります。 以下表の通り各月は3文字の大文字で表されます。 月 英略 英 01月 JAN January 02月 FEB February 03月 MAR March 04月 APR April 05月 MAY May 06月 JUN June 07月 JUL July 08月 AUG August 09月 SEP Septe…

ObservableCollectionの要素の変更通知を受け取る

ObservableCollection でコレクションに格納されている要素の変更通知を受け取る方法です。 単純に Add されたときに要素に PropertyChanged を設定するだけでは全く考慮が足りないため現実的に子要素から通知を受け取る実装を考えたいと思います。 確認環境…

ObservableCollectionの変更イベントの挙動を確認する

ObservableCollection は List に似た機能を持ってるクラスで、要素を追加したり削除したときにイベントが発生する機能を持つクラスです。この発生するイベントは、WPF とか UWP みたいな XAML 環境は MVVM が標準でサポートされているので、各コントロール…

【C#】リフレクションでオブジェクトの値を列挙する

C# のリフレクションという機能を使用して任意の型の内容、public なフィールドとプロパティをすべて列挙してみようと思います。 リフレクションを使用するので、特定の型のメンバーを認識したうえでフィールドやプロパティの名前を指定して列挙するのではな…

【C#】SQLiteでクエリー結果の列名を取得する

SQLを発行した結果の列名を取得する方法です。 DbDataRecordからSchemaInfoを取得して列名と型を取得しようと思います。 C#でSQLをダイレクトに実行する場合、コネクションを取得しコマンドを発行した後、SqliteDataReader で結果を読み取るのが一般的です。…

【C#】ファイルダウンロード時の連番のファイル名を作成する

よくブラウザでファイルをダウンロードしたときに既にそのファイルがあった場合、末尾に(1)、(2)...という風に連番が付いた別のファイルが作成されます。 // こんな風に連番が自動的に作成される Sample.zip Sample (1).zip Sample (2).zip これを C# で同じ…

【C#】再帰構造を別の再帰構造に変換する

あるオブジェクトが自分自身をメンバーに持つ、子要素を無限に繰り返して持てる構造を再帰構造とか再帰データと言います。 // 自分自身をメンバーにもつ構造 ClassA + ClassA + ClassA + null // 終端はnull こういう再帰構造をもつオブジェクトを別の再帰構…

【C#】ZipArchiveでフォルダを扱う

.NET の Zip を扱うための ZipArchive クラスってファイルを zip に追加するための「CreateEntryFromFile」はありますが、フォルダを扱う「CreateEntryFromDireocty」みたいな操作はありません。 普通に使用したらすぐ必要になるので、ZipArchive でフォルダ…

明示的なインターフェイスの実装の使いどころ

C# には「明示的なインターフェースの実装」という言語仕様があります。 使い方 使い方はシンプルに以下の通り。 同じメソッドを持つ複数のインターフェースの実装を別々に実装することができます。 // 同じ名前を持つ2つのインターフェース public interfac…

【2022年10月】Unity2021.3のおすすめ安定バージョン

2022-10-07 2022年10月07日現在、Unity 2021 は 2021.3.11f1 まで出ていますが、なんか不具合があったりしてどのバージョンがベストか考えることがあったので所感を書いておきます。 結論は、2021.3.5f1 がベストです。 以下の不具合が回避できたほうがいい…

【C#】TimeSpanの書式指定方法

System.TimeSpan 型の書式指定の方法です。 DateTime 型とは ToString の書式の指定が異なるので同じ感覚で記述すると以下の「System.FormatException」が発生します。 // こんな感じのエラーが出る 'span.ToString(@"dd\d\a\y mm\:ss\.fff")' は型 'System.…

【Unity】ゲーム画面を1秒に1回画像として保存する

Unity でゲーム画面を1秒に1回撮影して画像として保存する方法の紹介です。 本記事は、開発中の Editor の GameView 表示を一定時間ごとに画面のスクリーンショットを連続で自動撮影して保存したい、のような場合にどうすればよいのかの紹介です。 撮影には…

TweenCancelBehaviourの指定ごとの挙動

DOTween + UniTask 環境で ToUniTask に渡す TweenCancelBehaviour の識別子ごとの挙動の説明です。 前提として、DOTween を UniTask で await するときに挙動を指定する ToUniTask メソッドには TweenCancelBehaviour を渡すことでキャンセル時の挙動を指定…

【C#/Unity】A*(A-Star)で経路探索を実装する

Unity の場合、3D, 2D ともに NavMesh とエージェントを使用すれば経路探索を自力で実装する機会はないかもしれませんが、経路探索をA*(A-Star)というアルゴリズムを自分で実装する場合の考え方と実装の紹介をしたいと思います。 グリッドベースの A* の経路…

【DOTween/UniTask】Forgetした後にDestroyすると警告が出る

急にDestroyすると警告が出る 解決方法 AsyncWaitForCompletionは使用しないこと UniTask + DOTween で UniTask を Forget した後、そのメソッド内でゲームオブジェクトを触ってる最中にゲームオブジェクトを Destroy すると警告が出る対応方法です。限定的…

【Unity】スクリプトを変更するたびにコンパイルが走らないようにする

Unity を使用中にエディタでスクリプトを編集 → 保存すると Unity 上でスクリプトのコンパイルが実行され、その都度作業が中断されるのを防止する設定です。 スクリプトのコンパイルが走ると画面右下のチェックマークが回転するプログレスに変化して Unity …

【C#】INIファイルを読み書きする(DllImportなし)

INI ファイルを C# で読み書きするために DllImport で Windows の User32.dll 使うのは確かに簡単ですが汎用性に欠けると思うので、純粋な C# のみかつ、.NET 4.6 くらいからコピペで使えるライブラリを作成してみました。 ライブラリの性能 確認環境 形式…

【C#】TypeCodeを使った高速な型判定を行う?

ライブラリなどの比較的低レイヤー寄りの実装をしていると受け取った、ジェネリックな型や、object 型で受け取った変数がどの型なのかを判定するケースがありますが、タイトルの通り TypeCode を使うと Type を使った判定より、効率的かつ高速な処理にできる…

【Unity】2D用のNavMeshでTimeMap以外の領域や障害物をベイクする

2D 用の NavMesh の導入方法とタイルマップへの適用方法は記事がいくつかあるので、導入~タイルマップに適用するまでは比較的簡単にできると思います。ただ、実際にトップダウン系のゲームなどで使用する場合、障害物を設置したり経路を動的に足したりでき…

【Unity】2Dゲームでプレイヤーがオブジェクトに回り込んだ時にシルエットを表示する

トップダウンやクォータービューなどの見下ろし型の2Dゲームで、プレイヤーの操作キャラクター(もしくは敵キャラなど)が、高さのあるオブジェクトの後ろに回り込んだ時にオブジェクトに隠れて見えなくなった時、どこに居るのかが分からなくなってしまう事…

【C#】2つのキーを管理するDictionary

よく2つのキーを持つ Dictionary が必要になるときがありますが以下のように Dictionary を2重にすると「管理が面倒」「後から見たときに意味が分からない」など技術的負債になりがちです。 // 2つのキーで管理したいのでDictionaryを2重に宣言する pribate …

Dispose呼び出しを簡潔に書く

IDisposable を継承しているクラスは使い終わったら Dispose メソッドを呼び出して破棄を明示しますが using 構文の外で開放したい場合も using 構文を使って簡単に開放できます。 // こんなクラスがあったときに public class Sample : IDisposable { //...…