読者です 読者をやめる 読者になる 読者になる

コガネブログ

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

【C#】単数を渡せるIEnumerable.Concat

/// <summary> /// 2 つのシーケンスを連結します /// </summary> public static IEnumerable<TSource> Concat<TSource>( this IEnumerable<TSource> first, TSource second ) { return first.Concat( new [] { second } ); }</tsource></tsource></tsource>

【C#】LINQのUnion関数の引数にラムダ式を使えるようにする拡張メソッド

using System; using System.Collections.Generic; using System.Linq; public static class IEnumerableExtensions { private sealed class CommonSelector<T, TKey> : IEqualityComparer<T> { private Func<T, TKey> m_selector; public CommonSelector( Func<T, TKey> selector ) { m_se</t,></t,></t></t,>…

【C#】LINQのSequenceEqual関数の引数にラムダ式を使えるようにする拡張メソッド

using System; using System.Collections.Generic; using System.Linq; public static class IEnumerableExtensions { private sealed class CommonSelector<T, TKey> : IEqualityComparer<T> { private Func<T, TKey> m_selector; public CommonSelector( Func<T, TKey> selector ) { m_se</t,></t,></t></t,>…

【C#】LINQのIntersect関数の引数にラムダ式を使えるようにする拡張メソッド

using System; using System.Collections.Generic; using System.Linq; public static class IEnumerableExtensions { private sealed class CommonSelector<T, TKey> : IEqualityComparer<T> { private Func<T, TKey> m_selector; public CommonSelector( Func<T, TKey> selector ) { m_se</t,></t,></t></t,>…

【C#】LINQのExcept関数の引数にラムダ式を使えるようにする拡張メソッド

using System; using System.Collections.Generic; using System.Linq; public static class IEnumerableExtensions { private sealed class CommonSelector<T, TKey> : IEqualityComparer<T> { private Func<T, TKey> m_selector; public CommonSelector( Func<T, TKey> selector ) { m_se</t,></t,></t></t,>…

【C#】LINQのContains関数の引数にラムダ式を使えるようにする拡張メソッド

using System; using System.Collections.Generic; using System.Linq; public static class IEnumerableExtensions { private sealed class CommonSelector<T, TKey> : IEqualityComparer<T> { private Func<T, TKey> m_selector; public CommonSelector( Func<T, TKey> selector ) { m_se</t,></t,></t></t,>…

【C#】LINQのDistinct関数の引数にラムダ式を使えるようにする拡張メソッド

using System; using System.Collections.Generic; using System.Linq; public static class IEnumerableExtensions { private sealed class CommonSelector<T, TKey> : IEqualityComparer<T> { private Func<T, TKey> m_selector; public CommonSelector( Func<T, TKey> selector ) { m_se</t,></t,></t></t,>…

【Unity】ボックス化をなるべく回避してGCの発生回数を減らすstring.Format

// string.Format を使用した場合のGC発生回数検証 for ( int i = 0; i < 1000000; i++ ) { string.Format( "{0},{1},{2},{3}", 0, 1, 2, 3 ); } Console.WriteLine( GC.CollectionCount( 0 ) ); // StringUtils.Format を使用した場合のGC発生回数検証 for …

【C#】WWWFormでコレクション初期化子を使用できるようにする独自クラス

Before var form = new WWWForm(); form.AddField( "frameCount", Time.frameCount.ToString() ); form.AddBinaryData( "fileUpload", bytes, "screenShot.png", "image/png" ); After var form = new WWWFormCollection { { "frameCount", Time.frameCount.…

【C#】StringBuilderでコレクション初期化子を使用できるようにする独自クラス

C#

// Before var builder = new StringBuilder(); builder.AppendLine( "1. フシギダネ" ); builder.AppendFormat( "2. {0}", "フシギソウ" ).AppendLine(); builder.AppendFormat( "3. {0}", "フシギバナ" ).AppendLine(); Console.WriteLine( builder ); // …

【Unity】UnityでC#5.0と6.0の機能を使用できるようにする

https://bitbucket.org/alexzzzz/unity-c-5.0-and-6.0-integration 上記のBitbucketで公開されている「Unity C# 5.0 and 6.0 Integration」を Unityプロジェクトに追加することで、 UnityでC#5.0と6.0の機能が使用できるようになります 導入手順 下記のペー…

【Unity】並列でタスクを管理するシリアライズ可能な独自クラス

関連記事

【Unity】直列でタスクを管理するシリアライズ可能な独自クラス

関連記事

【C#】コレクション初期化子が使用可能な並列でタスクを管理する独自クラス

C#

var task = new MultiTask { onEnded => { Debug.Log( "1" ); onEnded(); }, onEnded => { Debug.Log( "2" ); onEnded(); }, onEnded => { Debug.Log( "3" ); onEnded(); }, }; task.Play( () => Debug.Log( "完了" ) ); 関連記事

【C#】コレクション初期化子が使用可能な直列でタスクを管理する独自クラス

C#

var task = new SingleTask { onEnded => { Debug.Log( "1" ); onEnded(); }, onEnded => { Debug.Log( "2" ); onEnded(); }, onEnded => { Debug.Log( "3" ); onEnded(); }, }; task.Play( () => Debug.Log( "完了" ) ); 関連記事

【C#】独自のクラスでコレクション初期化子を使用できるようにする その2

C#

using System; using System.Collections; using System.Collections.Generic; class MyList : IEnumerable { private List<int> mList = new List<int>(); public void Add( int item ) { mList.Add( item ); } public void Add( int item1, int item2 ) { mList.Add(</int></int>…

【Unity】DictionaryでIEqualityComparerを使用した場合と使用しなかった場合のどちらが高速か検証しました

Unite 2016の「モバイル端末向けのUnityアプリケーションの最適化実践テクニック」 の講演において、Dictionaryのキーに列挙型を使用した場合、 ボックス化が発生してしまい、メモリを余分に消費してしまうとのことだったので ボックス化を回避するためにIEq…

【Unity】Dictionaryのキーに列挙型を使用した時のボックス化によるメモリ消費を回避する

Unite 2016の「モバイル端末向けのUnityアプリケーションの最適化実践テクニック」 の講演において、Dictionaryのキーに列挙型を使用した場合、 ボックス化が発生してしまい、メモリを余分に消費してしまうとのことでした ボックス化が発生してしまう例 publ…

【Unity】【Tips】汎用関数を定義してInstantiateを短く記述する

Before var goalEffect = GameObject.Instantiate( goalEffectPrefab ) as GameObject; After public static class UnityObjectUtils { public static GameObject Instantiate( UnityEngine.Object original ) { return UnityEngine.Object.Instantiate( ori…

【Unity】【Tips】MonoBehaviourを継承したシングルトンではなくstaticクラスを使用する

Before public class ScoreManager : SingletonMonoBehaviour<ScoreManager> { public int Score { get; set; } } ScoreManager.Instance.Score += 100; After public static class ScoreManager { public static int Score { get; set; } } ScoreManager.Score += 100; と</scoremanager>…

【Unity】【Tips】Mathf.Clampを使用して処理を短く記述する

Before if ( pos.x > 1.5f ) { pos.x = 1.5f; } else if ( pos.x < -1.5f ) { pos.x = -1.5f; } After pos.x = Mathf.Clamp( pos.x, -1.5f, 1.5f );

【Unity】【Tips】拡張メソッドを定義してCollision2DのGetComponentを短く記述する

Before private void OnCollisionEnter2D( Collision2D other ) { var rigidBody = other.gameObject.GetComponent<Rigidbody2D>(); } After public static class Collision2DExtensions { public static T GetComponent<T>( this Collision2D self ) { return self.gameObje</t></rigidbody2d>…

【Unity】【Tips】拡張メソッドを定義して文字列判定を短く記述する

Before if ( other.collider.tag == "Enemy" || other.collider.tag == "Wall" || other.collider.tag == "Bullet" ) { ... } After using System.Linq; public static class GenericExtensions { public static bool ContainsAny<T>( this T self, params T[] </t>…

【C#】GroupByでリストをグループ化する時に複数のキーを指定する

C#

// アイテムタイプ enum ITEM_TYPE { FREE_MONEY, // 無料通貨 PAY_MONEY , // 有料通貨 RECOVERY , // 回復アイテム EQUIPMENT , // 装備アイテム OTHER , // その他 } // アイテム情報 class ItemData { public int mId ; // ID public ITEM_TYPE mType ; …

【C#】並列でタスクを管理する独自クラス

C#

var task = new MultiTask(); task.Add( onEnded => { Debug.Log( "1" ); onEnded(); } ); task.Add( onEnded => { Debug.Log( "2" ); onEnded(); } ); task.Add( onEnded => { Debug.Log( "3" ); onEnded(); } ); task.Play( () => { Debug.Log( "completed…

【C#】直列でタスクを管理する独自クラス

C#

var task = new SingleTask(); task.Add( onEnded => { Debug.Log( "1" ); onEnded(); } ); task.Add( onEnded => { Debug.Log( "2" ); onEnded(); } ); task.Add( onEnded => { Debug.Log( "3" ); onEnded(); } ); task.Play( () => { Debug.Log( "complete…

【C#】リストが変更された時にコールバック関数が呼び出される独自クラス

C#

SelectableList<int> mSelectedList = new SelectableList<int>(); void Awake() { // リストが変更された時に呼び出されるコールバック関数を登録します mSelectedList.mChanged += () => Debug.Log( mSelectedList.Count ); // リストに要素を挿入します mSelectedLi</int></int>…

【C#】値が変更された時にコールバック関数が呼び出される独自クラス

C#

Selectable<int> mSelectedValue = new Selectable<int>(); void Awake() { // 値が変更された時に呼び出されるコールバック関数を登録します mSelectedValue.mChanged += value => Debug.Log( value ); // 値を変更します(コールバック関数が呼び出されます) mSelec</int></int>…

【C#】配列やリストから重複している要素を抽出する拡張メソッド

public static class IListExtensions { /// <summary> /// 重複している要素を抽出して返します /// </summary> public static T[] GetDistinct<T>( this IList<T> self ) { var uniqueList = new List<T>(); var result = new List<T>(); foreach ( var n in self ) { if ( uniqueList.Con</t></t></t></t>…

【C#】サロゲート文字の場合 true を返す関数「char.IsSurrogate」

C#

if ( char.IsSurrogate( ch ) ) { } UnityでNGUIを使用して入力欄を作成した時に 特定のAndroid端末で絵文字を入力されると アプリが強制終了する不具合に遭遇したため その不具合の回避するために調査している時に知りました

【おすすめスライド】「T4使ってみた」

T4使ってみた from Ryota Murohoshi

【おすすめスライド】「T4 Template 入門」

T4 Template 入門 from Hiroshi Maekawa

【C#】規定値を指定できるElementAtOrDefault拡張メソッド

using System; using System.Collections.Generic; public static class IListExtensions { /// <summary> /// <para>シーケンス内の指定されたインデックス位置にある要素を返します。</para> /// <para>インデックスが範囲外の場合は既定値を返します。</para> /// </summary> public static T ElementAt…

【Unity】error CS8025: Parsing error

ソースコードに全角スペースが入力されている時に遭遇

【C#】List<List<T>>型のインスタンスを平坦化する方法

C#

using System.Collections.Generic; using System.Linq; ... var list = new List<List<int>>(); var result = list.SelectMany( c => c ).ToList();</list<int>

【C#】LitJSONで出力される文字列を整形する

C#

using LitJson; using System.Text; public static class JsonUtils { public static string ToJson<T>( T obj ) { var builder = new StringBuilder(); var writer = new JsonWriter( builder ) { PrettyPrint = true }; JsonMapper.ToJson( obj, writer ); re</t>…

【C#】InvalidCastException: Cannot cast from source type to destination type.

InvalidCastException: Cannot cast from source type to destination type. object型の変数をキャストした時に遭遇 例えば下記のようにint型の値をobject型の変数に代入して 取り出す時に直接float型など別の型にキャストしようとすると発生 int x = 1; obj…

【C#】指定されたファイルのサイズを返す関数

C#

using System.IO; public static class FileInfoUtils { /// <summary> /// 現在のファイルのサイズをバイト単位で取得します /// </summary> public static long GetFileSize( string path ) { return new FileInfo( path ).Length; } }

【C#】指定された文字列を末尾から削除する拡張メソッド

public static class StringExtensions { /// <summary> /// <para>指定された文字列がこのインスタンス内で最後に見つかった場合、</para> /// <para>その文字列を削除した新しい文字列を返します</para> /// </summary> public static string RemoveAtLast( this string self, string value ) { return s…

【C#】UNIX時間を求める拡張メソッド

参考サイト様 UNIX時間を求めるには?[C#、VB] − @IT

【C#】偶数かどうかを返す拡張メソッド

public static class IntExtensions { /// <summary> /// 偶数かどうかを返します /// </summary> public static bool IsEven( this int self ) { return self % 2 == 0; } } int n1 = 1; int n2 = 2; n1.IsEven(); // False n2.IsEven(); // True

【C#】奇数かどうかを返す拡張メソッド

public static class IntExtensions { /// <summary> /// 奇数かどうかを返します /// </summary> public static bool IsOdd( this int self ) { return self % 2 == 1; } } int n1 = 1; int n2 = 2; n1.IsOdd(); // True n2.IsOdd(); // False

【C#】指定したディレクトリ内から指定したいずれかの拡張子を持つすべてのファイルのパスを返す関数

C#

using System.IO; using System.Linq; public static class DirectoryUtils { /// <summary> /// 指定したディレクトリ内の指定したいずれかの拡張子を持つファイル名 (パスを含む) を返します /// </summary> public static string[] GetFiles( string path, params string[] e…

【C#】文字列の末尾が指定されたいずれかの文字列と一致するかどうかを判断する拡張メソッド

using System; using System.Globalization; using System.Linq; public static class StringExtensions { /// <summary> /// <para>この文字列インスタンスの末尾が、</para> /// <para>指定したいずれかの文字列と一致するかどうかを判断します</para> /// </summary> public static bool EndsWith( this…

【C#】Pathクラスの拡張メソッド

var path = "Assets/Prefabs/Player.prefab"; path.GetDirectoryName(); // Assets/Prefabs path.GetExtension(); // .prefab path.GetFileName(); // Player.prefab path.GetFileNameWithoutExtension(); // Player path.GetFullPath(); // XXXX\Assets\Pre…

【C#】デリゲートが登録されているかどうかを返す拡張メソッド

using System; public static class MulticastDelegateExtensions { public static bool IsNullOrEmpty( this MulticastDelegate self ) { if ( self == null || self.GetInvocationList() == null ) { return true; } return self.GetInvocationList().Leng…

【Unity】作った汎用関数まとめ

.NET Framework int 【C#】ラップアラウンド関数を定義する - コガネブログ 【C#】 数値を加算して、範囲を超えた分は 0 からの値として処理して返す拡張メソッド - コガネブログ 【C#】数値を3桁カンマ区切りの文字列に変換する拡張メソッド - コガネブログ…

【C#】ListをStackの様に扱うための拡張メソッド

public static class ListExtensions { /// <summary> /// 先頭にあるオブジェクトを削除せずに返します /// </summary> public static T Peek<T>( this IList<T> self ) { return self[ 0 ]; } /// <summary> /// 先頭にあるオブジェクトを削除し、返します /// </summary> public static T Pop<T>( this IL</t></t></t>…

【C#】ListをQueueの様に扱うための拡張メソッド

public static class ListExtensions { /// <summary> /// 先頭にあるオブジェクトを削除し、返します /// </summary> public static T Dequeue<T>( this IList<T> self ) { var result = self[ 0 ]; self.RemoveAt( 0 ); return result; } /// <summary> /// 末尾にオブジェクトを追加します /</summary></t></t>…

【C#】Func<bool>に登録されているいずれかのデリゲートがtrueを返すかどうかを確認する拡張メソッド

Func<bool> func = null; func += () => true ; func += () => false; func += () => true ; func += () => false; func.Any(); // True 類似記事 【C#】Func<bool>に登録されているすべてのデリゲートがtrueを返すかどうかを確認する拡張メソッド - コガネブログ</bool></bool>