うにてぃブログ

主にUnityとC#に関する記事を書いていきます

C#

【C#】文字列から一意の数字を生成する

C#

ハッシュを利用することにより、文字列から一意の数字を生成することができます using System.Security.Cryptography; using System.Text; public static class Utility { public static int StringToInt(string input) { using (var sha256 = SHA256.Create…

【C#】配列のIndexを最後から指定したり、範囲を指定して取得する

C#

C#8.0 から Index型とRange型が追加されたようで、以下にあるように範囲指定や、最後からn番目の指定ができるようになりました var array = new []{ 1, 2, 3, 4, 5}; array[1..^1]; // 1番目から最後の1つ手前 (2, 3, 4) array[1..]; // 1番目から最後 (2…

【C#】ビット演算を利用したフラグ管理

FlagsAttribute を利用すると Enum をビットフラグとして利用することができる 値は1,2,4... と定義するのは面倒なので、1を何ビットシフトしたかで値を管理する [System.Flags] public enum Flag { A = 1 << 0, B = 1 << 1, C = 1 << 2, // 全フラグ ALL = …

【C#】==演算子 と Equals について読み解く

変数を比較する際に == や Equals を利用しますが、正しく内部処理を理解してなかったので各型による挙動を調査しました int の比較 int intValue1 = 10; int intValue2 = 10; Console.WriteLine($"{intValue1 == intValue2}"); // true Console.WriteLine($…

【Unity】Texture2D の原点を調べる

Texture2D の原点を調べたかったので、以下のコードで0に近いほうが黒くなるテクスチャを出力してみる var texture2D = new Texture2D(256, 256, TextureFormat.RGBA32, false); for (var x = 0; x < 256; x++) { for (var y = 0; y < 256; y++) { var v = (…

【アドベントカレンダー2021】Unity & C#

去年は連日投稿していたのですが、今年はできなかったので アドベントカレンダーだけでも完走したいと思い作成しました 内容は全部濃いものは無理だと思いますが、25記事書けるように頑張ります 日にち 内容 1 GameObject をアクティブにして Animation が呼…

【C#】ひらがなをカタカナに変換したり、カタカナをひらがなに変換する

C#

リンクより、ひらがな・カタカナは「あ」から始まり「ゖ」で終わることが分かる これを参考に、ひらがなをカタカナに変換したり、カタカナをひらがなに変換するクラスを作成すると以下になる using System.Text; public static class StringUtility { privat…

【C#】登録したすべてのメソッドが true もしくは false を返すか判定する

C#

複数パラメータを監視して、制御したい際に public 変数にしていると管理が大変なので Func を登録して戻り値で判定できるようにしてみました クラス using System; using System.Collections.Generic; /// <summary> /// Function を登録して、それが全部満たすか、</summary>…

【C#】リフレクションで IList のインスタンスを作成する

private object CreateListInstance<T>(T[] values) { var elementType = typeof(T); var listType = typeof(List<>).MakeGenericType(elementType); var list = (IList) Activator.CreateInstance(listType); for (var i = 0; i < values.Length; i++) list.Ad</t>…

【C#】リフレクションで Array のインスタンスを作成する

private object CreateArrayInstance<T>(T[] values) { var elementType = typeof(T); var array = (Array) Activator.CreateInstance(elementType, values.Length); for (var i = 0; i < values.Length; i++) array.SetValue(values[i], i); return array; }</t>

【C#】継承した Generic クラスを確認する

GenericInt が Generic<T> を継承しているか確認するために、BaseType を見てみたところ Generic1[System.Int32]` と表示され意図したクラスが取得できなかった public abstract class Generic<T>{} public class GenericInt : Generic<int>{} private void Main() { va</int></t></t>…

【C#】負の値にも対応したIndexの計算式

C#

public static class Utility { /// <summary> /// 0~maxの範囲のIndex を返す /// 負の値にも対応 /// </summary> public static int LoopIndex(int index, int max) { var ret = index % max; if (index < 0) ret += max; return ret; } } 実行例 Utility.LoopIndex(10, 20); …

【Shader】オブジェクトを重ねた数によって色を変える〜アルファちょっと対応〜

https://hacchi-man.hatenablog.com/entry/2021/02/23/220000hacchi-man.hatenablog.com 以前の記事でアルファ画像が対応できなかったのですが、少し調査したらまだ問題ありますが アルファを適当できたので、メモがてら追加しておきます オブジェクトのシェ…

【C#】グローバルに数値を管理する

C#

モックを作ってる際にわざわざ値を管理するクラスを複数作るのが面倒だったので、 enum を指定 して手軽に利用できるクラスを作成しました 使い方 enum を定義してこれを Key に利用する public enum ValueType { Score, Life, } 値の初期化 Value<ValueType>.Set(Value</valuetype>…

【C#】Dictionary の初期値

コレクション初期化子を使用してディクショナリを初期化する方法は以下に挙げられる2つがあります // Addメソッドを用いての初期化 var students = new Dictionary<int, Test>() { { 1, new Test(10) }, { 2, new Test(20) }, { 3, new Test(30) }, }; // インデクサを</int,>…

【C#】ビットマスクを利用して偶数奇数を判定する

public static class IntExtension { private static int _Mask = 0x1; /// <summary> /// 奇数かどうか /// </summary> /// <returns></returns> public static bool IsOdd(this int self) { return (self & _Mask) == _Mask; } /// <summary> /// 偶数かどうか /// </summary> /// <returns></returns> public static bool IsEven(thi…

【C#】クラスを DeepCopy する

クラスをコピーする場合、自前でコピーするメソッドを作成する必要があります フィールドの追加などがあるとそのたびにコピー処理を直すのも面倒なので Reflection を利用して DeepCopy する拡張メソッドを作成しました サンプル 使い方は簡単でクラスのイン…

【C#】enum を key にした Dictionary

enum を key にした Dictionary は便利ですが、enum が内部的にはクラスな都合上不都合が生じます そのため dictionary[(int)Hoge.A] のようにわざわざ key を int にして、enum から int にキャストしてアクセスして利用しなければいけません そのため、Dic…

【C#】enum に名前をつける

enum を利用している際に、日本語名を表示したいことがある 普通に処理を記述すると、swtich を使って処理を書くが Attribute を利用して日本語名を追加することもできる コード まずは、enum のフィールドに使う Attribute を定義、必要なのは別名なので st…

【C#】GetHashCode をすべて同一にした際に HashSet の Contains は遅くなるのか

C#

GetHashCode の値は HashSet で利用しており検索の高速化に使っていると記述してあったので GetHashCode の値をすべて同一にした場合と異なるようにした場合で、速度を見てみる コードは 自作クラスを HashSet に突っ込んでランダムで検索してみる var loop …

【C#】GetHashCode ってなんぞや

C#

Microsoftの公式サイトを見てみると、 既定のハッシュ関数として機能します。 との記述があります。これだけでは、GetHashCodeメソッドの利用用途がよく分からないかもしれませんが、具体的にはインスタンスの比較に利用されるのではないかと推測されます。…

【Unity】Enum の int キャストについて調べてみた

enum を int にキャストするときには (int)enum と enum.GetHashCode() の2つがある(はず) しかしながらどちらが早いのか、int をそのまま扱うのと比べてどれくらい遅いのかを調べたことがなかったので調べてみる Unity Editor 上 で .NET 4.x にして Prof…

【C#】コンストラクタからコンストラクタを呼び出す

C#

コンストラクタ内から他のコンストラクタを呼び出すには this を使えば呼び出せます public class Sample { public int Value; // int を引数とするコンストラクタを呼び出す public Sample() : this(10) { } public Sample(int value) { Value = value; // …

【C#】多次元配列をコピーする拡張メソッド

public static T[,] Copy<T>(this T[,] self) { var dst = new T[self.GetLength(0), self.GetLength(1)]; for (var a = 0; a < self.GetLength(0); a++) for (var b = 0; b < self.GetLength(1); b++) dst[a, b] = self[a, b]; return dst; } public static T[</t>…

【C#】グローバルにイベントを管理する

使い方 EventMonitor がジェネリッククラスになっているので Event を継承したクラスを利用する object でもいいが、使う場所によってわざわざキャストするのが面倒だったのでこのような形になった private void Main() { // イベント追加 EventMonitor<TestEvent>.Add(</testevent>…

【Unity】2次元タイルマップ空間で中心から特定の距離の座標一覧を取得する

以下の図のように中心から指定した距離のマス座標一覧を取得するスクリプト 例えば、2の場合は (0, 2), (0, -2), (1, 1), (-1, 1), (1, -1), (-1, -1), (2, 0), (-2, 0)になる public static class TileMapUtil { public static List<Vector2Int> GetPositions(int dista</vector2int>…

【C#】スクリプトを1行ずつロードする

コード using System; using System.IO; public class ScriptUtil { /// <summary> /// スクリプトをロードする /// ※スクリプト以外でもテキストファイルであればロードできる /// </summary> /// <param name="path">パス (Assets/からでよい)</param> /// <param name="lineAction">1行見込み毎に呼び出される</param> /// <param name="encode">エンコード指定 </param>…

【C#】文字列の先頭を小文字に変換する

C#

// ABCD => aBCD public static string ToTopLower(string value) { if (value.Length <= 0) return string.Empty; return char.ToLower(value[0]) + value.Substring(1); }

【C#】文字列とその他の変数を結合する際には ToString が不要

例えば string と int を結合する際には iValue は ToString する必要が無い var sValue = ""; var iValue = 10; string text = sValue + iValue; おそらく private void operator+ (string a, object b) みたいな実装になってると思って Reference Source …

【C#】Reflection 処理まとめ

メモがてらまとめる 子クラスかどうか 親のクラス インナークラスの取得 継承クラスを全検索 インスタンス生成 すべての Type の中から検索 メソッド実行 static なメソッドを実行 プロパティ取得 static なプロパティ取得 ジェネリックメソッドの実行 メソ…