Unityで使える便利関数(拡張メソッド)達

#はじめに

約一年半「Unity」を使ってきて、よく使う機能やよく繰り返す機能を
たくさん作ってきたので、それらの一部分をいくつかのクラスにまとめて公表したいと思います！

そのまま使って頂いても構いませんし、
これらのアイデアを元に、更にいいものを作り上げて欲しいとも思っています
（それが出来上がったら是非コピp、、、もとい、参考にさせていただきたいです）

#公表場所

以下のリポジトリにあります。
※C#7.0以上が必要です。
https://github.com/nomeimei/NerScript



#機能紹介

ここでは内容されている機能の一部分を説明したいと思います。

機能は全て、namespace NerScriptにまとめてありますので、
```using NerScript;```

を忘れずにお書きください

##ComponentExtend
###アタッチされているRigidBodyやColliderの取得
```
gameObject.GetRigidBody();
gameObject.GetRigidBody2D();
gameObject.GetCollider();
gameObject.GetCollider2D();
```

##GameObjectExtend
###ありそうで無い便利なやつ


```
gameObject.Destroy();
gameObject.DontDestroyOnLoad();
gameObject.AddChild([オブジェクト]);
```
###一番近いObjectを返してくれる
```
gameObject.GetClosestObjectInList([Objectのリスト]);
```

##RigidBodyExtend
###RigidBodyのFreeze操作
一時期とてもお世話になった

```
rigidbody.UnFreezeAll(); //Freeze全解除
rigidbody.FreezePosY(); //PositionYのみ凍結
rigidbody.UnFreezeRotation(); //Rotationの凍結解除
rigidbody　//もちろんRigidbodyConstraintsで設定可能
.Freeze(RigidbodyConstraints.FreezePositionX | RigidbodyConstraints.FreezePositionY);
```
内部実装を久しぶりに見たらString で1と0を管理しててビビった。
今ならビット使おうぜってなる代物。修正はしない。

##StringExtend
###文字列を数値に変換


```
int num = "12345".Int(); //Int(12345)
```

###文字列を反転


```
"あいうえお".Reverse(); //おえういあ
```

##UnityExtend
###デバックがすこし捗る

```
int num = 5000.DebugLog(); //num:5000
string str = "ほげ".DebugLog(); //str;"ほげ"
```
代入するついでにLog表示してくれます。
こんなこともできちゃいます。

```
int num = 5000.DebugLog() + 300;
float length = new Vector3(12, 34, 56).DebugLog().magnitude;
```
この場合もしっかりと値が入ります。

##Colors

大量の色が定義されています。

これに関しては自分で作ったものではなく、他人のものなのですが、
どこにあったか見つけ次第リンクを張っておきます。

追記：見つけました。こちらを参考にさせていただきました。
http://baba-s.hatenablog.com/entry/2017/12/28/145900

##EnumLib

###int->Enum変換

```
MyEnum enum = 3.ToEnumName<MyEnum>();
```
面倒くさい処理(「()」が多すぎる)を一発で出来ます。


##GizmosLib


これに関しても他者のものを自分なりに拡張したものです。

参考にしたもの
https://github.com/code-beans/GizmoExtensions


##ListLib

よく使うものたちです。
速度？気にしたら負けです。
人間様が使いやすいので問題ないです。

###要素数を変更

```
list.Cut(5); //max = 5
list.Fill(10); // min = 10
list.SetCount(7); //count = 7
```

###最後の要素を削除

```
list.RemoveFirst();
```

###配列/リストに変換

```
int num = 10;
int[] nums = num.ShiftArray();
//nums : {10}
int[] nums2 = num.ShiftArray(30,40,700);
//nums2 : {10,30,40,700}
```

##MathLib

##intのClamp

this ref により、そのモノの変更が可能

```
int num = 10;
num.Clamp(0, 5);
//num : 5
```

```num = num.Clamp(0,5);```にする必要がない！！

##RandomLib

ここには様々なRandomがあります


```Color   ```で色,```PointInCircle```で円の中の一点など


##ReflectionLib

使う人は使う```System.Reflection```

これが必要になるほどの人はきっと説明がなくても使いこなせるでしょう。

##RectLib

###AddやSet,Addedなど


```Add    ```や、```Added ```がありますが、
Add,SetはRectそのものを操作します。
対して、Added,Setedは操作された、別物を返します。

###例
```
rect
.AddedPosX(10)　//x += 10
.SetedPosY(-20.5f) // y = -20.5
.SetedSize(100, 120);size = 100,120
```
よくこんな使い方をしています。
メソッドチェーン使いやすい。

ちなみに前述のListLibもチェーンできるように設計されています。

##TransformExtend

##Positionなどを変更



```
transform.AddPosX(10); //x += 10
transform.SetLclPos(0, -1, 20); /LocalPosition = 0,-1,20
transform.SetSclY(4); //LocalScale = 4,4,4
transform.AddPosX(10).SetSclY(4).SetLclPos(0, -1, 20); 
```

これも割と使いやすいです。
速度？メモリ？知らん。

##VectorLib

###変換

```
Vector2 v2 = new Vector2(2,3);
Vector3 v3 = v2.ToVec3().OXY; 
//v3 : 0,2,3
```

###並び替え
```
v3 = v3.SortVec3().YZX;
//v3 : 2,3,0

v3 = v3.SortVec3().OYY;
//v3 : 0,3,3
```


###応用
```
//v3 : 1,2,3
v3 = v3
.AddedX(3) //4,2,3
.SetedZ(-2) //4,2,-2
.AddedAxis(Axis.Y, 5) //4,7,-2
.Clamp(Vector3.zero, new Vector3(5, 5, 5)) // 4,5,0
.MergeVec3(new Vector3(22, 33, 44))["xXy"]; //4,22,5
```



#終わりに

これからも追加されていくとおもうので
参考がてらに覗いて見ていってください