Unity

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 { //...…

スクリプトの実行順序をスクリプトから指定する

Unity で Awake や Update の実行順序をプログラム(スクリプト)から指定する方法の紹介です。 確認環境 この記事は以下環境で確認しています。 Unity 2021.2.5f1 Editor 上で確認 実行順序の設定 通常 Unity の コンポーネントのメソッドの実行順は不定で…

【C#】デリゲートの引数は呼び方でパフォーマンスが違う

引数がデリゲートのメソッドは呼び出し方がいくつかあります。書き方でコンパイラが展開する方法が異なるります。このため一部実行コストやパフォーマンスにも差が出るようなのでまとめてみました。 確認環境 この記事は以下環境で確認しています。 VisualSt…

UnityHub3.0.0のプロキシ関係の不具合

2022-01-25 2022年1月24日に修正版がリリースされ問題は解消されましたました。 以下古い情報です。 2022年1月22日現在、UnityHub 3.0.0 は環境変数に「HTTP_PROXY」が設定されていると一部の環境で真っ黒な画面が表示されて何も反応しません。 こんな感じで…

URP+2DRendererで画面の一部に綺麗なブラーをかける

いわゆるすりガラス効果みたいな感じで URP + 2D Renderer で画面の一部にきれいなブラーをかける方法です。 前回以下の記事で URP の 2D Renderer でも画面の一部にモザイクやブラーをかける紹介をしましたがブラーの見栄えが良くなかったので今回はガウシ…

UIのImage(Graphic)のスクリーン座標を取得する

タイトルの通りですが、以下の記事で紹介されいたコードを元に作成しています。 hacchi-man.hatenablog.com 確認環 Unity 2021.2.5f1 VisualStudoo 2019 Windows 10 実装コード UI 要素の四隅を GetWorldCorners で取得するのは同じですが、基本的に RectTra…

URP+2DRendererで画面の一部にモザイクやブラーをかける

URP + 2DRenderer にすると _OpaqueueTexutre が利用できない(設定しても画像が設定されない)ため旧来の GrabPass を使用したレンダリング結果に対して効果をつけることが直接はできませんでした。旧来、対処法として RenderTexture を使用した実装などで…

【Unity】実行中だけCanvasをOverlayにする

はじめに Unity の Canvas は特に画面に追従する必要がない場合 Screen Space Overlay にすることが多いと思いますが、Overlay って実際のゲーム画面と比べてサイズが大きすぎて「ゲーム画面を見ながら UI の調整をしたい」みたいなときに少し扱いづらいので…

背景を除外してRectTransformの範囲をファイルに保存する

Canvas 内の RectTransform の範囲を背景を無視して切り取って画像に保存する手順です。かなり限定的な状況となりますが uGUI の Image などを子要素に持つ RectTransform を表示されている内容で保存することができます。 まずサブカメラを作成 → RenderTex…