chevron_left

メインカテゴリーを選択しなおす

cancel
はなちる
フォロー
住所
未設定
出身
未設定
ブログ村参加

2020/03/05

arrow_drop_down
  • 【Unity】Unity SearchでApplication.dataPathなどのpublicなStatic APIメソッドとプロパティの結果をお手軽に調べる方法(api:)

    はじめに 今回はUnity Searchを利用して簡単にApplication.dataPathなどのpublicなStatic APIメソッドやプロパティを実行する方法を紹介したいと思います。docs.unity3d.com はじめに やり方 自前のStaticメソッドの実行 参考 やり方 Unity Editor上でCommand + K(Ctrl + K)を実行することでUnity Searchが立ち上がります。もしくはメニューバーからEdit > Search Allですね。 Unity Searchを立ち上げた様子上にある検索フィールドから検索クエリを入力することでアセットの検索など…

  • 【C#】string.FormatとDefaultInterpolatedStringHandlerで処理速度・GC.Allocの差を計測してみる(string.Formatはボックス化の可能性あり)

    はじめに 今回はstring.FormatとDefaultInterpolatedStringHandlerで処理速度・Allocationの優劣を調べてみようと思います。learn.microsoft.comlearn.microsoft.com結論から言うとDefaultInterpolatedStringHandlerが優秀です。(C#10から補完文字列(interpolated string)でも利用されだしているので当然ですが) はじめに string.Format DefaultInterpolatedStringHandler 計測結果まとめ 計測で利用したコード string.…

  • 【C#】.NET CLIの"dotnet tool restore"と".config/dotnet-tools.json"でローカルで使用するツールのバージョンを固定する(t4のバージョンをプロジェクトごとに固定したり)

    はじめに 今回はdotnet tool restoreとdotnet-tools.jsonを用いて"現在のディレクトリとサブディレクトリ"で使用するツールのバージョンを固定する方法を紹介したいと思います。↓ マニフェストファイル(.config/dotnet-tools.json)のサンプル { "version": 1, "isRoot": true, "tools": { "dotnet-t4": { "version": "2.2.1", "commands": [ "t4" ] } } } learn.microsoft.com はじめに 概要 マニフェストファイルの作成 インストール…

  • 【C#】System.Text.JsonのJsonNodeを用いてスキーマレスなJsonにプロパティを追加する方法

    はじめに 今回はSystem.Text.JsonでスキーマレスなJsonに対してプロパティを追加する方法を紹介したいと思います。learn.microsoft.com はじめに やり方 参考 やり方 JsonDocumentは読み取り専用なので、JsonDocumentではなくJsonNodeを用いることで容易に実現できます。learn.microsoft.com // どんなスキーマ定義されているかよく分からないJson string json = """ { "Age" : 20, "Name" : "John", "Friend" : { "School" : "Lucas" } } "…

  • 【Unity】Debug.LogなどのConsoleへのログ出力にハイパーリンクを埋め込む方法

    はじめに 今回はDebug.LogなどのConsoleへのログ出力にハイパーリンクを埋め込む方法を紹介したいと思います。 ハイパーリンクを埋め込んでいる様子 はじめに やり方 外部サイト Assets以下のファイル 該当コード 参考 やり方 外部サイト // 外部サイトを開くハイパーリンク埋め込み Debug.Log("Website: <a href=\"https://www.hanachiru-blog.com/\">website</a> "); 外部サイトへのハイパーリンク Assets以下のファイル // Assets/Scripts/Sample.csというスクリプトファイルの7…

  • 【Unity】「Diagnostic switches are active and may impact performance or degrade your user experience. Switches can be configured through the Diagnostics section in the Preferences window.」というエラーの対処法

    はじめに Unityエディタを開いていたら以下のようなエラーが出てきました。 Diagnostic switches are active and may impact performance or degrade your user experience. Switches can be configured through the Diagnostics section in the Preferences window. ProfileOpenCLJobs: False 出力されたエラーこの解決方法を書き残しておきたいと思います。 はじめに 対処法 参考 対処法 Preferenceを開…

  • 【Blazor】BlazorでASP.NET Coreを使用した最初のWebアプリをビルドする公式ドキュメントを読んだメモ①

    はじめに ふと興味本位でBlazorを触ってみようと思い、以下の公式のラーニングパスをやってみてます。 learn.microsoft.comそのときに学んだことをメモがてらに残しておきたいと思います。正直自分宛のメモなので、気になる方は公式のものをみてください。 はじめに ダウンロード&インストール アプリの作成 アプリを実行する カウンターの実装について コンポーネント データバインディングとイベント 制御フローを追加する イベントを処理する データバインディング TODOリスト作成 さいごに 参考 ダウンロード&インストール .NET 8 SDKがインストールされていることを確認してくだ…

  • 【GitHub Actions】ワークフローの入力(inputs)で"choiceというtype &options"を利用することで列挙型(enum)を利用することが可能になる

    はじめに 今回はGitHub Actionsのワークフローの入力に列挙型(enum)を利用する方法を紹介したいと思います。 実際に利用している様子 はじめに やり方 参考 やり方 choiceというtypeを利用し、入力の選択肢をoptionsに記載します。 name: Sample # workflow_dispatchによりワークフローを手動実行できるようにする on: workflow_dispatch: inputs: version: # typeをchoiceにすることで入力をoptionsで設定したものから選択できるようになる type: choice required: tru…

  • 【Unity】UnityEditor上でプロジェクト直下やPackagesやUserSettingsやLogsといったパスをPath.Combineで取得する(System.Environment.CurrentDirectoryを使ってはダメ)

    はじめに 今回はUnity Editor上でプロジェクト直下・Packages・UserSettings・Logsといったパスの取得方法を紹介したいと思います。 利用している様子 はじめに やり方 Application.dataPathについて やり方 以下はUnity Editor上での取得方法です。 // コメントはMac上での出力例になっています。 // Assets直下 : /Users/[UserName]/[ProjectName]/Assets Debug.Log(Application.dataPath); Debug.Log(Path.GetFullPath(Applica…

  • 【Unity】GameCIを用いてUnityのCI 環境をGitHub Actions上に構築し、Test Frameworkを実行&結果をアップロードする方法

    はじめに 今回はGameCIを用いてUnityのCI 環境をGitHub Actions上に構築し、Test Frameworkを実行&結果をアップロードする方法を紹介したいと思います。github.com具体的には以下の2つを紹介します。 GameCIを利用するための設定方法 TestFrameworkをGitHub Actions上で実行する方法 実行している様子 はじめに Unityライセンスを設定する Unityライセンス.ulfファイルをローカルマシーンから探す GitHubリポジトリの設定から設定する ワークフローの設定 .github/workflows上にyamlファイルを作成…

  • 【Unity】Unity公式パッケージ「Code Coverage」を利用してTest Frameworkのコードカバレッジを計測する

    はじめに 今回はUnity公式パッケージであるCode Coverageを利用してTest Frameworkで実行したテストのコードカバレッジを計測する方法を紹介したいと思います。docs.unity3d.com 実際に生成したレポート はじめに Code Coverageとは 概要 環境 インストール方法 セットアップ Code Coverage Windowについて Test Runnerでレポートを作成する Code Coverageとは Code Coverageとはテストで用いられるコードがどれだけ実行されたかを示す指標です。 コード網羅率(コードもうらりつ、英: Code cov…

  • 【C#】MS製のLoggingライブラリである「Microsoft.Extensions.Logging」の基礎的な使い方

    はじめに 前回messagetemplates-csharpというMessageTemplateを扱えるようにするライブラリを紹介しました。www.hanachiru-blog.com今回はMS製のMicrosoft.Extensions.LoggingというLoggingライブラリについて紹介したいと思います。(Microsoft.Extensions.LoggingはMessageTemplateに対応しています)github.com 利用している様子 はじめに 概要 環境 インストール Getting Started LoggerFactory.Create ILoggerFactory…

  • 【C#】「messagetemplates-csharp」を用いてC#でMessageTemplateを扱う

    はじめに 今回はmessagetemplates-csharpというC#用のMessageTemplateライブラリを紹介したいと思います。github.com はじめに 概要 MessageTemplateとは より詳細の設定 messagetemplates-csharp 概要 インストール方法 利用方法 詳細な仕様 さいごに 概要 MessageTemplateとは Unity公式のLoggingパッケージであるUnity Loggingなんかでも採用されているのですが、構造化ロギングを実現する際にMessageTemplateが利用されることがあります。www.hanachiru-bl…

  • 【Rider】Riderで「Low memory - The IDE is running low on memory and this might...」というエラーが表示されたときの対処法

    はじめに Riderを動作させていて以下のようなエラーが表示されました。 Low memoryというエラー Low memory The IDE is running low on memory and this might affect performance. Please consider increasing available heap. こちらの対処法について書きたいと思います。 はじめに 対処法 Rider上で行う方法 JetBrains Toolboxを用いた方法 対処法 Rider上で行う方法 メニューバーからヘルプ > メモリ設定を変更を選択します。 ヘルプ > メモリ設定…

  • 【Unity】ランタイムでEnvironment.CurrentDirectory(作業ディレクトリ)を変更できるが終了前にProject直下に戻さないとダメ

    はじめに System.Environment.CurrentDirectoryをランタイムで変更させられることに気づきました。そのことについて書きたいと思います。 変更している様子 はじめに 説明 説明 public class Sample : MonoBehaviour { private void Start() { // MacのUnity Editor上で動作された例 // /Users/user/ProjectName Debug.Log(Environment.CurrentDirectory); // /Users/user/ProjectName/Assets Debug.…

  • 【C#】C#7より追加された型によるswitch と C#8より追加された複数の値をまとめてswitchする 機能について

    はじめに 今回はC#7より追加された型によるswitch と C#8より追加された複数の値をまとめのswitchについて取り上げたいと思います。 はじめに 概要 型スイッチ 複数の値をまとめてswitchする 概要 型スイッチ C#7より型によるswitchができるようになりました。 static void Main(string[] args) { // int 1 TypeSwitch(1); // float 10 >= 0 TypeSwitch(10.0f); // float -5 < 0 TypeSwitch(-5.0f); } private static void TypeSw…

  • 【Rider】メソッドセパレーター(Method separators)を表示してメソッドを分かりやすく表示する

    はじめに 今回はRiderの機能の一つであるメソッドセパレーター(Method separator)を紹介したいと思います。pleiades.io メソッドセパレーターを表示している様子 はじめに 設定方法 結果 参考 設定方法 メニューバーからJetBrains Rider > Settings...を選択し設定ウィンドウを立ち上げ、エディター > 一般 > 外観のメソッドセパレーターを表示するにチェックを入れれば完了です。 メニューバーのJetBrains Rider > Settings...を選択するShow method separatorsをONにする 結果 メソッドの間に線が表示…

  • 【C#】Dictionary.Addとインデクサーによる要素の追加で挙動がどう異なるか(重複するキーの場合にArgumentExceptionか上書き)

    はじめに Dictionaryに要素を加える際に、Dictionary.Addとインデクサーによる要素追加で少し挙動が異なります。 Dictionary<string, int> dictionary = new Dictionary<string, int>(); // Dictionary<TKey,TValue>.Add(TKey, TValue) // 既存のキーを指定した場合にはエラー(System.ArgumentException)が出力される dictionary.Add("Sato", 1); // Dictionary<TKey,TValue>.Item[TKey] // …

  • 【Unity】UnityTestFramework上でパフォーマンス測定ができるPerformance Testing Packageの基礎的な使い方

    はじめに 今回はPerformance Testing PackageというUnity Test Framework向けのパフォーマンス計測機能を提供するパッケージを紹介したいと思います。 The Unity Performance Testing Package extends Unity Test Framework with performance testing capabilities. It provides an API and test case decorators for taking measurements/samples of Unity profiler marke…

  • 【Unity】Unity Test Frameworkで特定の例外がスローされることをAssertする方法(Assert.Throws, Assert.Catch, Throws.TypeOf, Throws.InstanceOf)

    はじめに 今回はUnity Test Frameworkでエラーのテストをする方法について紹介したいと思います。docs.nunit.org はじめに Assert.Throws Assert.Catch Assert.Thatを利用する 小ネタ Assert.Throws Assert.Throwsを利用することで特定の例外がスローされることをチェックすることができます。 The Assert.Throws method is pretty much in a class by itself. Rather than comparing values, it attempts to invo…

  • 【Unity】System.Text.Json v8.0.1をUnityで動かすまでの手順

    はじめに 今回はSystem.Text.Jsonのv8.0.1をUnityで動作させる手順について紹介したいと思います。またSystem.Text.JsonをUnityの型に対応させる記事を前に書いたので、気になる方はそちらもチェックしてみてください。 engineering.dena.com はじめに その前に 手順 nuget.orgからdllを取得する .dllをUnityにインポートする AssetLabelをつける その前に System.Text.JsonのバージョンはUnityのMicrosoft.CodeAnalysis.CSharpのバージョンに依存しています。System.…

  • 【Unity】ProjectWindowのエディタ拡張で色をつける際に色が暗くなってしまう問題の対処法

    はじめに EditorApplication.projectWindowItemOnGUIを利用することでProject Windowに色をつける事ができます。 public static class ProjectWindowColorizer { [InitializeOnLoadMethod] private static void Init() { EditorApplication.projectWindowItemOnGUI += OnGUI; } private static void OnGUI(string guid, Rect selectionRect) { var or…

  • 【Android】Macのターミナルにadbのパスを通す

    はじめに 今回はMacのターミナルにadbのパスを通す方法について紹介します。 動作している様子 はじめに やり方 adbのパスを調べる PATHを通す 動作確認 やり方 adbのパスを調べる adbはAndroid SDK Platform-Toolsパッケージの中に入っています。 adb は、Android SDK Platform-Tools パッケージに含まれています。このパッケージは SDK Manager を使ってダウンロードします。SDK Manager はこのパッケージを android_sdk/platform-tools/ にインストールします。スタンドアロンの Andro…

  • 【Unity】「Ignoring depth surface load action as it is memoryless」というエラーについて(Mac &MetalでScreenCapture.CaptureScreenshotを利用すると発生)

    はじめに Ignoring depth surface load action as it is memorylessというエラーについて備忘録の意味合いも兼ねて書き残しておきたいと思います。 Ignoring depth surface load action as it is memoryless エラーが出ている様子 はじめに 概要 参考 概要 どうやらMacOSかつMetal Graphic APIを利用しているときに出ているっぽいです。 I have found out that this warning is happening only on Mac and with Graph…

  • 【Unity】Unityが利用しているMicrosoft.CodeAnalysis.CSharpのバージョンの確認方法(Mac)

    はじめに 今回はUnityが利用しているMicrosoft.CodeAnalysis.CSharpのバージョンの確認方法を紹介したいと思います。Roslyn AnalyzerやSource Generatorを利用する場合はMicrosoft.CodeAnalysis.CSharpのバージョンによって利用できるバージョンが異なるため、結構重要です。 はじめに 確認方法 Microsoft.CodeAnalysis.CSharp.dllを見つける Riderで確認する方法 確認方法 Microsoft.CodeAnalysis.CSharp.dllを見つける UnityのバージョンによってMic…

  • 【Unity】エディタ拡張でスクリプトからテキストエディタを開く方法(InternalEditorUtility.OpenFileAtLineExternal)

    はじめに 今回はスクリプトからテキストエディタを開く方法について紹介をしたいと思います。 はじめに 概要 使い方 さいごに 概要 公式ドキュメントに記載はないのですが、UnityCsReference(中のコード)をみるとInternalEditorUtilityクラスなるものが定義されており、これを利用することでテキストエディタを開くことができます。 public static bool OpenFileAtLineExternal(string filename, int line) { if (!CodeEditor.Editor.CurrentCodeEditor.OpenProjec…

  • 【Unity】マネージプラグインのGeneral設定項目について(Auto Reference, Validate References)

    はじめに 今回はマネージプラグインのGeneral/Validate References設定項目について書きたいと思います。 マネージプラグインのGeneral はじめに その前に マネージプラグインとネイティブプラグイン プラグインのGeneral設定項目 Auto Referenceとは Validate Referencesとは その前に マネージプラグインとネイティブプラグイン Unityのプラグインにはマネージプラグインとネイティブプラグインの2種類があります。 マネージプラグイン : .dllにコンパイル済みの.NET アセンブリ ネイティブプラグイン : C、C++、Objec…

  • 【Unity】UnityWebRequestでBASIC認証をする方法

    はじめに 今回はUnityWebRequestでBASIC認証をする方法について紹介をしたいと思います。docs.unity3d.com はじめに 概要 実験 概要 UnityWebRequestにヘッダー情報を追加するためにはUnityWebRequest.SetRequestHeaderを利用します。 public void SetRequestHeader (string name, string value); HTTP リクエストヘッダーをカスタムの値にセットします。 Header keys and values must be valid according to HTTP pro…

  • 【Unity】コマンドラインからUnity Test Frameworkのテストを実行する

    はじめに 今回はコマンドラインからUnity Test Frameworkを実行する方法について紹介したいと思います。 はじめに やり方 -testResults -testPlatform さいごに やり方 まずはMacでEditorModeのテストをなるべくシンプルに実行してみたいと思います。UnityのバージョンがUnity2023.2.0b17なので以下のように記述していますが、適宜文字列を変えてください。あとプロジェクトパスも適宜変更してください。 $ /Applications/Unity/Hub/Editor/2023.2.0b17/Unity.app/Contents/MacO…

  • 【Unity】System.Text.JsonでUnityEngine.Colorのシリアライズ・デシリアライズに対応する

    はじめに 今回はUnityEngine.ColorをSystem.Text.Jsonでシリアライズ・デシリアライズできるようにする方法を紹介したいと思います。learn.microsoft.com はじめに 環境 概要 コード さいごに 環境 Unity2023.1.17f1 MacBook Pro 2023 16inch, Apple M2 Pro System.Text.Json v6.0.0-preview 概要 System.Text.Jsonでは リフレクション もしくは SourceGeneratorを用いたソース生成 の2種類によってシリアライズ・デシリアライズ時に利用するメタデ…

  • 【C#】パフォーマンス・バイナリサイズともに優れたシリアライザー「MessagePack for C#」の基礎的な使い方

    はじめに 今回はC#用のMessagePackシリアライザーであるMessagePack for C#の基礎的な使い方を紹介したいと思います。github.com はじめに 概要 環境 インストール方法 使い方 Keyのインデックスについて 配列かマップ(辞書)か シリアライズの前・デシリアライズの後に処理を挟む さいごに 概要 MessagePack for C#はハイパフォーマンスなMessagePackシリアライザーです。GitHubのReadmeにも記載されていますが、Json.NETは当然のことながら、protobuf-netやMsgPack-Cliよりもパフォーマンスやシリアライズ…

  • 【C#】Google.ProtoBufを利用してProtocol Buffersを扱う方法

    はじめに 先日protobuf-netの利用方法についての記事を書いたのですが、今回はGoogle製のライブラリGoogle.ProtoBugの利用方法について書きたいと思います。www.nuget.org github.com protobuf.dev はじめに 概要 サポート 環境 インストール方法 おまけ : Riderプラグインの導入 使い方 .protoの利用 シリアライズ・デシリアライズ 概要 Google.ProtoBufはC#用のProtocol Buffersランタイムライブラリです。github.com サポート .NET 4.5+ (net45) .NET Standar…

  • 【C#】protobuf-netという非公式ライブラリを利用してProtocolBuffersを扱う方法

    はじめに 今回はprotobuf-netというライブラリを利用して.NET上でprotocol buffersを扱う方法を紹介したいと思います。www.nuget.org github.com はじめに 概要 サポートされているバージョン 環境 インストール方法 Riderプラグインの導入 使い方 .protoを利用する 概要 protobuf-netはprotocol buffersのシリアライザーライブラリです。Google製ライブラリとしてGoogle.Protobufが挙げられますが、Unityで扱いづらいとの噂を聞いたことがあります(実際に試したわけではありません)。また後でここらへ…

  • 【2023年を振り返り】大学院修了したり、新社会人になったり、Googleにインタビューされたり

    はじめに 2024年始まりましたね。私にとっては2023年は人生の転換点的な一年になった気がします。毎年振り返り記事を書いていたので、今年もやっていきます。 www.hanachiru-blog.com はじめに 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 総評 2024年の目標 PS 1月 ホームページを作ったりしていました。 hanachiru.net作ったのはいいものの更新は結構サボってます。ゲーム開発周りで特筆できるような事が減っているとも捉えられるかもしれません。あとブログ記事でいくとCySharpさんのライブラリを中心に調べて回ったりしてました。 …

  • 【Git Fork, Command】git commit --amendで前回のコミットメッセージを修正する

    はじめに 今回はgit commit --amendを利用して前回のコミットメッセージを修正する方法について紹介したいと思います。 はじめに GitForkでのやり方 Amendを実行 Force Pushする コマンドの場合 また補足ではありますが複数のコミットメッセージを編集したい場合はRebaseを利用した方が良いでしょう。 GitForkでのやり方 Amendを実行 次の操作を行います。 Local Changesを選択し、下にあるAmendにチェックマークをいれる 修正後のコミットメッセージを入力する Amend Last Commitを選択する Amend Last Commitを…

  • 【ForkとCommand】rebase + squashを活用して複数のコミットを一つのコミットにまとめる方法

    はじめに 今回はGit Fork or Git Commandを利用しながら、rebase + squachを使って複数のコミットを一つのコミットにまとめる方法について紹介したいと思います。 コミットを一つにまとめる はじめに Git Forkでのやり方 rebaseするコミットを指定する まとめたいコミットをsquashに変更する force pushをする コマンドでのやり方 その前に git rebase -i コミットID HEADから遡るコミット数を指定する コミットIDを指定する ブランチ名を指定する pickをsquashに変更する Force Pushする 参考 Git For…

  • 【C#】SemaphoreSlimを用いて複数のスレッドでの処理を同時に開始させる方法(テストにも便利)

    はじめに 今回はSemaphoreSlimというリソースに同時にアクセスできるスレッドの数を制限できるクラスについて紹介したいと思います。learn.microsoft.com はじめに 概要 使い方 タイムアウトやCancellationToken 概要 SemaphoreSlimはリソースに同時にアクセスできるスレッド数を制限することができます。例えばテストコードで、同時アクセスした場合にのみ不具合が起きることの確認に使えたりできます。 リソースまたはリソースのプールに同時にアクセスできるスレッドの数を制限する Semaphore の軽量版を表します。 SemaphoreSlim クラス …

  • 【Unity】BuildOptions.CleanBuildCacheが有効かどうかをEditor.Logから見分ける方法

    はじめに 今回はBuildOptions.CleanBuildCacheが効いているどうかを判定する方法について紹介したいと思います。docs.unity3d.com www.hanachiru-blog.com はじめに 環境 概要 調べ方 環境 Unity 2022.3.8f1 概要 インクリメンタルビルドパイプラインを使用していると差分のみ再ビルドされるようになりますが、一部問題になるケースもあったりします。そこでスクリプトからビルドをする際にはBuildOptions.CleanBuildCacheを用いることで一度キャッシュを削除してからクリーンビルドを行うことができます。 Clea…

  • 【C#, Unity】Test FrameworkにてType判定するときのIs.TypeOfとIs.InstanceOfの挙動の違いについて

    はじめに 今回はNUnit.Framework.Is.TypeOfとNUnit.Framework.Is.InstanceOfで挙動が異なることについて書きたいと思います。 private abstract class HogeBase { } private class Hoge : HogeBase { } [Test] public void SampleTestSimplePasses() { Hoge hoge = new Hoge(); // Failed // Is.EqualToを利用したパターン (Tests exact type) Assert.That(hoge.GetT…

  • 【Unity】Object.FindObjectsOfTypeを高速化したObject.FindObjectsByTypeを用いてシーン中に存在する指定された型のオブジェクトを全て列挙する

    はじめに 今回はObject.FindObjectsByTypeを紹介したいと思います。docs.unity3d.com はじめに 対応バージョン 概要 利用例 参考 対応バージョン Unity 2020.3.4 or later Unity 2021.3.18 or later Unity 2022.2.5 or later 概要 Object.FindObjectsByTypeはシーン中に存在する指定された型のオブジェクトを全て列挙するメソッドです。以前はObject.FindObjectsOfTypeというメソッドがありましたがObsoleteとなり、Object.FindObjects…

  • 【Unity】gree/unity-webviewを用いてUnityでWebViewを実装する

    はじめに 今回はgree/unity-webviewというgreeがOSSとして公開しているWebViewをUnityアプリ上で表示するプラグインを紹介します。 unity-webview is a plugin for Unity 5 that overlays WebView components on Unity view. // DeepL翻訳 unity-webviewはUnityビューにWebViewコンポーネントをオーバーレイするUnity 5用のプラグインです。 WebViewを利用している様子 はじめに 対応プラットフォーム WebViewとは インストール 使い方 Marg…

  • 【Unity】Debug.Logはもう古い!? Unity公式のLoggingパッケージ「Unity Logging」の使い方まとめ

    はじめに これはUnity Advent Calendar 2023の15日目の記事です。 qiita.com この記事ではUnity公式のLoggingパッケージであるUnity Loggingを紹介したいと思います。 はじめに 概要 導入 環境 基本的な使い方 LogLevel ログ出力 デフォルトのConfigure Custom Configure MinimumLevel OutputTemplate CaptureStacktrace RedirectUnityLogs SyncMode ログの出力先(Sinks)の設定 ファイルシステム コンソール それ以外 サンプルコード 参考…

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

    はじめに 実はマルチスレッドでは値のインクリメントは正しく動作しない可能性があります。 // 正しく動作しない再現 const int Count = 100; var tks = new Task[Count]; var semaphore = new SemaphoreSlim(0, Count); var value = 0; // SemaphoreSlimを利用して同時アクセスのヒット率を上げている for (var i = 0; i < Count; i++) { tks[i] = Task.Run(() => { semaphore.Wait(); value++; }); } …

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

    はじめに 今回は以下のGifのような縦(VerticalとHorizontalを入れ替えれば横)スクロールのScroll Viewの実装してみようという記事になります。 実際に動作させている様子 やり方 Hierarchy上で右クリックをし、UI > Scroll Viewを選択します。 Scroll Viewを生成するこのときに縦スクロールの場合ならScroll Horizontalというゲームオブジェクトは削除してしまって構いません。またScroll ViewというゲームオブジェクトのScroll RectコンポーネントのHorizontalのチェックマークをはずしておきます。 Horiz…

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

    創作活動と羞恥心は常に隣り合わせだと思う はじめに 最後に技術系以外の記事をこのブログに投稿したのはいつか、もはや自分でも覚えていません。かなり形骸化してしまっていますが、このブログは一応雑記ブログという位置付けだったりします。話は変わりますが社会人になるタイミングというのは、自身が大人になったと自覚する良いタイミングかと思います。勉強会などで学生さんに会うと、もう自分はそちら側でないんだなと気づきちょっと変な感覚です。正直気持ち的にはまだ18歳くらいなのですが、幸か不幸かもう子供に分類されることも難しくなっているに違いありません。 恥と創作活動 人間誰しも恥はかきたくないですよね。例えば私は…

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

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

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

    はじめに 今回は新しいUIシステムであるUI Toolkitについて取り上げたいと思います。 今回作るUIこの記事は以下のUI Toolkitの導入記事の自分向けの備忘録になります。見づらいですし、公式ドキュメントを見た方が正確な情報が書いてありますのであしからず。 docs.unity3d.comまた一部公式ドキュメントと異なるコードを書いていますので注意してください。 はじめに 概要 Getting Started カスタムエディターウィンドウの作成 UI Builderを使用してUIコントロールを加える UI Builderを開く ButtonとToggleを配置する インスペクター操作…

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

    はじめに UI ToolkitではVisual TreeからVisualElementを検索するためにUQueryを利用しますが、クエリメソッドとしてQとQueryがあります。今回はその違いについて取り上げたいと思います。 はじめに 概要 詳細 概要 Queryは該当する全てのVisualElementの情報を返し、Qは該当する最初のVisualElementを返します。 // サンプルコード // rootVisualElementを根とする木に含まれるButtonを全て取得する UQueryBuilder<Button> buttons = rootVisualElement.Query<…

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

    はじめに 今回はUI ToolkitのVisualElementに対してC#スクリプトからスタイルを適応する方法について紹介したいと思います。 はじめに やり方 VisualElement.styleを利用する Unity style sheet(USS)を追加する 参考 やり方 VisualElement.styleを利用する VisualElement.styleを通して操作します。USSで既に指定していた値も上書きされます。 // サンプルコード VisualElement label = new Label("Label Sample"); label.style.background…

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

    はじめに C#12から登場したInterceptorsというコンパイル時に実行するメソッドを置き換えられる機能について紹介したいと思います。github.comただしまだ実験的な機能なので、変更される可能性もありますし情報もまだそこまで出てきていません。注意してください。 はじめに 確認環境 概要 Interceptorsを有効にする 使い方 InterceptsLocationAttributeを定義する メソッドを置き換える 参考 確認環境 Rider2023.3 EAP8 .Net8.0 C#12 概要 Interceptorsを利用することでコンパイル時に特定のメソッドの呼び出しを別の…

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

    はじめに 今回はSystem.Text.Jsonを用いてSchemaが変わる可能性があるようなJsonをデシリアライズする方法について紹介したいと思います。www.nuget.org↓利用される場面 逆シリアル化する型がない 受信した JSON に固定スキーマがなく、含まれている内容を確認するために検査する必要がある。 System.Text.Json で JSON DOM を使用する方法 - .NET Microsoft Learn はじめに 概要 やり方 JsonDocumentの利用 JsonElementの利用 見つからない時はエラーになる 配列が列挙する プロパティを列挙する 概…

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

    はじめに 今回はSystem.Text.Jsonを利用して直接UTF-8バイト配列にシリアライズ & UTF-8バイト配列からデシリアライズする方法を紹介したいと思います。また公式ドキュメントには文字列ベースのメソッド(UTF-16)を使用するよりもUTF-8バイト配列のシリアル化は約5から10%高速だと表記されています。 UTF-8 バイト配列へのシリアル化は、文字列ベースのメソッドを使用するより約 5 から 10% 高速です。 違いは、バイト (UTF-8) を文字列 (UTF-16) に変換する必要がないことから生じます。 C# で JSON のシリアル化と逆シリアル化を行う方法 - .…

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

    はじめに 例えばRaw String Literal(もしくはT4の実行時テンプレート)を利用して、.csの生成をしようとします。 using System.Text; namespace SampleConsole { internal class Program { public static void Main() { // C#11より登場した生文字列リテラル (T4の実行時テンプレートの移行先としてしばしば利用される) // 開始の「""" (3個以上の ")」の後ろには改行必須, 1行目のインデントを基準にしてそれよりも前の空白文字は無視 // 先頭の「$」の数によって補完する際「…

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

    はじめに 今回はdotnet-t4について取り上げたいと思います。www.nuget.org はじめに 概要 インストール手順 .NET Core3.1のインストール dotnet-t4のインストール パスを通す 使い方 参考 概要 dotnet-t4はT4テンプレートをコマンドラインからファイル指定して処理するツールです。 dotnet-t4 is a command-line tool for processing T4 templates, a general-purpose way to generate text or code files using C#. It's part o…

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

    はじめに 最近教えていただいたのですが、どうやらPowerShellは.NETの知識がそのまま使えるとの噂を聞きました。 PowerShell(パワーシェル)は、マイクロソフトが開発した拡張可能なコマンドラインインターフェイス (CLI) シェルおよびスクリプト言語である。オブジェクト指向に基づいて設計されており、.NET Framework (Windows PowerShell 5系以前) あるいは.NET Core (PowerShell Core 6系以降) を基盤としている。 PowerShell - WikipediaC#erとしては気になるということで、Macでのインストール方法…

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

    はじめに 今回はUI Toolkitにて以下の画像のような要素が入れ子になっているようなTreeViewを作成してみる記事になります。 動作させている様子↓TreeViewの公式ドキュメントの説明 docs.unity3d.comdocs.unity3d.com はじめに 概要 やり方 UXMLを記述する(UI Builder利用) C#スクリプトでの記述 動作確認する 参考 概要 TreeViewは木構造なデータを表示することができるVisualElementです。 A TreeView is a vertically scrollable area that links to, and d…

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

    はじめに 今回はCRLF・LF・CRの違いとRiderでの設定方法について取り上げたいと思います。 はじめに 改行コード Riderでの設定方法 新規ファイルに対しての適応方法 現在開いているファイルに対して改行コードを変更する 指定したファイルやディレクトリ内のファイルに対して改行コードを変更する 参考 改行コード 改行コード とは、ワードプロセッサ(ワープロ専用機)やコンピュータなどで、改行を表す制御文字である。 改行コード - Wikipediaしかし歴史的な経緯から複数のコードが混在していて、システム(ソフトウェア)によって以下の3種類のどれかを利用しています。 CR : Carria…

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

    はじめに 今回はPackageManagerのスクリプティングAPIについて取り上げたいと思います。docs.unity3d.com はじめに 概要 使い方 LogLevel Add AddAndRemove List Embed Remove Resolve 参考 概要 PackageManagerを操作するためにはPackageManager.Clientクラスを利用します。 LogLevel : 使用するログレベル Add : パッケージ追加 AddAndRemove : 一括でパッケージ追加・削除 Embed : プロジェクトにパッケージを埋め込む List : パッケージの一覧取得 …

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

    はじめに 1.23f.ToString()のような浮動小数点のToStringを実行するとカルチャ(国/地域)によって表示が異なることに最近気がつきました。 // ja-JP Console.WriteLine(CultureInfo.CurrentCulture); // 1.23 Console.WriteLine(1.23f.ToString(CultureInfo.CurrentCulture)); // 1.23 Console.WriteLine(1.23f.ToString(new CultureInfo("en-US"))); // 1,23 // 「.」ではなく「,」が利用さ…

  • 【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.app/Contents/MacOS/Unity -quit -batchmode -nographics -projectPath "/Users/user/Sample2022_3_8f1" -executeMethod SampleNa…

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

    はじめに 今回はAndroid端末からスタックトレースやログなどのメッセージをUnity Editorに表示することができる公式パッケージ「Android Logcat」を紹介したいと思います。 Android Logcatが動作している様子docs.unity3d.com はじめに 概要 環境 インストール方法 Android端末と接続する方法 USB接続 ADB(Android Debug Bridge) Android Logcatを開く ワイヤレスでAndroidデバイスに接続する Androidデバイス上のアプリケーションを指定する フィルタ 参考 概要 Android Logcat…

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

    はじめに UnityアプリをビルドしてAndroidでデバッグする際に、ログを調べたい場合もあるでしょう。そんなときにAndroid StudioのLogcatを利用することでログを確認することができます。 Logcatが動作している様子UnityEngineのDebug.Log等を確認している様子developer.android.com実際にLogcatでログを確認するまでの手法を紹介したいと思います。 はじめに Android Studioのインストール Android Studioを立ち上げLogcatを開く Android端末と接続する Logcatのフィルタ ツールバー Unity…

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

    はじめに 今回は128ビット整数のInt128とUInt128について取り上げたいと思います。learn.microsoft.com learn.microsoft.com はじめに 概要 概要 128bitの整数(Int128・UInt128)が.NET7から導入されました。C#のバージョン的にはC# 11からのタイミングなはずです。 C# 言語のバージョン管理 - C# ガイド - C# Microsoft Learn Int128 maxInt128 = Int128.MaxValue; Int128 minInt128 = Int128.MinValue; // 170141183…

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

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

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

    はじめに 今回はStructLayoutとLayoutKind.Explicitを用いて指定したメモリ領域を別の型として解釈する方法について紹介したいと思います。 別の型として解釈する例(bool + byte + ushort => int) はじめに 別の型として解釈する StructLayoutとは Unsafe.As 参考 別の型として解釈する StructLayoutAttributeとLayoutKind.Explicitを上手に組み合わせることで、本来はキャストできないような別な型として解釈させることができます。 // サンプル : bool(1byte) + byte(1byt…

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

    はじめに 今回は自作パッケージを作成しPackageManagerのAdd package from git URLからインストールできるようにする手法について紹介したいと思います。 実際にインストールしている様子 はじめに カスタムパッケージの作成 ファイル・フォルダを生成する 中身を記述する package.json [company-name].[package-name].asmdef [company-name].[package-name].Editor.asmdef Package Managerから確認する Add package from git URLからインストールできる…

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

    はじめに 今回はオープンジェネリック型(Open Generic Types)とクローズジェネリック型(Closed Generic Types)について取り上げたいと思います。 はじめに 概要 オープンジェネリック型 クローズジェネリック型 参考 概要 オープンジェネリック型(Open Generic Types):型パラメーターに具体的な型を定めていないジェネリック クローズジェネリック型(Closed Generic Types):型パラメーターに具体的な型を定めたジェネリック インスタンス化できるのがクローズジェネリク型で、できないのがオープンジェネリック型と考えても良いかもしれません…

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

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

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

    はじめに 今回は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(", "); } // 出力 : 48, 65, 6c, 6c, 6f, // UTF-16 : 48, 00, 65, 00, 6C, 00, 6C, 00, 6F, 00 // UTF-8 : 48,…

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

    はじめに 今回はInlineErrorというRiderの拡張機能について紹介したいと思います。 実装に動作させている様子plugins.jetbrains.com はじめに 概要 インストール手順 概要 InlineErrorというRider拡張機能を利用することで、警告やエラーのメッセージをコードの右側に表示させることができます。 Plugin for displaying errors message in the editor; inspired by Alexander's VSCode extension Error Lens // DeepL翻訳 エラーメッセージをエディターに表示…

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

    はじめに 今回はConditionalAttributeの制約について紹介をしたいと思います。 指定した条件付きコンパイル シンボルが定義されていない場合、メソッド呼び出しまたは属性を無視するようコンパイラに指示します。 learn.microsoft.com最近知ったのですが、以下のケースではConditionalAttributeは利用できないみたいです。 戻り値がある場合 引数にoutパラメーター修飾子がある場合 具体例を見ながら紹介します。 はじめに 制約 戻り値があるとき outパラメーター修飾子があるとき ref・inパラメーター修飾子はOK 理由 参考 制約 戻り値があるとき 戻…

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

    はじめに 今回はTypeConverter.ConvertFromStringとC#11から導入されたIParsable<TSelf>を紹介したいと思います。learn.microsoft.comlearn.microsoft.com はじめに 概要 C#11以前 C#11以降 パフォーマンス的な話 概要 例えばstringからジェネリックのTの値にパースしたいとします。 public static bool TryParse<T>(string value, out T result) { // TODO: valueからresultにParseをする } ぱっと見型スイッチで頑張るみたいな…

  • 【Rider】nullになることを示す[CanBeNull]・ならないことを示す[NotNull] と 値解析モードによる挙動の違いについて

    はじめに 今回は[CanBeNull]と[NotNull]、またそれらに対する挙動を設定できる値解析モードについて取り上げたいと思います。pleiades.io // 値解析モードによる挙動の違いについてのサンプル var sample = new Sample(canBeNullObj: null, notNullObj: null, obj: null); // 値解析モードが楽観的・悲観的のどちらでも警告が出てくる var canBeNullObj = sample.CanBeNullObj; _ = canBeNullObj.ToString(); // 値解析モードが楽観的・悲観的の…

  • 【C#】インターフェースで定義されているメンバーを実装するときにConditional属性は使えない

    はじめに 以下のようなコードを書いたところエラーが出てきてしまいました。 public interface IProgram { public void Hoge(); } public class Program : IProgram { [Conditional("ENABLE_HOGE")] public void Hoge() { Console.WriteLine("HOGE"); } } [CS0629] 条件付きメンバー 'Program.Hoge()' はインターフェイス メンバー 'IProgram.Hoge()' を型 'Program' で実装できません このエラーについ…

  • 【Unity】コマンドラインからUnityをバッチモードで実行しstaticメソッドを実行する方法

    はじめに 今回はコマンドラインからUnityを操作する方法について紹介したいと思います。 コマンドラインから実行している様子docs.unity3d.com はじめに 概要 コマンドについて Unityのパスを指定 -quit -batchmode -nographics -projectPath -executeMethod -buildTarget -logFile 引数の渡し方 概要 Unityはコマンドラインから実行することができます。 Unity をコマンドラインで実行できます (macOS では ターミナル、Windows では コマンドプロンプト)。 コマンドライン引数 - Un…

  • 【Unity】asmdefで"必須パッケージ"と"任意パッケージ"を定義する方法

    はじめに 今回はasmdefで必須パッケージと任意パッケージを定義する方法について紹介をしたいと思います。 任意パッケージのサンプル(左)と必須パッケージのサンプル(右) はじめに その前に やり方 必須パッケージのやり方 任意パッケージのやり方 その前に AssemblyDefinitionFilesってなんだっけと言う方は一度公式ドキュメント等を参照してみてください。docs.unity3d.comまた今回利用する知識は以下の3つ。 references:アセンブリの参照設定 versionDefines:特定のパッケージ(かつ特定バージョン)がある場合にのみシンボル定義を行う defin…

  • 【C#】fixedステートメントを用いてGCによるアドレスの変更を阻止する(GC管理下だとコンパクションの可能性があるため)

    はじめに 今回はfixedステートメントについて書きたいと思います。 はじめに 概要 使い方 参考 概要 GC管理下にあるオブジェクトは、アドレスが最適化のために移動されることがあります。詳細は未確認飛行さんのコンパクションの箇所を読むと良いでしょう。 ufcpp.netunmanagedポインター(参照型変数や参照渡し以外)はコンパクションによるアドレスの変更に対応していないので、アドレスを固定させるという操作が必要になってしまいます。そこで利用するのがfixedステートメントです。 fixed ステートメントを使うと、ガベージ コレクターによる移動可能変数の再配置を防ぎ、その変数へのポイン…

  • 【C#】BitConverter.GetBytesはbyte配列が生成されてしまうので、極力BitConverter.TryWriteBytesを利用してAllocation削減する

    はじめに 今回はBitConverter.GetBytesとBitConverter.TryWriteBytesに焦点をあててAllocationについて書きたいと思います。learn.microsoft.com learn.microsoft.com はじめに 概要 BitConverter.TryWriteBytesを利用する 利用サンプル1 利用サンプル2 参考 概要 指定したデータ(例. int, ulong)をバイト配列に変換する方法としてBitConverter.GetBytesが挙げられます。 public static byte[] GetBytes (bool value);…

  • 【C#】Conditional属性は呼び出し元のシンボル定義を参照するので注意、またその対処法

    はじめに 今回はConditionalAttributeは呼び出し元のシンボル定義を参照していることについて取り上げたいと思います。learn.microsoft.com メソッド呼び出しがスキップされる場合とされない場合 はじめに 概要 気をつけたいこと 対処法 概要 そもそもConditional属性とは?という方もいると思うので公式の説明を載せておきます。 指定した条件付きコンパイル シンボルが定義されていない場合、メソッド呼び出しまたは属性を無視するようコンパイラに指示します。 learn.microsoft.com // 公式サンプル #define CONDITION1 #defi…

  • 【C#】CallerMemberName, CallerFilePath, CallerLineNumberを用いてメソッドの呼び出し元の情報を取得する(メソッド名またはプロパティ名, パス, 行番号)

    はじめに 今回はメソッドの呼び出し元情報を取得できるようになる3つの属性(CallerMemberName・CallerFilePath・CallerLineNumber)を紹介したいと思います。 はじめに 概要 CallerFilePath CallerLineNumber CallerMemberName 使い方 実験 概要 CallerMemberName, CallerFilePath, CallerLineNumberを利用することで、メソッドの呼び出し元の情報を取得することができます。 CallerMemberName : メソッドの呼び出し元のメソッド名またはプロパティ名 Cal…

  • 【C#】Unity.Collections.xxHash3.StreamingStateを利用してデータ少しずつ入力しながらハッシュ値を計算する

    はじめに 前回xxHash3.Hash64とxxHash3.Hash128を紹介したのですが、今回はいくつかのデータをそれぞれ計算した後にハッシュ値を取得できるxxHash3.StreamingStateを紹介したいと思います。 www.hanachiru-blog.com // サンプルコード // 128bits xxHash3.StreamingState streamingState = new xxHash3.StreamingState(isHash64: false); // 対象のデータ NativeArray<byte> array1 = new NativeArray<by…

  • 【C#】Utf8Formatter.TryFormatを用いて一般的なデータ型をUtf8 文字列として書式設定する

    はじめに 今回はUtf8Formatter.TryFormatについて紹介したいと思います。 int value = 999; // e7, 3, 0, 0 Console.WriteLine(string.Join(",", BitConverter.GetBytes(value).Select(x => x.ToString("x")))); // 書き込み先のメモリ領域 Span<byte> destination = new byte[4]; // 一般的なデータ型を Utf8 文字列として書式設定する Utf8Formatter.TryFormat(value, destinatio…

  • 【C#】.NETの内部実装がGitHubで公開されていたので見てみる(Contributeも可)

    はじめに 先日教えていただいたのですが、どうやら.NETの内部実装を見れるGitHubのRepositoryが公開されているらしいです。 This repo contains the code to build the .NET runtime, libraries and shared host (dotnet) installers for all supported platforms, as well as the sources to .NET runtime and libraries. // DeepL翻訳 このレポには、.NETランタイム、ライブラリ、共有ホスト(dotnet)…

  • 【C#】IBufferWriter<T>の使い方・実装の仕方について学んでいく(公式のArrayBufferWriter<T>の内部実装を見ながら)

    はじめに 今回はIBufferWriter<T>の使い方・実装の仕方について書きたいと思います。learn.microsoft.com はじめに IBufferWriterの利用者視点での使い方 IBufferWriterの実装者視点での使い方 応用 File書き込みとかにも利用したい 参考 IBufferWriterの利用者視点での使い方 IBufferWriterは基本的に以下の3ステップで実行していきます。 IBufferWriter<T>.GetSpanかIBufferWriter<T>.GetMemoryを用いて書き込む先のメモリ領域を取得 SpanかMemoryを経由してメモリに書…

  • 【C#】Marshal.AllocHGlobal・NativeMemory.Alloc・NativeMemory.AllocZeroedを利用してアンマネージドメモリを確保する方法

    はじめに 今回はアンマネージドメモリを確保・破棄する方法について以下の3つを紹介したいと思います。 Marshal.AllocHGlobal NativeMemory.Alloc NativeMemory.AllocZeroed はじめに 概要 Marshal.AllocHGlobal Marshal.FreeHGlobal NativeMemory.Alloc NativeMemory.AllocZeroed NativeMemory.Free やり方 概要 NativeMemoryは.NET 6から登場したクラスです。Marshal.AllocHGlobalと内部的には同じ動作になっている…

  • 【Unity】Unity公式のハッシュアルゴリズムxxHash3がCollectionsパッケージに入っているので使ってみる

    はじめに 今回はUnity公式のxxHash3について紹介をしたいと思います。 public void Start() { // unmanagedなHeap確保 NativeArray<byte> input = new NativeArray<byte>(10000, Allocator.Temp, NativeArrayOptions.UninitializedMemory); for (var i = 0; i < input.Length; i++) { input[i] = (byte)(i % 255); } unsafe { // Hash値計算 uint4 hash128 =…

  • 【C#】RuntimeHelpers.IsReferenceOrContainsReferences<T>メソッドを利用して"参照型"か"参照型を含む値型"か調べる

    はじめに 今回はRuntimeHelpers.IsReferenceOrContainsReferences<T>について紹介をしたいと思います。learn.microsoft.com はじめに 概要 使い方 考察 参考 概要 public static bool IsReferenceOrContainsReferences<T> (); 指定された型が参照型であるか、または参照を含む値型であるかを示す値を返します。 learn.microsoft.com 使い方 public static void Main(string[] args) { // True Console.WriteLi…

  • 【C#】C#9.0から導入された静的匿名関数(Static anonymous functions)を利用して状態のキャプチャを禁止する

    はじめに 今回はC#9.0から導入された静的匿名関数(Static anonymous functions)について取り上げたいと思います。 learn.microsoft.com はじめに 概要 参考 概要 ラムダおよび匿名メソッドに対して ' static ' 修飾子を許可します。これにより、含まれるスコープからのローカルまたはインスタンスの状態のキャプチャが禁止されます。 Static anonymous functions - C# 9.0 specification proposals Microsoft Learnstaticをつけることで何か新しいことができるというわけではな…

  • 【C#】unsafeを用いずにReadOnlySpan<char>からSpan<char>に変換をして中身を好き勝手にいじる

    はじめに 今回はunsafeを用いずにReadOnlySpan<Span>からSpan<char>に変換する方法について紹介をしたいと思います。 ReadOnlySpan<char> str = "hello, world"; var span = MemoryMarshal.CreateSpan(ref MemoryMarshal.GetReference(str), str.Length); // unsafe使わずともこれで簡単にいじれてしまうやん... span.Reverse(); // dlrow ,olleh Console.WriteLine(str.ToString()); …

  • 【C#】Unsafe.WriteUnalignedとMemoryMarshal.GetReferenceとSpanを組み合わせてメモリのコピーを行う

    はじめに 今回はUnsafe.WriteUnalignedとMemoryMarshal.GetReferenceとSpanを組み合わせてメモリのコピーを行ってみようという記事になります。 // サンプルコード public static void Main(string[] args) { int value = 999; // 231, 3, 0, 0 Console.WriteLine(string.Join(",", BitConverter.GetBytes(value))); // ------------ // Managed Heap // ------------ Span<b…

  • 【C#】64ビットの擬似乱数生成器"Splitmix64"を実装してみる

    はじめに 今回はSplitmix64という擬似乱数生成器をC#で実装してみようという記事になります。 はじめに 概要 実装 参考 概要 Splitmix64は64ビットの高速な疑似乱数生成器です。C#で64ビットの型はlongやulongとかですね。 64ビットの状態のみを使用した非常に高速な疑似乱数生成器。 64ビットの状態のみを使用する必要がない限り、XorOshiro128StarStarまたはXorOshiro128Plusを使用することをお勧めします。 Pony - SplitMix64 [ソース]64ビットの状態のみを使用した非常に高速な疑似乱数生成器、詳細 http://xosh…

  • 【Unity】Application.logMessageReceivedを用いてUnityのログメッセージが発行されたときに処理を行う

    はじめに 今回はUnityのログメッセージが発行されたときに処理を挟むことができるApplication.logMessageReceivedについて取り上げたいと思います。 ログメッセージが発行されたときに受信するためのイベントハンドラーこのイベントはメインスレッドでのみ動作します。もしハンドラー内で、メインスレッドのみ呼び出し可能な Unity の API を使用したい場合や、なんらかの理由があった場合、スレッドセーフでないかもしれません。 Application-logMessageReceived - Unity スクリプトリファレンス 利用している様子 はじめに 概要 使い方 概要 …

  • 【Unity】エディタ拡張でPrefabStageUtilityを用いてPrefab ModeでPrefab Assetを開いたりPrefab stageを取得したりする

    はじめに 今回はUnityEditor.SceneManagement.PrefabStageUtilityを用いて、Prefab Modeでアセットを開いたり、Prefab stageを取得したりする記事になります。docs.unity3d.com PrefabStageUtility.OpenPrefabを実行した様子 はじめに 概要 PrefabStageUtility.GetCurrentPrefabStage PrefabStageUtility.GetPrefabStage PrefabStageUtility.OpenPrefab 概要 PrefabStageUtilityはPr…

  • 【C#】MemoryMarshal.Castを利用してバイト配列に他の型の配列のデータを書き込む

    はじめに 今回はMemoryMarshal.Castについて取り上げたいと思います。learn.microsoft.com // int[]からbyte[]に変換を行うサンプルコード // 変換前:int[] (intは4バイト) Span<int> from = Enumerable.Range(int.MaxValue-5, 5).ToArray(); // 変換後:byte[] (intは4バイトなので、5*4=20バイト必要) Span<byte> to = new byte[20]; // int[]の情報をbyte[]に書き込む to = MemoryMarshal.Cast<in…

  • 【Rider】メソッド抽出(extract method)というリファクタリング機能がとても便利

    はじめに 今回はメソッド抽出(extract method)というRiderのリファクタリング機能について紹介したいと思います。pleiades.io メソッドの抽出をしている様子 はじめに 概要 やり方 メソッドの抽出 ローカル関数の抽出 概要 Riderのメソッド抽出を利用することで、自動で特定の箇所を新しくメソッドとして切り出したりローカル関数として切り出したりすることができます。 このリファクタリングでは、選択したコードフラグメントに基づいて新しいメソッドまたはローカル関数を作成できます。JetBrains Rider は選択されたステートメントを分析し、メソッドパラメーターに変換する…

  • 【Unity】UnityEngine.Scripting.PreserveAttributeを用いてストリッピングを防止する(実は独自PreserveAttributeでも対応可)

    はじめに 今回はPreserveAttribute属性を用いてストリッピングを防止する方法について紹介したいと思います。 docs.unity3d.com はじめに 概要 使い方 実験 UnityEngine.dllに依存しないために 概要 まずはコードストリッピングについて概要を載せておきます。 マネージドコードのストリッピングはビルドから未使用のコードを削除し、最終ビルドサイズを大幅に削減します。 マネージコードストリッピングは、プロジェクトの C# スクリプトからビルドされたアセンブリ、パッケージとプラグインの一部であるアセンブリ、.NET Framework のアセンブリなどのマネージ…

  • 【Unity】エディタ上でBuilt-inに存在するアイコンのTextureを取得する方法

    はじめに 今回はUnityEditorにビルドインで存在するアイコンのTextureを取得する方法を紹介したいと思います。 アイコンを使用している様子 はじめに やり方 やり方 EditorGUIUtility.Loadを用いてbuilt-inリソースを読み込みます。 public static Object Load(string path); Load a built-in resource.This function will look in Assets/Editor Default Resources/ + path for the resource. If not there, i…

  • REST Clientを用いてVisual Studio Codeで直接HTTPリクエストを送信・レスポンスを表示する

    はじめに 今回はVSCodeの拡張機能の一つであるREST Clientを紹介したいと思います。 REST Client allows you to send HTTP request and view the response in Visual Studio Code directly. It eliminates the need for a separate tool to test REST APIs and makes API testing convenient and efficient. // DeepL翻訳 REST Clientは、Visual Studio Codeで直…

  • 【Unity】Unity Test Frameworkでログ出力のテストをする方法(特にDebug.LogError, Debug.LogException)

    はじめに 今回はログ出力のテスト方法について紹介をしようと思います。 ログ出力をしている例 はじめに 概要 テスト方法 概要 Unity Test FrameworkではDebug.LogErrorやDebug.LogExceptionが実行されるとテストが失敗になる仕様にデフォルトでなっています。一応それをやめるフラグであるLogAssert.ignoreFailingMessagesなるものがあります。 public static bool ignoreFailingMessages ; Set this property to true to prevent unexpected err…

  • 【Unity】コンパイル後のdllに対してリフレクションを利用せずにasmrefを使ってinternalにアクセスする方法(必ずできるわけではない)

    はじめに 今回はコンパイル後のdllに対してリフレクションを利用せずにasmrefを使ってinternalにアクセスする方法について紹介したいと思います。この記事を見ている方ならasmrefについての説明は大丈夫かと思いますが、一応前書いておいた記事を貼っておきます。 www.hanachiru-blog.comとても便利なasmrefですが、コンパイル前でなければアセンブリにコードを埋め込むことはできません。(つまりasmdefが定義されてないとダメ)ですのでコンパイル済のdllに対してはasmrefを使ってinternalの利用することができないのです。しかしちょっと邪道?なやり方でそれを…

arrow_drop_down

ブログリーダー」を活用して、はなちるさんをフォローしませんか?

ハンドル名
はなちるさん
ブログタイトル
はなちるのマイノート
フォロー
はなちるのマイノート

にほんブログ村 カテゴリー一覧

商用