Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
torisoup
PDF, PPTX
3,368 views
コールバックと戦う話
Unity夏LT大会2017 http://peatix.com/event/288912/ の発表資料です
Technology
◦
Read more
3
Save
Share
Embed
Embed presentation
Download
Download as PDF, PPTX
1
/ 59
2
/ 59
3
/ 59
4
/ 59
5
/ 59
6
/ 59
7
/ 59
8
/ 59
9
/ 59
10
/ 59
11
/ 59
12
/ 59
13
/ 59
14
/ 59
15
/ 59
16
/ 59
17
/ 59
18
/ 59
19
/ 59
20
/ 59
21
/ 59
22
/ 59
23
/ 59
24
/ 59
25
/ 59
26
/ 59
27
/ 59
28
/ 59
29
/ 59
30
/ 59
31
/ 59
32
/ 59
33
/ 59
34
/ 59
35
/ 59
36
/ 59
37
/ 59
38
/ 59
39
/ 59
40
/ 59
41
/ 59
42
/ 59
43
/ 59
44
/ 59
45
/ 59
46
/ 59
47
/ 59
48
/ 59
49
/ 59
50
/ 59
51
/ 59
52
/ 59
53
/ 59
54
/ 59
55
/ 59
56
/ 59
57
/ 59
58
/ 59
59
/ 59
More Related Content
PDF
【Unity】 Behavior TreeでAIを作る
by
torisoup
PDF
UniTask入門
by
torisoup
PDF
Unityでパフォーマンスの良いUIを作る為のTips
by
Unity Technologies Japan K.K.
PDF
Riderはいいぞ!
by
UnityTechnologiesJapan002
PDF
Unity開発で使える設計の話+Zenjectの紹介
by
torisoup
PDF
UniRx完全に理解した
by
torisoup
PDF
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
by
UnityTechnologiesJapan002
PDF
ゲーム開発者のための C++11/C++14
by
Ryo Suzuki
【Unity】 Behavior TreeでAIを作る
by
torisoup
UniTask入門
by
torisoup
Unityでパフォーマンスの良いUIを作る為のTips
by
Unity Technologies Japan K.K.
Riderはいいぞ!
by
UnityTechnologiesJapan002
Unity開発で使える設計の話+Zenjectの紹介
by
torisoup
UniRx完全に理解した
by
torisoup
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
by
UnityTechnologiesJapan002
ゲーム開発者のための C++11/C++14
by
Ryo Suzuki
What's hot
PDF
Unityでオンラインゲーム作った話
by
torisoup
PDF
【Unity】Scriptable object 入門と活用例
by
Unity Technologies Japan K.K.
PDF
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
by
UnityTechnologiesJapan002
PDF
オンラインゲームの仕組みと工夫
by
Yuta Imai
PDF
MagicOnion入門
by
torisoup
PDF
バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~
by
エピック・ゲームズ・ジャパン Epic Games Japan
PPTX
未来のプログラミング技術をUnityで -UniRx-
by
torisoup
PDF
Observableで非同期処理
by
torisoup
PPTX
UniRxでMV(R)Pパターンをやってみた
by
torisoup
PDF
オブジェクト指向できていますか?
by
Moriharu Ohzu
PDF
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
by
Unity Technologies Japan K.K.
PDF
インタフェース完全に理解した
by
torisoup
PPTX
猫でも分かるUMG
by
エピック・ゲームズ・ジャパン Epic Games Japan
PDF
第1回UE4勉強会 in 大阪 - エンジン改造ってどうなの?
by
com044
PDF
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
by
Yoshifumi Kawai
PDF
今日からできる!簡単 .NET 高速化 Tips
by
Takaaki Suzuki
PDF
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
by
京大 マイコンクラブ
PPTX
UE4のためのより良いゲーム設計を理解しよう!
by
Masahiko Nakamura
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
by
Yoshifumi Kawai
PDF
Unityでオニオンアーキテクチャ
by
torisoup
Unityでオンラインゲーム作った話
by
torisoup
【Unity】Scriptable object 入門と活用例
by
Unity Technologies Japan K.K.
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
by
UnityTechnologiesJapan002
オンラインゲームの仕組みと工夫
by
Yuta Imai
MagicOnion入門
by
torisoup
バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~
by
エピック・ゲームズ・ジャパン Epic Games Japan
未来のプログラミング技術をUnityで -UniRx-
by
torisoup
Observableで非同期処理
by
torisoup
UniRxでMV(R)Pパターンをやってみた
by
torisoup
オブジェクト指向できていますか?
by
Moriharu Ohzu
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
by
Unity Technologies Japan K.K.
インタフェース完全に理解した
by
torisoup
猫でも分かるUMG
by
エピック・ゲームズ・ジャパン Epic Games Japan
第1回UE4勉強会 in 大阪 - エンジン改造ってどうなの?
by
com044
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
by
Yoshifumi Kawai
今日からできる!簡単 .NET 高速化 Tips
by
Takaaki Suzuki
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
by
京大 マイコンクラブ
UE4のためのより良いゲーム設計を理解しよう!
by
Masahiko Nakamura
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
by
Yoshifumi Kawai
Unityでオニオンアーキテクチャ
by
torisoup
More from torisoup
PDF
MagicOnion~C#でゲームサーバを開発しよう~
by
torisoup
PPTX
はじめてのUniRx
by
torisoup
PDF
ObserverパターンからはじめるUniRx
by
torisoup
PDF
Doozy UI 使おうぜ! #unity_lt
by
torisoup
PDF
Unityで作ったゲームをDLカードで配布してみた話 #roppongiunity
by
torisoup
PDF
UnityとNCMBでユーザ管理を実装してみた話
by
torisoup
PDF
ARでVRアバターを表示するシステムを構築しよう
by
torisoup
PDF
アバター生放送支援アプリ「アバれぽ」
by
torisoup
PPTX
みくみくまうすについて&Unity で使えるコーディングノウハウ
by
torisoup
PDF
Photon Cloud ことはじめ
by
torisoup
PDF
UniRxでPUNを使いやすくする
by
torisoup
PDF
Unity講習会(初級)
by
torisoup
PDF
Task vs Observable
by
torisoup
MagicOnion~C#でゲームサーバを開発しよう~
by
torisoup
はじめてのUniRx
by
torisoup
ObserverパターンからはじめるUniRx
by
torisoup
Doozy UI 使おうぜ! #unity_lt
by
torisoup
Unityで作ったゲームをDLカードで配布してみた話 #roppongiunity
by
torisoup
UnityとNCMBでユーザ管理を実装してみた話
by
torisoup
ARでVRアバターを表示するシステムを構築しよう
by
torisoup
アバター生放送支援アプリ「アバれぽ」
by
torisoup
みくみくまうすについて&Unity で使えるコーディングノウハウ
by
torisoup
Photon Cloud ことはじめ
by
torisoup
UniRxでPUNを使いやすくする
by
torisoup
Unity講習会(初級)
by
torisoup
Task vs Observable
by
torisoup
コールバックと戦う話
1.
コールバックと戦う話 2017/09/03 @toRisouP
2.
自己紹介 • 名前 とりすーぷ(@toRisouP) •
同人ゲームとか作ってます • 最近は割と忙しい – しごと – 同人ゲーム開発 – どんかつ
3.
今回の内容 ネトゲを作ってたら通信ラグや非同期処理だらけに なって死にそうな思いをしたので、 どうやってそこら辺の問題を解決したかを話す
4.
今回の内容 ネトゲを作ってたら通信ラグや非同期処理だらけに なって死にそうな思いをしたので、 どうやってそこら辺の問題を解決したかを話す 時間が足りないので話題をめっちゃしぼって 「コールバックとの戦い方」の話をします
5.
ハクレイフリーマーケット • 2016年1月からずっと作ってる東方二次創作ゲーム – 2017年10月リリース予定
6.
どんなゲーム? • アイテムを持って運んで、陣地に集めるゲーム • 試合終了時の合計点数が大きい方が勝ち
7.
使ってるフレームワークとか • Photon Cloud –
ネットワークゲーム用のクラウドサーバとAPI群を 提供してくれるサービス • Photon Unity Networking(PUN) – 上記 Photon CloundのUniyt向けSDK • ニフティクラウド mobile backend (NCMB) – ユーザやデータのDB管理やオブジェクトストレージを提供してくれ るサービス(mBaaS)
8.
非同期処理とコールバック
9.
ネトゲ開発は非同期通信だらけ • 通信があるせいでほとんど非同期処理だらけになる – 「ログインしてユーザ情報を取得する」のも非同期処理 –
「オブジェクトをインスタンス化する」だけでも非同期処理 – 「アイテムが今拾える状態か確認する」のも非同期処理 – 「全員の準備が完了するまで待つ」のも非同期処理
10.
非同期処理とコールバック • 非同期処理の面倒くさい部分ライブラリがなんとかしてくれる – スレッドの管理とか同期コンテキストとかは意識しなくてもいい •
一方で、これらライブラリはコールバック処理を多用している – 非同期処理の結果を受け取るにコールバック処理を使っている
11.
コールバック? • 非同期処理の実行後その結果を通知するために 関数を実行する手法 – 非同期処理の制御で一番シンプルで単純な実装 –
自分で任意の関数を登録するパターンや、決められた関数が実行される パターンがある • PUN、NCMBともにコールバックが大量に出て来る – ライブラリの実装が悪いとかいうわけではなく、 シンプルに作ればそうなるよね – ただしPUNテメーはだめだ
12.
NCMBのコールバック • NCMB – コールバック関数を自分で登録する コールバックの例:NCMBのログイン処理
13.
PUNのコールバック • PUN – イベントが発生すると既定の名前の関数が実行される –
例: • 誰かがゲームに参加した:OnPhotonPlayerConnected() • 部屋のリストが更新された:OnReceivedRoomListUpdate() – ちなみにPUNはコールバックの実装にSendMessageを使ってる • 旧Unity.Networkの実装に似せたのが原因 • このせいでめちゃくちゃ使い勝手が悪くなっている
14.
vs コールバック
15.
NCMBのコールバックを 使っていて発生する問題
16.
コールバックがネストしまくる • NCMBで ログイン
→ ステータス取得 → 更新して保存
17.
コールバックがネストしまくる • NCMBで ログイン
→ ステータス取得 → 更新して保存 ログインのコールバックブロック 詳細情報取得のコールバックブロック データ保存のコールバックブロック
18.
コールバックがネストすると… • エラーハンドリングが困難になる • 処理のスコープが曖昧になってしまう •
単純にインデントしまくって読みにくい • 人類の手に負えない
19.
一方のPUNで起きる問題
20.
PUNのコールバックの例 ←関数がバラバラに書いてあるだけで、 つながりが全く読めないコードみたいだけ どこれでちゃんと動きます
21.
PUNのコールバックの例
22.
PUNのコールバックの例 PUNを使って以下のフローを実装した例 ゲームサーバに繋ぐ ↓ ランダムな部屋に参加する ↓ 部屋に参加できたらシーン遷移 失敗したら新しく部屋を作る ↓ 部屋が作れたらシーン遷移 作るのに失敗したら終了
23.
PUNのコールバックの例 サーバに接続する処理を実行
24.
PUNのコールバックの例 成功 or 失敗でどっちかの処理に飛ぶ 成功時:OnJoinedLobby() 失敗時:OnFailedToConnetoToPhoton()
25.
PUNのコールバックの例 「ランダムな部屋に参加」 成功時:OnJoinedRoom() 失敗時:OnPhotonRandomJoinFailed()
26.
PUNのコールバックの例 参加できなかったので「新しく部屋を作る」 成功時:OnJoinedRoom() 失敗時:OnPhotonJoinRoomFailed()
27.
PUNのコールバックの例 同じメソッドが別の文脈で実行されうる ・ランダムな部屋に参加して成功したパターン ・新しく部屋を作ってその部屋に参加したパターン
28.
この形式のやばいところ • コードを見ても処理のつながりが全く把握できない – PUNのドキュメントを片手にコードを読まないとマジでわからない •
処理の文脈が途切れてしまう – 別の処理でも実行されるコールバックが同じだったりする場合、 このコールバックが何の処理に対するものなのかがわからない – そのためにわざわざフィールドに状態変数作るのめっちゃ馬鹿らしい
29.
コールバックのやばいところ • 自分で関数登録するスタイルコールバック(NCMB) – 処理を直列に連結したり、複数並列実行しようとすると ネスト地獄になって管理できなくなる •
既定の関数が呼び出されるコールバック(PUN) – 何を実行したらどの処理が次に実行されるのか?が把握しにくい – コード上から処理の文脈が失われて保守性が最悪になる
30.
コールバックは総じてヤバイ 素手で立ち向かうともれなく死ぬ
31.
コールバックと戦うための道具
32.
コールバックと戦うための道具 • Task – .NET
Framework 4 から搭載された並列処理の機構の1つ • 一連の処理を「Task」というかたまりにまとめて管理する • async/await と組み合わせると強くなる – JavaScriptでいうPromise / JavaでいうFutureに似てる • Observable – Reactive Extensionsで提案された概念 – Taskをめっちゃ高機能化したイメージ(ざっくりとした説明) • 複数のイベントメッセージに対応 • Schedulerでスレッドやタイミング管理ができる • Operatorでメッセージの連結、合成、加工ができる
33.
Taskを使う? Observableを使う? • 簡単な非同期処理であればTask
(async/await) で十分 • そこからさらに複雑な処理が必要になるならObservable(Rx)
34.
Taskを使う? Observableを使う? • 単純な非同期処理であればTaskで十分 •
そこからさらに複雑な処理が必要ならObservable(Rx) と、言われているがこれはあくまで Unityを使わないピュアなC#開発の話
35.
Unityだとどうなの? • Task – Unity
2017.1以降であれば MonoRuntimeを.NET 4.6にすれば使える • けど制約はある • それ以前のバージョンでもゴニョゴニョすれば使える – Unityでは導入に制約がある or 導入が面倒くさいのが難点 – 言語機能だけあって、async /await がめっちゃ強い • Observable – Unityなら「UniRx」を導入すれば使える – 表現力が高すぎてTaskと比べると学習コストが高い – Operatorとゲーム開発の親和性が高い
36.
とりあえずは慣れてる方を 使えばいいんじゃない? (自分はUniRxを多用するのでそのまま自然とObservable使うことになった)
37.
コールバックを Observableにしてしまおう
38.
コールバックをObservableにする例 • Observable.Createで コールバックごと処理を ラップしちゃう – 成功したらOnNextに結果を流す –
失敗したらOnErrorに例外を流す
39.
コールバックをObservableにする例 • Observable.Createで コールバックごと処理を ラップしちゃう – 成功したらOnNextに結果を流す –
失敗したらOnErrorに例外を流す コールバック関数の内部で Observerに値を渡す
40.
Observableに変換すれば • さっきのこのネストしまくってたやつが… ログインのコールバックブロック 詳細情報取得のコールバックブロック データ保存のコールバックブロック
41.
こうなる
42.
こうなる ネストがなくて処理がフラットになってる! データのフローもわかりやすい!(上から流れるように読める)
43.
Observableにするのが 面倒くさい?
44.
ライブラリ化しました • NcmbAsObservable – NCMBのUniRxラッパー –
https://github.com/TORISOUP/NcmbAsObservable • PhotonRx – PUNのUniRxラッパー – https://github.com/TORISOUP/PhotonRx • 両方ともgithubに公開しています – プルリクエストお待ちしております
45.
さらに応用として
46.
Taskのawaitを再現する
47.
コルーチンとObservable • コルーチンを使えばawaitを再現できる – Observableはコルーチン上でyield
returnで待機できる – 記述量はTask+awaitより増えちゃうけどね – コルーチンのデメリットを引き継ぐデメリットはある
48.
例:コルーチン上でObservableを待つ • OnCollisionEnter()をコルーチン上で待ってみる 衝突検知ストリーム(3秒でタイムアウト) 結果が出るまでコルーチン上で待つ 結果をif文で判定して処理の継続
49.
さっきのPUNのやつを書き換える
50.
1.サーバ接続のコルーチンを作る
51.
1.サーバ接続のコルーチンを作る サーバへの接続結果を待つObservable 結果のBooleanを返すyield return 通信待機のyield return
52.
1.サーバ接続のコルーチンを作る ←ここがawaitに相当する
53.
2.部屋に参加するコルーチンを作る
54.
2.部屋に参加するコルーチンを作る 部屋に繋ぐ方法は抽象化しておく
55.
3.これらを順番に呼び出すコルーチンを作る
56.
3.これらを順番に呼び出すコルーチンを作る Observable.FromCoroutineValue<T>を使うと コルーチンが yield return
した値を取得できる ↓ コルーチンをObservableに変換し、 それをawaitすることで同期的に処理を書ける
57.
3.これらを順番に呼び出すコルーチンを作る サーバに繋ぐコルーチン 失敗したら終了 成功したら次へ ランダムな部屋に参加するコルーチン 成功したらシーン遷移 失敗したら次へ 成功したらシーン遷移 失敗したら終了 部屋を作るコルーチン
58.
←これと比べたら記述量は増えてるけど、 処理のフローは見やすくなった(はず)
59.
まとめ • コールバックはそのまま扱うともれなく死を迎える – 仕組みが単純すぎて複雑なフローを表現できない –
TaskとかObservableとかのイケてる仕組みに載せるのが吉 • TaskとObservableのどっちを使うかは考えよう – ピュアなC#開発とUnity開発は事情が違うので注意が必要 – 以前はUniRxが強かったが、 Unity 2017.1の登場で事情が変わってくるかも
Download