Your SlideShare is downloading. ×
Unityでもう少しc#を書きたい人のためのLINQ入門
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

Unityでもう少しc#を書きたい人のためのLINQ入門

0
views

Published on

UnityのためのC#勉強会

UnityのためのC#勉強会

Published in: Technology

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
0
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • 手続型と宣言型、宣言型はインフラの世界でもトレンドというか。今後はノンプログラマでの書けるこちらの方ががが
  • ライブリアンや数万回まわるようなループでなければ
  • ライブラリや描画のコア、何万回も呼ばれない限り
  • ROMからRAMにもってくるとか
  • Transcript

    • 1. Unityでもう少し C#を書きたい人 のためのLINQ入門 Write by 森理 麟 2015/03/21 UnityのためのC#勉強会
    • 2. Myself HN:森理 麟(@moririring) 職業:ゲームプログラマ 著書: Unity5 3Dゲーム開発講座 表彰:Microsoft MVP for .NET 2
    • 3. My Community VSハッカソン倶楽部 +Visual Studio勉強会 C++テンプレート完全ガイド読 書会 + EffectiveC#4.0読書会 Unityクリエイターズ 3
    • 4. 今日のゴール 次にUnityでC#を書く時に LINQ使ってみようかなーと 思ってもらうこと。 4
    • 5. 今日の あるある 恐らくLINQの話になると言わ れるネタ。この話は帰るまで に忘れて良いです 5
    • 6. No LinQ 福岡のアイドルグループ 6
    • 7. No Lync Microsoft Office Apply 7
    • 8. Yes Linq Language-Integrated Query 8
    • 9. 今後のゴール まあでも実際LINQでぐぐると 福岡のアイドルに負ける LINQと言えばLanguage- Integrated Queryになるように 知名度を上げていこう! 9
    • 10. LINQ概要 10
    • 11. 今日の あるある 本来プログラムなんてどう書 いても良い 11
    • 12. 今日の あるある その中でLINQを使うメリット 12
    • 13. 今日の あるある 僕がプログラムを書いている うちに作ったルール 13
    • 14. 今日の あるある もし、これに共感出来るなら ば、是非ともLINQを使うべき 14
    • 15. 今日の あるある Simple is best. 15
    • 16. 今日の あるある Short is better 16
    • 17. 今日の あるある LINQはパッと見、かなり独特 な記法。 17
    • 18. 今日の あるある それゆえ理解が難しいという 印象を受ける人もいる 18
    • 19. 今日の あるある しかし、特殊に書くのは、削 ぎ落とすための必然性 19
    • 20. 今日の あるある 本来ループやメソッドは意図 を伝えるのに冗長な書き方 20
    • 21. 今日の あるある 誤解を恐れずに言うと、LINQ の宣言的な書き方こそが最善 ループ命令(開始値、終了値). 処理命令(条件式) loop(1,10).Func(x *x); ↓ Range(1,10).Where(x =>x * x); 21
    • 22. 今日の あるある 自分のプログラムをシンプル にしたいならLINQ使おう! 22
    • 23. VisualStudio概要 23
    • 24. 今日の あるある WindowsでC#を書くのであれ ばVisual Studioはmust 24
    • 25. 今日の あるある MonoDevelopが悪いのではな くVisual Studioが良すぎなだけ 25
    • 26. 今日の あるある VSの良さとは良く出来た道具 の良さ。使うほど手に馴染む。 26
    • 27. 今日の あるある VSの機能の中でも最高の一つ。 インテリセンスが使える 27
    • 28. 今日の あるある Macなどでテキストエディタ を使うならOmniSharpを 28
    • 29. 今日の あるある でもお高いんでしょう? 29
    • 30. 今日の あるある はい。6万円です Visual Studio Professional 2013 64584円 30
    • 31. 今日の あるある 2014年11月11日までは。。。 31
    • 32. 今日の あるある 今ならVisual Studio Community とVisual StudioTools for Unity。 両方揃えても個人なら無料 32
    • 33. 今日の あるある Unity5だとAsserts->Import Package->Visual Studio 2013 Toolsがない 33
    • 34. 今日の あるある Asserts->Import Package- >Custom Package C:Program Files (x86)MicrosoftVisual StudioTools for Unity2013からVisual Studio 2013Tools.unitypackage を選択 34
    • 35. 今日の あるある DEMO 35
    • 36. LINQ導入 36
    • 37. 今日の あるある 例えばボタンを叩く毎に出現 する大量のUnityちゃん 37
    • 38. 今日の あるある 大量のUniyちゃんから特定の 条件のUnityちゃんを探す GameObject.FindGameObjectsW ithTag("Player"); 38
    • 39. 今日の あるある var varは型を宣言しなくても値か ら自動的に割り当ててくれる 機能。長い型名もシンプルに  int a1 = 1;  var a2 = 1; 39
    • 40. 今日の あるある コレクション 動的なオブジェクトの管理に 使う。配列は要素変更が手間、 オブジェクトは大分シンプル 必ずジェネリック版で! var coins = new List<T>(); 40
    • 41. 今日の あるある ジェネリック ジェネリックはどんな型でも 同じ処理をしたい時に使う public void Swap<T>(ref T x, ref T y) { var t = x; y = x; x = t; } 41
    • 42. 今日の あるある 普通に書くとこう  var hitCoins = new List<GameObject>();  foreach (var coin in coins)  {  if (coin.transform.position.y > 1.0f)  {  hitCoins.Add(coin);  }  } 42
    • 43. 今日の あるある LINQを使って書けばこう var hitCoins = coins  .Where(x => x.transform.position.y > 1.0f); 43
    • 44. 今日の あるある 先ずWhereメソッドに処理を 切り出してみる private List<GameObject> Where(GameObject[] coins) { var hitCoins = new List<GameObject>(); foreach (var coin in coins) { if (coin.transform.position.y > 1.0f) { hitCoins.Add(coin); } } return hitCoins; } 44
    • 45. 今日の あるある ループで回して特定の条件に あったリストを返すメソッド 「特定の条件」を渡せられる とより使いやすくなる そのためには「メソッド」を 引数として渡せれば 45
    • 46. 今日の あるある デリゲード メソッドをdelegate型にすると変 数みたいに扱える 書き方がちょっと特殊なので ActionかFuncを使う方がシンプル  public void Where(Func<int, bool> func)  {  func(1);  } 46
    • 47. 今日の あるある 渡すのにいちいちメソッドを 作ることすら面倒? 分かる。メソッド化は地味に 面倒。シンプルにしたいと。 47
    • 48. 今日の あるある ラムダ式 メソッド名を付けなくても作 ることが出来るメソッド Enumerable.Range(1, 10)  .Select(x => x * x); 48
    • 49. 今日の あるある  1 private bool TopSelect(GameObject obj)  {  return (obj.transform.position.y > 1.0f);  }  2 private bool TopSelect(GameObject obj) => return (obj.transform.position.y > 1.0f);  3. bool (GameObject obj) => return (obj.transform.position.y > 1.0f);  4.型推論 (obj) => return (obj.transform.position.y > 1.0f);  5. ()不要 obj => return obj.transform.position.y > 1.0f;  6. return不要 obj => obj.transform.position.y > 1.0f 49
    • 50. 今日の あるある LINQのメソッドはコマンド ラインのパイプのように幾 つもつなぐことが出来る  var coins2 = GameObject.FindGameObjectsWithTag("Player")  .Where(c => c.transform.position.y > 1.0f)  .OrderByDescending(c => c.transform.position.y)  .First(); 50
    • 51. 今日の あるある Select(Where(coins)); と書いた。でも繋ぐなら coins.Where().Select(); と書けた方がシンプル。 ただcoinsはList<GameObject> 型なのでメソッドが足せない。 51
    • 52. 今日の あるある 拡張メソッド 既存のクラスに変更を加える ことなくメソッドを追加でき る機能 "test".GetMyMethod(); 52
    • 53. 今日の あるある 53 First 最初の要素を返す Where 条件を満たす全てを返す Max 最大値を返す Any 条件を満たす要素が含まれ ているか OrderBy 昇順にソート Select 新しい要素にして返す
    • 54. 今日の あるある LINQは複数データから1個以上 のデータを取得、加工するの に向いている 54
    • 55. 今日の あるある プログラムではそういうシ チュエーションはとても多い。 ROMからRAMへ 55
    • 56. 今日の あるある 例えば、文字列も複数のデー タだし、巨大なデータベース も複数のデータ。 56
    • 57. 今日の あるある 慣れるまで兎に角LINQで書い てみるのもアリだと思う 57
    • 58. 今日の あるある 一部を除き無駄な書き方をし ても、体験出来るほど速度が 落ちることは少ない 58
    • 59. 今日の あるある その上でLINQが染みついてき たら効率も考える 59
    • 60. LINQ実践 60
    • 61. 今日の あるある 効率化のポイント1つ目は、 LINQはループを隠ぺいしてい るが中でグルグル回る。その 回数を少しでも減らすこと。 61
    • 62. 今日の あるある LINQは巨大なデータを取得し てくる。ごっそり取ってくる より必要分だけフィルタリン グする方が効率的 62
    • 63. 今日の あるある datas->OrderBy(…)->Where(…) と datas->Where(…)->OrderBy(…) ではループする回数が全然 違ってくる Whereはなるべく早く。 63
    • 64. 今日の あるある ポイントの2つ目は遅延実行 を意識する 64
    • 65. 今日の あるある ざっくり言うとデータは取っ てくるだけでは何もしていな いのと一緒。 意味があるのは取ってきたも のを変更する時 だからLINQは実体化されるま で実行されない いつ実体されるかはメソッド によって違う 65
    • 66. 今日の あるある Whereはその場で実体化され ない  var selectObjects = coins.Where(c => c.transform.position.y > 1.0f);  foreach (var o in selectObjects)  {  o.transform.localScale = new Vector3(3.0f, 3.0f, 3.0f);  } 66
    • 67. 今日の あるある IEnumerable<T> foreachで回すにはこれを実装 した型である必要がある LINQ で定義された拡張メソッ ドが使用可能になる 実装していると必要とされる まで実体化されない 67
    • 68. 今日の あるある yield return IEnumerable<T> を自作するの はちと面倒 yield returnを使えばシンプル な書き方が出来る 68
    • 69. 今日の あるある if(datas->Count(…) > 0) と if(datas->Any(…)) ではループする回数が全然 違ってくる 69
    • 70. 今日の あるある ループの回数を減らし、遅延 実行を正しく理解すればLINQ がボトルネックになることは 少ない(ないわけではない) 70
    • 71. LINQまとめ 71
    • 72. 今日の あるある 実際データを扱うものであれ ば大体LINQを使用可能 LINQ to Object LINQ to XML LINQ to SQL LINQ toTwiiter LINQ to Hadoop 72
    • 73. 今日の あるある 特に凄いのがLinq to Events Rx。まさに時魔法。Unityでも 使うことが出来る。この後! 73
    • 74. 今日の あるある iOSはAOT関連でLINQトラップ がある。nueuccさんのブログ やUniLinqあるよ! 74
    • 75. 今日の あるある LINQ LINQはvar,ジェネリックコレ クション、拡張メソッド、ラ ムダ式、IEnumerable<T>、 yieldなどC#の機能の集大成。 LINQを制すればC#を制した… は言い過ぎにしても初心者を 脱するのは間違いない 75
    • 76. 今日の matome LINQはSimple is best。LINQを 覚えればシンプルに出来る 僕がもっと言いたかったこと はLINQで書くの楽しい! その上バシバシソースが短く なる。これもう本当快感。 LINQにふれればきっとあなた もC#がもっと好きになる。 76
    • 77. 余談 サイト 基本は岩永さんの所で。 最近はQittaとかも 大阪で以前やった勉強会超 LINQ入門とか 77
    • 78. 余談 書籍 78
    • 79. 余談 ちょっと高いけれどReShaper。 リアルタイム赤ペン先生のよ うなツール。$149 79
    • 80. 余談 書籍 80
    • 81. おわりに ご清聴ありがとうございまし た 81