はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】インクリメントを筆頭にした値の増減をInterlockedを用いてマルチスレッドに対応する

C#

はじめに 実はマルチスレッドでは値のインクリメントは正しく動作しない可能性があります。 // 正しく動作しない再現 const int Count = 100; var tks = new Task[Count]; var semaphore = new SemaphoreSlim(0, Count); var value = 0; // SemaphoreSlimを…

【Unity】ContentSizeFitterとLayoutGroupを利用してScrollViewの縦(横)スクロールを実装する

はじめに 今回は以下のGifのような縦(VerticalとHorizontalを入れ替えれば横)スクロールのScroll Viewの実装してみようという記事になります。 実際に動作させている様子 やり方 Hierarchy上で右クリックをし、UI > Scroll Viewを選択します。 Scroll Viewを…

【雑記】技術ブログに急にポエムを投稿してしまうような、生き恥を晒せる大人になりたい

創作活動と羞恥心は常に隣り合わせだと思う はじめに 最後に技術系以外の記事をこのブログに投稿したのはいつか、もはや自分でも覚えていません。かなり形骸化してしまっていますが、このブログは一応雑記ブログという位置付けだったりします。話は変わりま…

【Unity】TypeCacheを用いて"特定の属性でマークされている型やメソッド" や "特定のクラスやインターフェイスから派生する型"に素早くアクセスする

はじめに 今回はTypeCacheを用いて"特定の属性でマークされた型の一覧"や”特定のクラスやインターフェースから派生する型"をリフレクションよりも高速に取得する方法について紹介したいと思います。docs.unity3d.com はじめに 概要 使い方 TypeCache.GetFiel…

【Unity】UI Toolkitの公式ドキュメントのGetting Startedをやったメモ

はじめに 今回は新しいUIシステムであるUI Toolkitについて取り上げたいと思います。 今回作るUIこの記事は以下のUI Toolkitの導入記事の自分向けの備忘録になります。見づらいですし、公式ドキュメントを見た方が正確な情報が書いてありますのであしからず…

【Unity】UI ToolkitのVisualElement.Query<T>とVisualElement.Q<T>の違いについて

はじめに UI ToolkitではVisual TreeからVisualElementを検索するためにUQueryを利用しますが、クエリメソッドとしてQとQueryがあります。今回はその違いについて取り上げたいと思います。 はじめに 概要 詳細 概要 Queryは該当する全てのVisualElementの情…

【Unity】UI ToolkitにてC#スクリプトからStylesを適応する

はじめに 今回はUI ToolkitのVisualElementに対してC#スクリプトからスタイルを適応する方法について紹介したいと思います。 はじめに やり方 VisualElement.styleを利用する Unity style sheet(USS)を追加する 参考 やり方 VisualElement.styleを利用する V…

【C#】C#12から登場したInterceptorsを利用してコンパイル時に実行するメソッドを置き換える(主にSourceGeneratorと組み合わせる)

C#

はじめに C#12から登場したInterceptorsというコンパイル時に実行するメソッドを置き換えられる機能について紹介したいと思います。github.comただしまだ実験的な機能なので、変更される可能性もありますし情報もまだそこまで出てきていません。注意してくだ…

【C#】System.Text.Jsonの「JsonDocumentとJsonElement」を利用して固定したSchemaがないJsonに対してデシリアライズを行う方法

C#

はじめに 今回はSystem.Text.Jsonを用いてSchemaが変わる可能性があるようなJsonをデシリアライズする方法について紹介したいと思います。www.nuget.org↓利用される場面 逆シリアル化する型がない 受信した JSON に固定スキーマがなく、含まれている内容を確…

【C#】System.Text.Jsonで直接UTF-8バイト配列にシリアライズ & UTF-8バイト配列からデシリアライズする方法

C#

はじめに 今回はSystem.Text.Jsonを利用して直接UTF-8バイト配列にシリアライズ & UTF-8バイト配列からデシリアライズする方法を紹介したいと思います。また公式ドキュメントには文字列ベースのメソッド(UTF-16)を使用するよりもUTF-8バイト配列のシリアル化…

【C#】GenericのFullNameを実際のコードに埋め込みできるよう変換する方法(T4の実行時テンプレート, Raw String Literal)

C#

はじめに 例えばRaw String Literal(もしくはT4の実行時テンプレート)を利用して、.csの生成をしようとします。 using System.Text; namespace SampleConsole { internal class Program { public static void Main() { // C#11より登場した生文字列リテラル …

【C#】dotnet-t4を用いてT4テンプレートをコマンドラインから処理する

C#

はじめに 今回はdotnet-t4について取り上げたいと思います。www.nuget.org はじめに 概要 インストール手順 .NET Core3.1のインストール dotnet-t4のインストール パスを通す 使い方 参考 概要 dotnet-t4はT4テンプレートをコマンドラインからファイル指定し…

【PowerShell, C#】MacにPowerShellをインストール, .NETの利用, VSCodeの拡張機能インストールをする方法

C#

はじめに 最近教えていただいたのですが、どうやらPowerShellは.NETの知識がそのまま使えるとの噂を聞きました。 PowerShell(パワーシェル)は、マイクロソフトが開発した拡張可能なコマンドラインインターフェイス (CLI) シェルおよびスクリプト言語である…

【Unity】UI Toolkitにて入れ子構造となっているデータをTreeViewで表現する方法(ファイルとディレクトリのような入れ子構造)

はじめに 今回はUI Toolkitにて以下の画像のような要素が入れ子になっているようなTreeViewを作成してみる記事になります。 動作させている様子↓TreeViewの公式ドキュメントの説明 docs.unity3d.comdocs.unity3d.com はじめに 概要 やり方 UXMLを記述する(UI…

【Rider】Riderで改行コード(CRLFとLFとCR)の設定方法(新規ファイル, 開いているファイル, 指定したファイル・ディレクトリ)

はじめに 今回はCRLF・LF・CRの違いとRiderでの設定方法について取り上げたいと思います。 はじめに 改行コード Riderでの設定方法 新規ファイルに対しての適応方法 現在開いているファイルに対して改行コードを変更する 指定したファイルやディレクトリ内の…

【Unity】PackageManager.Clientを利用してC#スクリプトを通してPackageManagerを操作する

はじめに 今回はPackageManagerのスクリプティングAPIについて取り上げたいと思います。docs.unity3d.com はじめに 概要 使い方 LogLevel Add AddAndRemove List Embed Remove Resolve 参考 概要 PackageManagerを操作するためにはPackageManager.Clientクラ…

【C#】浮動小数点をToString()するとCultureInfoによって出力が異なってしまう件

C#

はじめに 1.23f.ToString()のような浮動小数点のToStringを実行するとカルチャ(国/地域)によって表示が異なることに最近気がつきました。 // ja-JP Console.WriteLine(CultureInfo.CurrentCulture); // 1.23 Console.WriteLine(1.23f.ToString(CultureInfo.C…

【Unity, C#】System.Environment.GetCommandLineArgsとSystem.CommandLineを用いてコマンドライン引数にて配列を受け取る方法

はじめに 今回はUnityのコマンドライン引数にて配列を受け取る方法を紹介したいと思います。 // 「-- hoge aaa --hoge bbb --hoge ccc」もしくは「--hoge aaa bbb ccc」のようにコマンドライン引数を受け取れる $ /Applications/Unity/Hub/Editor/2022.3.8f1…

【Unity】公式パッケージ「Android Logcat」を利用してAndroidデバイスからのスタックトレースやログなどのメッセージをUnity Editorに表示する

はじめに 今回はAndroid端末からスタックトレースやログなどのメッセージをUnity Editorに表示することができる公式パッケージ「Android Logcat」を紹介したいと思います。 Android Logcatが動作している様子docs.unity3d.com はじめに 概要 環境 インストー…

【Unity】UnityアプリをAndroid実機で動作させ、Android Studioのlogcatを利用してログを確認する方法

はじめに UnityアプリをビルドしてAndroidでデバッグする際に、ログを調べたい場合もあるでしょう。そんなときにAndroid StudioのLogcatを利用することでログを確認することができます。 Logcatが動作している様子UnityEngineのDebug.Log等を確認している様…

【C#】.NET7より導入されたInt128 構造体とUInt128 構造体を用いて128ビット整数を活用する

C#

はじめに 今回は128ビット整数のInt128とUInt128について取り上げたいと思います。learn.microsoft.com learn.microsoft.com はじめに 概要 概要 128bitの整数(Int128・UInt128)が.NET7から導入されました。C#のバージョン的にはC# 11からのタイミングなはず…

【C#】C#11から登場した生文字列リテラル(Raw String Literal)を利用してT4の実行時テンプレートを脱却する

C#

はじめに 今回はC#11より登場した生文字列リテラル(Raw String Literal)を紹介したいと思います。 // サンプル public static void Main() { var name = "Hanachiru"; // C#11より登場した生文字列リテラル (T4の実行時テンプレートの移行先としてしばしば利…

【C#】メモリレイアウトを制御できるStructLayout &LayoutKind.Explicitを用いて別の型として解釈する(あとUnsafe.Asを利用した例も)

C#

はじめに 今回はStructLayoutとLayoutKind.Explicitを用いて指定したメモリ領域を別の型として解釈する方法について紹介したいと思います。 別の型として解釈する例(bool + byte + ushort => int) はじめに 別の型として解釈する StructLayoutとは Unsafe.As…

【Unity】Unity Package Manager(UPM)が認識する自作Packageを作成し、git経由でインストールできるまで整える

はじめに 今回は自作パッケージを作成しPackageManagerのAdd package from git URLからインストールできるようにする手法について紹介したいと思います。 実際にインストールしている様子 はじめに カスタムパッケージの作成 ファイル・フォルダを生成する …

【C#】オープンジェネリック型(Open Generic Types)とクローズジェネリック型(Closed Generic Types)の違いについて

C#

はじめに 今回はオープンジェネリック型(Open Generic Types)とクローズジェネリック型(Closed Generic Types)について取り上げたいと思います。 はじめに 概要 オープンジェネリック型 クローズジェネリック型 参考 概要 オープンジェネリック型(Open Gener…

【C#】ジェネリック型を構築するジェネリック型定義を取得・判定する(GetGenericTypeDefinition(), IsGenericTypeDefinition)

C#

はじめに 今回はジェネリック型を構築するジェネリック型定義を取得・判定する方法について紹介したいと思います。 System.Collections.Generic.Dictionary`2[System.String,System.Int32] Dictionary<string, int> ↓ // ジェネリック型定義 System.Collections.Generic.D</string,>…

【C#】C#11より実装されたUTF-8文字列リテラルを用いてUTF-8のbyte配列を生成する

C#

はじめに 今回はC#11より実装されたUTF-8文字列リテラルを紹介したいと思います。 // サンプル ReadOnlySpan<byte> span = "Hello"u8; var builder = new StringBuilder(); foreach (var c in span) { builder.Append(c.ToString("x")); builder.Append(", "); } /</byte>…

【Rider】InlineErrorという拡張機能を入れて警告やエラーメッセージをコードの右側に表示させる(常に表示されるので便利)

はじめに 今回はInlineErrorというRiderの拡張機能について紹介したいと思います。 実装に動作させている様子plugins.jetbrains.com はじめに 概要 インストール手順 概要 InlineErrorというRider拡張機能を利用することで、警告やエラーのメッセージをコー…

【C#】System.Diagnostics.ConditionalAttributeは「戻り値・outがあるとNG」で「ref・inはOK」である

C#

はじめに 今回はConditionalAttributeの制約について紹介をしたいと思います。 指定した条件付きコンパイル シンボルが定義されていない場合、メソッド呼び出しまたは属性を無視するようコンパイラに指示します。 learn.microsoft.com最近知ったのですが、以…

【C#】TypeConverter.ConvertFromStringメソッドを用いてstringからgenericな型にParseでき、C#11からはIParsable<TSelf>が使える

C#

はじめに 今回はTypeConverter.ConvertFromStringとC#11から導入されたIParsable<TSelf>を紹介したいと思います。learn.microsoft.comlearn.microsoft.com はじめに 概要 C#11以前 C#11以降 パフォーマンス的な話 概要 例えばstringからジェネリックのTの値にパース</tself>…