Upload
yoshifumi-kawai
View
27.146
Download
5
Embed Size (px)
DESCRIPTION
LINQ in Unity LINQ to GameObject - https://github.com/neuecc/LINQ-to-GameObject-for-Unity/ UniRx - https://github.com/neuecc/UniRx
Citation preview
@仕事
C#
@個人活動
http://neue.cc/
@neuecc
https://github.com/neuecc/UniRx
神獄のヴァルハラゲート
モンスタハンターロアオブカード
http://gihyo.jp/dev/serial/01/grani/0001
http://grani.jp/recruit
using
WindowsWinForms, WPF
MacXamarin.Mac
Windows TabletWindows Store Application
Web ApplicationASP.NET MVC/Web API, OWIN
CloudMicrosoft Azure, AWS
C# Everywhere
GameUnity, PlayStation Mobile SDK
MobileXamarin.iOS
Xamarin.Android
Windows Phone 8 SDK
EmbeddedWindows Embedded
.NET Micro Framework
NUIKinect, LeapMotion
WindowsWinForms, WPF
MacXamarin.Mac
Windows TabletWindows Store Application
Web ApplicationASP.NET MVC/WebAPI, OWIN
CloudMicrosoft Azure, AWS
C# Everywhere - Current
GameUnity, PlayStation Mobile SDK
MobileXamarin.iOS
Xamarin.Android
Windows Phone 8 SDK
EmbeddedWindows Embedded
.NET Micro Framework
NUIKinect, LeapMotion
WindowsWinForms, WPF
MacXamarin.Mac
Windows TabletWindows Store Application
Web ApplicationASP.NET MVC/WebAPI, OWIN
CloudMicrosoft Azure, AWS
C# Everywhere - Future
GameUnity, PlayStation Mobile SDK
MobileXamarin.iOS
Xamarin.Android
Windows Phone 8 SDK
EmbeddedWindows Embedded
.NET Micro Framework
NUIKinect, LeapMotion
サーバーもクライアントもC#
同一ソリューションファイルに格納
言語依存を強みに変える
サーバーサイド(C#/ASP.NET)とクライアントサイド(Unity)でデータ共有
Introduction to LINQ
Java/Delphi
Generics
LINQ
dynamic
async
2002 C# 1.0
2005 C# 2.02008 C# 3.0
2010 C# 4.02012 C# 5.0LINQ
anonymous method
yield return
Java/Delphi
Generics
LINQ
dynamic
async
2002 C# 1.0
2005 C# 2.02008 C# 3.0
2010 C# 4.02012 C# 5.0LINQ
anonymous method
yield returnC# 4.0以降Unity非対応の壁(本当にはよ対応して欲しい)
LINQ...
SQLみたいなもの?
似てる、半分正しい。
var query = from x in source
where x % 2 == 0
select x * x;
Language INtegrated Query
Unityでの実用上の場合は
// クエリ構文
var query = from x in source
where x % 2 == 0
select x * x;
// メソッド構文
var query = source
.Where(x => x % 2 == 0)
.Select(x => x * x);
// クエリ構文
var query = from x in source
where x % 2 == 0
select x * x;
// メソッド構文
var query = source
.Where(x => x % 2 == 0)
.Select(x => x * x);
メソッド構文のほうが機能が多い(使えるメソッド数が多い)&ラムダ式に慣れれば書きやすいので、基本的にはメソッド構文で書くのをお薦めします
(IntelliSenseでメソッドチェーン楽しい!)
// 列挙してフィルタリングして詰め直すvar list = new List<int>();
foreach (var item in source){
if (item % 2 == 0){
list.Add(item);}
}
// 列挙してフィルタリングして詰め直すvar array = source.Where(x => x % 2 == 0).ToArray();
(source = IEnumerable<int>)・LINQは一行で済む・一時変数(List<T>)の宣言が不要・配列がカジュアルに使える
フィルタして変形して詰め直しは頻出パターン(pythonでのリスト内包表記とかに相当)
// 列挙してフィルタリングして詰め直す// + 日付を足したのを加えるvar list = new List<DateTime>();
foreach (var item in source){
if (item % 2 == 0){
list.Add(DateTime.Now.AddDays(item));}
}
// 列挙してフィルタリングして詰め直す// + 日付を足したのを加えるvar array = source
.Where(x => x % 2 == 0)
.Select(x => DateTime.Now.AddDays(x))
.ToArray();
Takeの他にSkipとか条件つきのTakeWhile/SkipWhileなどもあるよ
// 列挙してフィルタリングして詰め直す// + 日付を足したのを加える// を、4個分だけ取得するvar list = new List<DateTime>();
foreach (var item in source){
if (item % 2 == 0){
list.Add(DateTime.Now.AddDays(item));}
if (list.Count == 4) break;}
// 列挙してフィルタリングして詰め直す// + 日付を足したのを加える// を、4個分だけ取得するvar array = source
.Where(x => x % 2 == 0)
.Select(x => DateTime.Now.AddDays(x))
.Take(4)
.ToArray();
値がかぶった時に別の値で比較する、というのもThenBy/ThenByDescendingでつなげるだけで
出来るのが普通のSortよりも強い
// 列挙してフィルタリングして詰め直す// + 日付を足したのを加える// を、4個分だけ取得する// を、降順にソートするvar list = new List<DateTime>();
foreach (var item in source){
if (item % 2 == 0){
list.Add(DateTime.Now.AddDays(item));}
if (list.Count == 4) break;}list.Sort((x, y) => -x.CompareTo(y));
// 列挙してフィルタリングして詰め直す// + 日付を足したのを加える// を、4個分だけ取得する// を、降順にソートするvar array = source
.Where(x => x % 2 == 0)
.Select(x => DateTime.Now.AddDays(x))
.Take(4)
.OrderByDescending(x => x)
.ToArray();
foreachでいい?
機能が弱ければ弱いほどコードが意図を伝える
単機能だからこそ、見ただけで何をやっているのか分かる。それに加えて短く書けるが故に書きやすいし、そのこと自
体が読みやすさにも寄与する
合成可能であるということ
C#はIntelliSense指向言語 UnityもVisual Studioで書こう(少なくとも素エディタはやめよう)
In Unity
データソースを見つけよう
Unityにおいて、例えば?
// Unityで活かせるLINQの底力!! (後編) からの引用// http://gamesonytablet.blogspot.jp/2013/01/unitylinq_24.html
// ターゲットに最も近い順で、5つのタグつきオブジェクトのレンダラのマテリアルを取得するvar materials = GameObject.FindGameObjectsWithTag("sometag")
.Select(r => r.renderer)
.Where(r => r != null)
.OrderBy(r => (r.transform.position - transform.position).sqrMagnitude)
.Take(5)
.SelectMany(r => r.materials)
.ToList();
配列っぽいもの見つけたら、必ず何か使える。LINQで考える事が習慣化されれば、LINQ firstで発想は浮かぶ。
データソースを作り出す
http://neue.cc/2014/11/11_482.html
https://github.com/neuecc/LINQ-to-GameObject-for-Unity
// 子孫方向の全ゲームオブジェクトのうちtagが"foobar"のオブジェクトを破壊origin.Descendants().Where(x => x.tag == "foobar").Destroy();
// 自分を含む子ノードからBoxCollider2Dを抽出var colliders = origin.ChildrenAndSelf().OfComponent<BoxCollider2D>();
// 自分の真下にPrefabをCloneして追加origin.Add(new[] { prefab, prefab, prefab });
死ぬ in iOS
http://neue.cc/2014/07/01_474.html
だが使うhttps://www.assetstore.unity3d.com/jp/#!/content/18131
Deep Dive LINQ
内部挙動気になる人へhttp://www.slideshare.net/neuecc/an-internal-of-linq-to-objects-29200657
Topics
IObservable<T>
IEnumerable<T>
(LINQ to Objects)
DataSetXML IQueryable
SQL Twitter
IEnumerable<T>
IObservable<T>
(Reactive Extensions)
UI
(ReactiveProperty)
OAuth
(ReactiveOAuth)IQbservable<T>
WMI
時間軸を基盤にしたLINQの新しい形
Pushスタイル、IObservable<T>
time
間隔は不定期でも可
終わりがなくてもいい(無限に続く)
DataSource
(IEnumerable<T>)
Action
値の要求(Pull)
DataSource
(IObservable<T>)
Action
値の送信(Push)
LINQ to Asynchronous/Events
http://neue.cc/2014/08/23_476.html
https://github.com/neuecc/UniRx
http://u3d.as/content/7tT
Reactive Game Architecture
Binding, ReactiveStateMachine, etc
https://www.assetstore.unity3d.com/jp/#!/content/14381
メジャーライブラリとなることでより安心して使える
よう前進
Conclusion
C#使うならLINQ使わなきゃmottainai
ところで性能は?