コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【C#】書式指定可能なStringBuilder.AppendLineを拡張メソッドで実装する

概要 var builder = new StringBuilder(); builder.AppendFormat("{0}/{1}", count, max).AppendLine(); よくStringBuilderを使用して文字列を整形するのですが AppendFormat関数を使って改行したい場合は AppendFormat関数の後にAppendLine関数を呼び出す必…

【C#】配列の要素をランダムに並べ替えて返す拡張メソッド

ソースコード using System; using System.Collections.ObjectModel; /// <summary> /// 配列の拡張メソッドを管理するクラス /// </summary> public static class ArrayExtensions { /// <summary> /// ランダムに並び替えた新しい配列を返します /// </summary> public static T[] Shuffle<T>(this T</t>…

【C#】Arrayクラスのstatic関数をList<T>のメンバ関数のように使用できるようにする拡張メソッド

概要 var characters = new Character { new Character{ Job = "王国兵士" }, new Character{ Job = "魔法使い" }, }; var soldier = Array.Find(characters, c => c.Job == "王国兵士"); int index = Array.FindIndex(characters, c => c.Job == "王国兵士"…

【C#】String.Splitをもっと使いやすくする拡張メソッド

はじめに 例えばCRLF(\r\n)の改行で区切られた文字列をString.Split関数で分割する場合 var src = "ピカチュウ\r\nカイリュー\r\nヤドラン"; // 1. エラー src.Split("\r\n"); // 2. OK src.Split(new []{ "\r\n" }, StringSplitOptions.None); 1のように文…

【C#】数値を3桁カンマ区切りの文字列に変換する拡張メソッド

ソースコード /// <summary> /// object 型の拡張メソッドを管理するクラス /// </summary> public static partial class ObjectExtensions { /// <summary> /// 渡された数値を3桁カンマ区切りの文字列に変換して返します /// </summary> public static string WithComma(this object self) { retu…

【C#】1つの文字列が複数の文字列のいずれかと等しいか判定する拡張メソッド

#概要 if (name == "チコリータ" || name == "ヒノアラシ" || name == "ワニノコ") { // ... } 1つの文字列を複数の文字列と比較して いずれかの文字列と等しかった場合は処理を行うといったことをやるときに 上記の書き方は冗長なので using System.Linq; …

【C#】数値を0埋めの文字列に変換する拡張メソッドの実装

はじめに int num = 1234; Debug.Log(num.ToString("D8")); // 00001234 数値を0埋めの文字列に変換する場合は上記のような構文を使用すると実現できますが ゲームを開発していると、数値を0埋めの文字列に変換する機会が意外と多いので 僕は下記のような拡…

【C#】Rubyライクなループ処理を拡張メソッドで実現する

はじめに for (int i = 0; i < MAX; i++) { Debug.Log(i); } 上記のような単純なループ処理はよく記述しますが ループ変数の宣言や終了条件の記述、ループ変数のインクリメントなど 処理内容の単純さに比べると構文は冗長です なので、下記のような拡張メソ…

【C#】Func デリゲートの null チェックを省略するための拡張メソッド

概要 Actionデリゲートのnullチェックを省略するための拡張メソッドを作ったついでに Funcデリゲートに関しても同様のものを作成しました まだ使ったことはないですがきっと役に立つはず・・・ Func<bool> func = null; func.Call(); // OK func(); // NULL例外発生</bool>…

【C#】Action デリゲートの null チェックを省略するための拡張メソッド

はじめに private Texture LoadTexture(Action<Texture> onLoaded = null) { // ... if (onLoaded != null) { onLoaded(texture); } } 例えばテクスチャを読み込む関数があって 読み込んだテクスチャを戻り値だけでなくコールバック関数でも渡せるようにしたとすると </texture>…

【C#】周回数が取得できるforeach文を拡張メソッドで実現する

概要 var texts = new[] { "ピカチュウ", "カイリュー", "ヤドラン" }; foreach (var n in texts.Select((val, index) => new { val, index })) { Debug.Log(n.index + ":" + n.val); } foreach文を使用する場合、LINQのSelect関数を使うと周回数が簡単にわ…

【C#】ListのAddRangeを拡張する

概要 list.AddRange(1, 2, 3); // エラー List型のインスタンスに値を追加するときに 上記のような書き方ができると楽だなと思って下記のような拡張メソッドを作りました /// <summary> /// 指定したコレクションの要素を List の末尾に追加します /// </summary> /// <typeparam name="T">List の型</typeparam>…

【C#】Array.ForEachを拡張メソッドでスマートに書く

概要 Array.ForEach(items, c => Debug.Log(c)); 配列をArray.ForEach関数で処理すると少し書き方が冗長になるので items.ForEach(c => Debug.Log(c)); ListのForEachのように呼び出せるようにする拡張メソッドを作りました このソースをプロジェクトに追加…

【C#】リフレクションを使用してToString関数を手軽に実装する

概要 // キャラクター public class Character { public string Name; // 名前 public int Level; // レベル } 上記のようなキャラクターの情報を管理するクラスがあったとして このクラスのインスタンスの情報をログに出力したい場合に下記のような構文を書…