PaperSloth’s diary

Unity(C#)、UE4(Blueprint/C++)についての記事を書いたり日常のことをつぶやきます。

Unityの開発応用2(C#が好きになるお話)

 

※11/28 ソースコードを修正しました。

Int.Parseだと危険だということで

TryParseに変更しました。

合っているかはちょっと自信ないです;つД`)

 

こんちは!

 

お陰様で、前回のUnitychanおっぱ・・・UE4の記事は大人気でした。

ですが、今回はUnity C#の話になりますw

 

C/C++erからすれば、C#Javaを始めた時に嫌な点は多いでしょう。

特にその代表格とも言えるのが

GC(garbage collection)ですよ( ゚Д゚)

メモリリークか!!?と感じさせるあの不安。

勝手にメモリを弄らないでくれ~と嘆いたことでしょう。

 

ですが、そんなC/C++erさんやプログラマになりたての方達が

お!!C#もいいじゃん!

と思えるような内容になればと思っています。

 

 

 

私がC#を好きになった機能の一つが

ExtensinonMethod(拡張メソッド)です。

 

拡張メソッドを使用することで

新規の型の作成などの手間をかけずに既存のメソッドの拡張が行えます。

また、元の型の変更も行わず元の型のメソッドのように呼び出すことが出来ます。

 

文章にすると思ったよりややこしいですね('ω')

 

長々と説明しても仕方ないので、簡単なコードを公開します。

.NET Frameworkで生きてきた本物のC#使いではないため

Unityのコードになりますがw

 

以前の 誤りがあったソースコードがこちらです。

// stringに関する拡張メソッドの追加
public static class ExtensionString
{     // 文字列を数値変換する
    public static int ParseInt(this string str)
{         return int.Parse(str);
}
}

 

TryParseに修正してみましたが、誤りがあれば教えてください( ;∀;)

using UnityEngine;

// 文字列を数値変換する
public static int ParseInt(this string str)
{
int number;
bool result = int.TryParse(str, out number);

if (result)
{
return number;
}
else
{
Debug.LogWarning("IntのParseに失敗しました");
return number;
}
}

これ、失敗しても結局値返してるからだめじゃないか・・・
すいませんw また後日ちゃんと修正します・・・

 

 

使い方はこんな感じです。

string str = "1010";
int value = str.ParseInt();
print(value);

これで1010がOutputされますね。 

 

かなりシンプルなコードになりますね。

また、Unityの機能を使うわけではないので、

using UnityEngine;
using System.Collections;

といった宣言も不要です。

 

 

注意点はクラスをstaticで作成し、メソッドも全てstatic宣言が必要なことです。

ここは通常のクラス作成とは少し違いますね。

 

それと注意点がもう一つ

引数がthis stringとありますね。

しかし、使用する際には引数は不要です。

宣言時の引数は拡張元の型になります。(確かそうだったはず・・・)

 

 

また、拡張メソッドはUnityで独自に作られた型に対しても拡張できます。

例えばTransformに対して

// 回転角の初期化
public static void ResetRotation(this Transform trans){
    trans.rotation = Quaternion.identity; }

といったように追加をすることが可能です。

 

Unityを使っているとどうしても歯がゆい手の届かない部分は出てきます。

全てを解決できるわけではありませんが、

これで少しは気になる点を改善できそうですね(*´ω`*)

 

 

 

今回は短めになりますが、この辺で失礼します!

最後にUnitychanの可愛い姿でしめましょう!

f:id:PaperSloth:20141123025119j:plain

ではまた!