はなちるのマイノート

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

C#

【C#, Unity】C#7.0から導入された「ValueTask<TResult>」を利用してヒープアロケーションを減らしたかった(実験付き)

はじめに 今回はC#7.0より導入されたValueTask<TResult>について取り上げたいと思います。 learn.microsoft.comまずValueTask<TResult>の説明の前に、Task<TResult>を利用した非同期処理には以下のような問題点が指摘されていました。 非同期メソッドでも同期処理になる場合が多い Task</tresult></tresult></tresult>…

【C#】「"Year, Month, and Day parameters describe an un-representable DateTime."」というエラーが出てきた時の対処法

C#

はじめに 以下のようなエラーに遭遇しました。 "Year, Month, and Day parameters describe an un-representable DateTime." // Google翻訳 「Year、Month、および Day パラメータは、表現できない DateTime を記述しています。」 その対処法をメモしておき…

【C#】C#8.0から追加されたIAsyncEnumerableを使って非同期ストリームを実装する

C#

はじめに 恥ずかしながら最近になってやっとIAsyncEnumerableというものを知りました。 learn.microsoft.com ufcpp.net これは非同期ストリームと呼ばれるもので、ざっくり言うとasync/awaitとyieldが共存できるようになったというイメージでしょうか。C#8.0…

【C#】「ConfuserEx2」を用いてコードを難読化をする(Windows,プリセット毎の実験結果付き)

C#

はじめに 今回はConfuserEx2という.NETアプリケーションのためのオープンソースな難読化ツールを紹介したいと思います。mkaring.github.ioまた公式ドキュメントは以下にあります。 github.com はじめに 概要 サポート 実験環境 ダウンロード 下準備 使い方 C…

【Unity, C#】ライブラリを用いずエクセルファイル「.xlsx」の中身から要素を取得する(Zip展開)

はじめに 今回はエクセルのファイル(.xlsx)からライブラリを用いずに中身を調べる手法について紹介をしたいと思います。Unityでエクセルのデータを扱おうとすると、NPOIというライブラリを導入することが多いようですね。 www.nuget.org github.comただ最近.…

【Unity】NAudioを導入して、WAVEファイルをMP3ファイルに変換する(Windowsのみ動作確認,Macではダメだった)

はじめに 今回はNAudioというライブラリを導入して.wavから.mp3に変換したいと思います。また先に結論を言うと、WindowsではできましたがMacでは(私の調べた範囲で)できていません。 はじめに NAudioとは 環境 インストール WAVからMP3に変換する Macで動く…

【Unity】stackallocを用いる事でGC.Allocを発生せずに配列を確保する

はじめに 今回はUnityでのstackallocの使用を想定して、簡単な説明記事を書きたいと思います。 はじめに メモリ領域について stackallocとは stackallocの利用 stackalloc利用の注意点 Spanの注意点 おまけ メモリ領域について Unityでは以下の大きく分けて3…

【C#】Span<T>とString.Substringでどれくらい速度差が出てくるのか調べてみる

C#

はじめに 今回はSpan<T>とString.Substringでどれくらい速度差が出てくるのか調べてみる記事になります。 https://docs.microsoft.com/ja-jp/dotnet/api/system.span-1?view=net-6.0 String.Substring メソッド (System) | Microsoft Docs一応公式ドキュメント</t>…

【Unity】AudioClipからWAVEファイルを生成する

はじめに 前回WAVEファイルからAudioClipを動的に生成する記事を書きました。www.hanachiru-blog.com今回はその逆でAudioCliipからWAVEファイルを作ってみたいと思います。 はじめに WAVEファイルの形式 AudioClipとの対応 コード WAVEファイルの形式 前述の…

【Unity】Unity公式のNewtonsoft JsonとNuGetからのdllを共存させる

はじめに Unity2020よりPackageManagerからNewotonsoft.jsonがインポートできるようになりました。 Unity2020でNewtonsoft.Jsonを入れる - Qiita Unity公式のNewtonsoft.jsonそれ以前ではdllを入れていたwww.nuget.orgただUnity公式のものとNuGetから取って…

【Unity】WAVファイルからAudioClipを動的に生成する(WAVEのファイル構造解析)

はじめに 今回はWavファイルからAudioClipを生成する方法について書きたいと思います。https://docs.unity3d.com/ja/2018.4/ScriptReference/AudioClip.Create.html https://docs.unity3d.com/ja/2018.4/ScriptReference/AudioClip.SetData.html はじめに 利…

【Unity】Unity2020.3.32f1でEnumerable.ReverseよりもArray.Reverseがめちゃ遅いんだが??

はじめに Unityを触っていて、なんだかArray.Reverseが遅く、Enumerable.Reverseにしてみたら速くなったという不思議な現象に出会いました。 https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.reverse?view=net-6.0 https://docs.micros…

【Unity】Unity公式のObjectPoolを使ってみる(内部実装も一部紹介)

はじめに 今回はObjectPoolについて紹介していきたいと思います。 The object pool pattern is a software creational design pattern that uses a set of initialized objects kept ready to use – a "pool" – rather than allocating and destroying them …

【C#】リトルエンディアンとビッグエンディアンの変換を行う

C#

はじめに 今回はエンディアンの変換についてお話したいと思います。 エンディアン(英: endianness)は、複数のバイトなどを並べる順序の種類である。一般的な用語による表現ではバイトオーダ(英: byte order)、ないしそれを一部訳して日本語ではバイト順…

【Unity, C#】InternalsVisibleToを用いて特定アセンブリからinternalにアクセスできるようにする

はじめに 今回はInternalsVisibleToという属性(Attribute)について紹介したいと思います。 同一アセンブリ内でないとアクセスできない皆さんご存知かと思いますが、internalを利用することで同一アセンブリでしかアクセスできないようにすることができます。…

【C#】AES(Advanced Encryption Standard)暗号化をしてみる

C#

はじめに 今回はAES(Advanced Encryption Standard)暗号を利用してみるという記事になります。 Advanced Encryption Standard (AES) は、アメリカが2001年に標準暗号として定めた共通鍵暗号アルゴリズムである。アメリカ国立標準技術研究所(NIST)が公募し…

【Unity, C#】K4os.Compression.LZ4を使ってLZ4の圧縮・展開をしてみる

はじめに 今回はUnityでLZ4を用いてバイト配列を圧縮してみるという記事になります。 LZ4 は圧縮と展開の速さに焦点を当てた可逆圧縮アルゴリズムである。バイト指向の圧縮方法であるLZ77ファミリーに属する。 gzipのようなアルゴリズムより低い圧縮率である…

【C#】MemoryStreamを利用してメモリにデータを読み書きする

C#

はじめに 今回はMemoryStreamというメモリにデータを読み書きできるクラスの使い方について書きたいと思います。docs.microsoft.com 定義MemoryStream クラス (System.IO) | Microsoft Docs はじめに 使い方 使い方 MemoryStreamはStreamの派生クラスであり…

【Unity】AssetPostprocessorを利用してアセットをインポートした前後に処理を走らせる

はじめに 今回はAssetPosprocessorを利用してアセットをインポートした前後に処理を走らせてみる記事になります。docs.unity3d.com はじめに 使い方 関数一覧 Postprocess Preprocess 応用例 特定のフォルダにファイルが追加・削除されたときに操作を行う Te…

【Unity】AssetStudioでUnity製のゲーム・AssetBundleの中身を覗き見・エクスポートする(悪用はしないように)

はじめに 今回はAssetStudioというツールを利用して、AssetBundleを抽出&解析してみるという記事になります。github.com AssetBundleの中身を解析している様子あんまり深く掘っていくとグレーな予感がしてきますが、逆に開発者にとってもこういった危険性が…

【Unity】OpenJTalkのC#ラッパーであるSharpOpenJTalkを利用して音声合成を行う

はじめに 前回OpenJTalkForUnityというUnityで簡単にOpenJTalkを利用できるようにしたパッケージを紹介しました。 www.hanachiru-blog.comただこのパッケージはWindowsでしか動作しないという欠点があり、どうしてもクロスプラットフォームで動作させたかっ…

【Unity】ML.NETを利用をしてUnityで機械学習を行ってみる

はじめに 今回はML.NETというマイクロソフトが作成している機械学習ライブラリをUnityで利用してみようという記事になります。 ML.NET を使用すると、オンラインまたはオフラインのどちらのシナリオでも、.NET アプリケーションに機械学習を追加できます。 …

【C#, Unity】自作Attributeの作り方とその応用例(PropertyAttribute)

はじめに 今回は自作Attributeの作り方とそれを利用した応用例のサンプルを紹介したいと思います。docs.microsoft.com 自作AttributeをUnityで利用した例 はじめに 作り方 コンストラクターとパブリックな読み取り/書き込みフィールドまたはプロパティ Syste…

【Unity】DocFXを用いてプロジェクトのドキュメントを自動生成する

はじめに 今回はDocFXというドキュメント生成ツールを使い、Unityプロジェクトのドキュメントを作っちゃおうという記事になります。dotnet.github.io 自動生成したドキュメント はじめに DocFXをインストールする 出力先のフォルダを作成する ドキュメント化…

【Unity】外部アプリ(exe)を起動して標準入出力を用いてやり取りをする

はじめに Unityからexeを起動して、標準入出力によりやり取りを行う処理を書く必要がありました。 Unityと外部プロセスとの標準入出力を用いたやり取りその手法について簡単の書き残しておきたいと思います。 はじめに exeを準備する UnityにExeを取り込む …

【Unity】デリゲート型の変数にメソッドを代入するときキャッシュすることでGC.Allocを防ぐ

はじめに デリゲート型の変数にメソッドを代入しようとした際に、そのやり方だとGC Allocが発生しちゃうよとご指摘いただけたことがありました。 // イメージ private void Update() { hoge.OnCompleted += Fuga; } private void Fuga(){} 実際に発生するの…

【Unity,c#】Doxygenで指定のフォルダを解析しないように除外する手順

はじめに 前にDoxygenを使ってドキュメントを生成する記事を書いたのですが、Unityでは外部から導入したファイルの説明も含まれていて分かりづらいと言われてしまいました。 www.hanachiru-blog.com ですので今回は指定フォルダを解析しないように除外する手…

【Unity】Test Runnerでprivateメソッドもテストしちゃうよ

はじめに 今回はUnityのTest Runnerを使って、privateなメソッドもテストしちゃおうという記事になります。まあ簡単に言うとリフレクションを使ってアクセスするだけではありますが、覚えておいて損はないと思います。 はじめに やり方 解説 さいごに やり方…

【Unity,c#】Doxygenを使ってプロジェクトのドキュメントを自動生成する

はじめに 今回はDoxygenというツールを使って以下の画像のようなドキュメントを生成してみたいと思います。 ドキュメント例 はじめに Doxygenをインストールする GUIツールの概要 生成する さいごに Doxygenをインストールする まずはDoxygenをインストール…

【C#】ジェネリッククラスのインスタンス化をするときに一行が長くなりすぎる問題の対処法

C#

はじめに C#のジェネリッククラスをインスタンス化するときに結構長くなってしまうのはあるあるな気がします。 private static void Main(string[] args) { // 一行が長くなりがち・・・ var sample = new Sample<List<int>, KeyValuePair<bool, int>>(); } public class Sample<TKey, TValue>{}</tkey,></bool,></list<int>…