Movatterモバイル変換
[0]
ホーム
URL:
画像なし
夜間モード
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
133,062 views
Unity開発で使える設計の話+Zenjectの紹介
プログラマのためのUnity勉強会http://peatix.com/event/311392
Technology
◦
Read more
121
Save
Share
Embed
Embed presentation
Download
Downloaded 441 times
1
/ 139
2
/ 139
3
/ 139
4
/ 139
5
/ 139
6
/ 139
7
/ 139
8
/ 139
9
/ 139
10
/ 139
11
/ 139
12
/ 139
13
/ 139
14
/ 139
15
/ 139
16
/ 139
17
/ 139
18
/ 139
19
/ 139
20
/ 139
21
/ 139
22
/ 139
23
/ 139
24
/ 139
25
/ 139
26
/ 139
27
/ 139
28
/ 139
29
/ 139
Most read
30
/ 139
31
/ 139
32
/ 139
Most read
33
/ 139
34
/ 139
35
/ 139
36
/ 139
37
/ 139
38
/ 139
39
/ 139
40
/ 139
41
/ 139
42
/ 139
43
/ 139
44
/ 139
45
/ 139
46
/ 139
47
/ 139
48
/ 139
49
/ 139
50
/ 139
Most read
51
/ 139
52
/ 139
53
/ 139
54
/ 139
55
/ 139
56
/ 139
57
/ 139
58
/ 139
59
/ 139
60
/ 139
61
/ 139
62
/ 139
63
/ 139
64
/ 139
65
/ 139
66
/ 139
67
/ 139
68
/ 139
69
/ 139
70
/ 139
71
/ 139
72
/ 139
73
/ 139
74
/ 139
75
/ 139
76
/ 139
77
/ 139
78
/ 139
79
/ 139
80
/ 139
81
/ 139
82
/ 139
83
/ 139
84
/ 139
85
/ 139
86
/ 139
87
/ 139
88
/ 139
89
/ 139
90
/ 139
91
/ 139
92
/ 139
93
/ 139
94
/ 139
95
/ 139
96
/ 139
97
/ 139
98
/ 139
99
/ 139
100
/ 139
101
/ 139
102
/ 139
103
/ 139
104
/ 139
105
/ 139
106
/ 139
107
/ 139
108
/ 139
109
/ 139
110
/ 139
111
/ 139
112
/ 139
113
/ 139
114
/ 139
115
/ 139
116
/ 139
117
/ 139
118
/ 139
119
/ 139
120
/ 139
121
/ 139
122
/ 139
123
/ 139
124
/ 139
125
/ 139
126
/ 139
127
/ 139
128
/ 139
129
/ 139
130
/ 139
131
/ 139
132
/ 139
133
/ 139
134
/ 139
135
/ 139
136
/ 139
137
/ 139
138
/ 139
139
/ 139
Recommended
PDF
MMORPGで考えるレベルデザイン
by
Katsumi Mizushima
PDF
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
by
Unity Technologies Japan K.K.
PDF
GPU最適化入門
by
Takahiro KOGUCHI
PDF
Unity dojo amplifyshadereditor101_jpn-jp
by
小林 信行
PDF
CEDEC2016 「コントラスト」で考えるゲームデザイン・レベルデザイン
by
Kouji Ohno
PDF
ゲームの仕様書を書こう1 仕様書作成の分業とリストの作成
by
Sugimoto Chizuru
PPTX
ゲームの楽しさを図式化する ―楽しさを網羅的に分類する「主体性構造モデル」
by
井戸 里志
PDF
ゲームシナリオ構成法 2015版
by
小林 信行
PDF
Unityでオンラインゲーム作った話
by
torisoup
PDF
【Unity】 Behavior TreeでAIを作る
by
torisoup
PDF
UniRx完全に理解した
by
torisoup
PDF
20分くらいでわかった気分になれるC++20コルーチン
by
yohhoy
PDF
コールバックと戦う話
by
torisoup
PPTX
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
by
Unity Technologies Japan K.K.
PDF
Doozy UI 使おうぜ! #unity_lt
by
torisoup
PDF
Unityでパフォーマンスの良いUIを作る為のTips
by
Unity Technologies Japan K.K.
PDF
UE4でマルチプレイヤーゲームを作ろう
by
エピック・ゲームズ・ジャパン Epic Games Japan
PPTX
UniRxでMV(R)Pパターンをやってみた
by
torisoup
PDF
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
by
UnityTechnologiesJapan002
PDF
Riderはいいぞ!
by
UnityTechnologiesJapan002
PDF
UniTask入門
by
torisoup
PPTX
RPGにおけるイベント駆動型の設計と実装
by
Koji Morikawa
PDF
ヒストリア HelixCore(Perforce) 運用レギュレーションドキュメント
by
historia_Inc
PPTX
未来のプログラミング技術をUnityで -UniRx-
by
torisoup
PDF
MagicOnion入門
by
torisoup
PDF
Observableで非同期処理
by
torisoup
PDF
インタフェース完全に理解した
by
torisoup
PDF
バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~
by
エピック・ゲームズ・ジャパン Epic Games Japan
PDF
ドメイン駆動設計をゲーム開発に活かす
by
増田 亨
PDF
Unityを使ったゲームデザイン超入門
by
小林 信行
More Related Content
PDF
MMORPGで考えるレベルデザイン
by
Katsumi Mizushima
PDF
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
by
Unity Technologies Japan K.K.
PDF
GPU最適化入門
by
Takahiro KOGUCHI
PDF
Unity dojo amplifyshadereditor101_jpn-jp
by
小林 信行
PDF
CEDEC2016 「コントラスト」で考えるゲームデザイン・レベルデザイン
by
Kouji Ohno
PDF
ゲームの仕様書を書こう1 仕様書作成の分業とリストの作成
by
Sugimoto Chizuru
PPTX
ゲームの楽しさを図式化する ―楽しさを網羅的に分類する「主体性構造モデル」
by
井戸 里志
PDF
ゲームシナリオ構成法 2015版
by
小林 信行
MMORPGで考えるレベルデザイン
by
Katsumi Mizushima
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
by
Unity Technologies Japan K.K.
GPU最適化入門
by
Takahiro KOGUCHI
Unity dojo amplifyshadereditor101_jpn-jp
by
小林 信行
CEDEC2016 「コントラスト」で考えるゲームデザイン・レベルデザイン
by
Kouji Ohno
ゲームの仕様書を書こう1 仕様書作成の分業とリストの作成
by
Sugimoto Chizuru
ゲームの楽しさを図式化する ―楽しさを網羅的に分類する「主体性構造モデル」
by
井戸 里志
ゲームシナリオ構成法 2015版
by
小林 信行
What's hot
PDF
Unityでオンラインゲーム作った話
by
torisoup
PDF
【Unity】 Behavior TreeでAIを作る
by
torisoup
PDF
UniRx完全に理解した
by
torisoup
PDF
20分くらいでわかった気分になれるC++20コルーチン
by
yohhoy
PDF
コールバックと戦う話
by
torisoup
PPTX
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
by
Unity Technologies Japan K.K.
PDF
Doozy UI 使おうぜ! #unity_lt
by
torisoup
PDF
Unityでパフォーマンスの良いUIを作る為のTips
by
Unity Technologies Japan K.K.
PDF
UE4でマルチプレイヤーゲームを作ろう
by
エピック・ゲームズ・ジャパン Epic Games Japan
PPTX
UniRxでMV(R)Pパターンをやってみた
by
torisoup
PDF
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
by
UnityTechnologiesJapan002
PDF
Riderはいいぞ!
by
UnityTechnologiesJapan002
PDF
UniTask入門
by
torisoup
PPTX
RPGにおけるイベント駆動型の設計と実装
by
Koji Morikawa
PDF
ヒストリア HelixCore(Perforce) 運用レギュレーションドキュメント
by
historia_Inc
PPTX
未来のプログラミング技術をUnityで -UniRx-
by
torisoup
PDF
MagicOnion入門
by
torisoup
PDF
Observableで非同期処理
by
torisoup
PDF
インタフェース完全に理解した
by
torisoup
PDF
バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~
by
エピック・ゲームズ・ジャパン Epic Games Japan
Unityでオンラインゲーム作った話
by
torisoup
【Unity】 Behavior TreeでAIを作る
by
torisoup
UniRx完全に理解した
by
torisoup
20分くらいでわかった気分になれるC++20コルーチン
by
yohhoy
コールバックと戦う話
by
torisoup
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
by
Unity Technologies Japan K.K.
Doozy UI 使おうぜ! #unity_lt
by
torisoup
Unityでパフォーマンスの良いUIを作る為のTips
by
Unity Technologies Japan K.K.
UE4でマルチプレイヤーゲームを作ろう
by
エピック・ゲームズ・ジャパン Epic Games Japan
UniRxでMV(R)Pパターンをやってみた
by
torisoup
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
by
UnityTechnologiesJapan002
Riderはいいぞ!
by
UnityTechnologiesJapan002
UniTask入門
by
torisoup
RPGにおけるイベント駆動型の設計と実装
by
Koji Morikawa
ヒストリア HelixCore(Perforce) 運用レギュレーションドキュメント
by
historia_Inc
未来のプログラミング技術をUnityで -UniRx-
by
torisoup
MagicOnion入門
by
torisoup
Observableで非同期処理
by
torisoup
インタフェース完全に理解した
by
torisoup
バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~
by
エピック・ゲームズ・ジャパン Epic Games Japan
Similar to Unity開発で使える設計の話+Zenjectの紹介
PDF
ドメイン駆動設計をゲーム開発に活かす
by
増田 亨
PDF
Unityを使ったゲームデザイン超入門
by
小林 信行
PDF
GCSアジャイル開発を使ったゲームの作り方
by
Hiroyuki Tanaka
PDF
Unityで覚えるC#
by
Masamitsu Ishikawa
PDF
オブジェクト指向とSOLID原則の入門
by
KISARAGIMakoto
PDF
Unityティーチャートレーニングデイ -認定プログラマー編-
by
Unity Technologies Japan K.K.
PDF
Agile day 3「弟子入りゲーム」
by
Tarumoto Tetsuya
PDF
第2回 モデリング勉強会
by
hakoika-itwg
PDF
【Unity道場スペシャル 2018幕張】「あそびのデザイン講座」を使ったゲームデザイン授業の実践
by
Unity Technologies Japan K.K.
PDF
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~Entity Compon...
by
Unity Technologies Japan K.K.
PDF
オブジェクト指向を学ぼう
by
Yusuke Kikuchi
PDF
GDC2015報告
by
Tanaka Yukio
PPTX
Cedec2012 ai-contest-design-patterns-principles
by
Hironori Washizaki
PDF
Builderscon 2016 講演資料 「人工知能によってプログラムを有機化する」(前篇)
by
Youichiro Miyake
PDF
CODE FES 2017 講演資料
by
Youichiro Miyake
PDF
週末プログラミングで作るカジュアルゲーム~シューティング編~
by
Nohina Hidenari
PDF
Kuug 第1回
by
Shinobu Izumi
PPTX
Unity勉強会ハンズオン
by
Kodai Yano
PDF
UnityLecture @Kyushu University
by
Kosuke Kaneko
PDF
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
by
Tomoharu ASAMI
ドメイン駆動設計をゲーム開発に活かす
by
増田 亨
Unityを使ったゲームデザイン超入門
by
小林 信行
GCSアジャイル開発を使ったゲームの作り方
by
Hiroyuki Tanaka
Unityで覚えるC#
by
Masamitsu Ishikawa
オブジェクト指向とSOLID原則の入門
by
KISARAGIMakoto
Unityティーチャートレーニングデイ -認定プログラマー編-
by
Unity Technologies Japan K.K.
Agile day 3「弟子入りゲーム」
by
Tarumoto Tetsuya
第2回 モデリング勉強会
by
hakoika-itwg
【Unity道場スペシャル 2018幕張】「あそびのデザイン講座」を使ったゲームデザイン授業の実践
by
Unity Technologies Japan K.K.
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~Entity Compon...
by
Unity Technologies Japan K.K.
オブジェクト指向を学ぼう
by
Yusuke Kikuchi
GDC2015報告
by
Tanaka Yukio
Cedec2012 ai-contest-design-patterns-principles
by
Hironori Washizaki
Builderscon 2016 講演資料 「人工知能によってプログラムを有機化する」(前篇)
by
Youichiro Miyake
CODE FES 2017 講演資料
by
Youichiro Miyake
週末プログラミングで作るカジュアルゲーム~シューティング編~
by
Nohina Hidenari
Kuug 第1回
by
Shinobu Izumi
Unity勉強会ハンズオン
by
Kodai Yano
UnityLecture @Kyushu University
by
Kosuke Kaneko
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
by
Tomoharu ASAMI
More from torisoup
PDF
Unityでオニオンアーキテクチャ
by
torisoup
PDF
ObserverパターンからはじめるUniRx
by
torisoup
PDF
MagicOnion~C#でゲームサーバを開発しよう~
by
torisoup
PPTX
はじめてのUniRx
by
torisoup
PDF
Unityで作ったゲームをDLカードで配布してみた話 #roppongiunity
by
torisoup
PDF
ARでVRアバターを表示するシステムを構築しよう
by
torisoup
PDF
UnityとNCMBでユーザ管理を実装してみた話
by
torisoup
PDF
アバター生放送支援アプリ「アバれぽ」
by
torisoup
PPTX
みくみくまうすについて&Unity で使えるコーディングノウハウ
by
torisoup
PDF
UniRxでPUNを使いやすくする
by
torisoup
PDF
Photon Cloud ことはじめ
by
torisoup
PDF
Unity講習会(初級)
by
torisoup
PDF
Task vs Observable
by
torisoup
Unityでオニオンアーキテクチャ
by
torisoup
ObserverパターンからはじめるUniRx
by
torisoup
MagicOnion~C#でゲームサーバを開発しよう~
by
torisoup
はじめてのUniRx
by
torisoup
Unityで作ったゲームをDLカードで配布してみた話 #roppongiunity
by
torisoup
ARでVRアバターを表示するシステムを構築しよう
by
torisoup
UnityとNCMBでユーザ管理を実装してみた話
by
torisoup
アバター生放送支援アプリ「アバれぽ」
by
torisoup
みくみくまうすについて&Unity で使えるコーディングノウハウ
by
torisoup
UniRxでPUNを使いやすくする
by
torisoup
Photon Cloud ことはじめ
by
torisoup
Unity講習会(初級)
by
torisoup
Task vs Observable
by
torisoup
Unity開発で使える設計の話+Zenjectの紹介
1.
Unity開発で使える設計の話+Zenjectの紹介2017/11/26@toRisouP
2.
自己紹介• 名前 とりすーぷ(@toRisouP)•
Qiitaとかよく書いてる• 同人ゲーム作ってる
3.
ハクレイフリーマーケット• 2017年10月にリリースした東方二次創作ゲーム• オンライン対戦対応のパーティゲーム
4.
おしながき• 設計とは– 設計とは何か、設計の何がよいのか–
モデリングとクラス設計• 覚えておくべき基礎知識– クラス図の読み方– SOLID原則– デザインパターン• Zenjectの紹介– 依存性注入とは何か• まとめ
5.
設計とは何か
6.
設計とは何か• 何をどうやって作るのかを決定する作業– そもそも何を作ろうとしているのか?–
必要な機能はどうすれば作れるのか?– 必要なリソースは何なのか?– 作るのにどれくらい時間がかかるのか?– どういう手順で作業をするのか?
7.
だいたいの開発フロー1. 企画を決める2. 仕様を決める3.
システム設計する4. コーディングする5. テスト、デバッグする6. リリースする7. 運用、保守する←ここ
8.
設計すると何がよいのか?
9.
設計のよさ• 設計することで作るものの全体像が可視化される– 規模感をチーム内で共有できる–
何から手を付ければ効率よく進むかわかるようになる– 今後問題が起きそうな部分を先に洗い出せる
10.
本題
11.
モデリングとクラス設計
12.
モデリングとクラス設計• モデリング– 抽象的な考えを図や記号で可視化する作業–
3Dモデリングの意味ではない– UML(統一モデリング言語)を使って描くことがほとんどである• クラス設計– どういうクラスを作るのかクラス同士がどういう関係であるのか、といった具体的に何のクラスを作るのかを決める作業
13.
モデリングの例
14.
モデリングの例:シーケンス図• オブジェクト同士のやりとりを時間軸に沿って表現する図– 複雑な処理を可視化することができる–
通信処理が挟まる部分などはシーケンス図を作っておくと混乱しない
15.
モデリングの例:アクティビティ図• 手続きの流れを表現する図– フローチャートの上位互換みたいなもの–
状態遷移図に似てる(似てるだけで別物である)
16.
モデリングの例:クラス図• 登場するオブジェクトとその関係性を表す図– クラスやインターフェイスなどのオブジェクトを記載–
関連・依存・集約・コンポジション・汎化・実現なのどの関係を矢印で表す
17.
モデリングをやるメリット• これからの作業内容を可視化できる– どこから作れば効率がよいかわかるようになる–
実装時に迷うことがなくなってスムーズに開発できる• 後から見返す時の資料として残すことができる– どういう作りになってるか俯瞰的に見ることができる– 不具合調査時のあたりがつけやすい– 引き継ぎや新人教育に使える
18.
クラス設計
19.
クラス設計• クラスの関係をモデリングすること– どういうオブジェクトが必要なのか–
オブジェクト間がどういう関係にあるのか?
20.
クラス設計は適当にやればOKといったものではない
21.
クラス設計をやるためには• クラス図が読み書きできる必要がある– UMLのクラス図を覚えるのがよい•
設計原則を覚える必要がある– 設計する上で守ることが推奨されるルール• 設計の定石も覚えておくべき– デザインパターンやDIといった応用性の高い考え
22.
こういったクラス設計をする上で覚えておくべき知識を解説します
23.
おしながき• 設計とは– 設計とは何か、設計の何がよいのか–
モデリングとクラス設計• 覚えておくべき基礎知識– クラス図の読み方– SOLID原則– デザインパターン• Zenjectの紹介– 依存性注入とは何か– かんたんな使い方• まとめ
24.
(クラス設計をやる上で)覚えておくべき基礎知識
25.
覚えておくべき知識• クラス図の読み方• SOLID原則•
デザインパターン
26.
クラス図の読み方
27.
クラス図の読み方 1/6• オブジェクトの読み方–
名前空間、各記号の意味名前空間abstract class interfaceclass struct
28.
クラス図の読み方 2/6• オブジェクトの読み方–
アクセス修飾子、フィールド、メソッド定義○ Public◇ Protected□ Privateフィールドメソッド
29.
クラス図の読み方 3/6• 関連–
実線で繋ぐとつながりを示す– 実線矢印で繋ぐと一方通行の関連を示す(「使う側 → 使われる側」という向きで引く)PlayerとItemは相互に関係があるWeaponはBulletを知ってるBulletはWeaponを知らない
30.
クラス図の読み方 4/6• 依存–
破線矢印:片方が相手の状態に対して影響を受ける• 例)麻痺状態になるとすばやさが1/4になる
31.
クラス図の読み方 5/6• 集約、コンポジション–
それぞれ「本体とパーツの関係」を表す• ◇が集約:分解できる関係• ◆がコンポジション:分解できない関係– 数字を書くと個数を表す集約 コンポジション
32.
クラス図の読み方 6/6• 汎化–
白抜き実線矢印:クラスの継承関係を表す• 実現– 白抜き破線矢印:インターフェイスの実装を表すBossはEnemyを継承しているBlockはIBreakableを実装している
33.
読み方はわかった
34.
じゃあ描く時は?
35.
PlantUMLを使うことをおすすめ• テキストベースでUML図が描けるスグレモノ– クラス図の他にシーケンス図やアクティビティ図も描ける–
AtomやVS Codeにプラグインを入れればすぐ使える
36.
覚えておくべき知識• クラス図の読み方• SOLID原則•
デザインパターン
37.
SOLID原則
38.
SOLID原則• オブジェクト指向プログラミングにおける5つの原則– 「原則」の名の通り、理由があって違反するのは問題はない•
SOLID原則を意識すれば設計はだいたいは上手くいく– Unity開発でも当然SOLID原則は有効• 普通はオブジェクト指向で開発するしね?
39.
5つの原則• 単一責任原則– Single
Responsibility Principle• オープン・クローズド原則 (重要)– Open-Closed Principle• リスコフの置換原則– Liskov Substitution Principle• 依存性逆転の原則 (重要)– Dependency Inversion Principle• インターフェイス分離の原則– Interface Segregation Principle
40.
単一責任原則Single Responsibility Principle
41.
単一責任原則「1個のクラスに役割は1つ」• 1つのクラスを変更する理由は1つでないといけない– 1個のクラスに複数の仕事を持たせてはいけない•
クラスの名前を適切につけるのがコツ
42.
例:単一責任原則に違反したクラス• PlayerControllerクラス– キー入力管理–
移動– アニメーション再生– 体力管理– エフェクト・効果音再生1つのクラスに機能が詰まりすぎ!機能追加や修正する時に、関係ない部分に影響が出る可能性が高い!
43.
単一責任原則を守ったクラス役割に応じてクラスを分割しよう!名前を見たら何をするのかすぐわかるくらいの粒度が適切• 移動管理:PlayerMover• 入力管理:PlayerKeyInput•
アニメーション:PlayerAnimator• エフェクト再生:PlayerEffectPlayer
44.
オープン・クローズド原則Open-Closed Principle重要
45.
オープン・クローズド原則モジュールは拡張について開いていなければならず、修正に対して閉じていなければならない
46.
どういう意味?• 機能の追加は簡単にできないといけない(オープン)• ただしその時に修正が発生してはいけない(クローズ)
47.
要するに?• 基底クラスやインターフェイスを使って、抽象的に操作できるようにしよう
48.
よくない例• Bulletクラスが相手に対してダメージを与えるコード– Tagを見てswitch文で処理を分岐している
49.
何がダメ?• Bulletの操作対象が増えた時にコードに修正が必要– 全てのSwitch文を漏れなく探して書き換える必要がある–
変更の手間もかかるし、修正漏れがあっても気づけないBossを実装したのでSwitch文に追加もし追加を忘れてもエラーにならないし動いてしまう
50.
どうすればいいのか?• 処理を「抽象」に依存させればよい– 基底クラスやインターフェイスを使って処理を呼び出す実装に変える•
こうするとSwtich文は不要になる
51.
オープン・クローズド原則• インターフェイスや基底クラスで抽象化しよう– 使う側が相手の型を意識する実装は不健全である–
機能を追加する時は「継承」や「実装」を行えばよい– 既存コードの変更は一切不要になる• GetComponet<T>はインターフェイスも指定できる– 指定インターフェイスを実装したコンポーネントを取得できる– 相手が何のオブジェクトか意識せずに処理を書くことができる
52.
リスコフの置換原則Liskov Substitution Principle
53.
リスコフの置換原則(LSP)派生型はその基底型と置換可能でなければいけない
54.
どういう意味?• 派生型は基底型で決めたルールを変更してはいけない– アクセス修飾子を派生で勝手に上書きしてはいけない–
メソッドを実行するのに必要な判定を基底より強化してはいけない– メソッドの実行結果を基底より緩くしてはいけない
55.
LSP違反すると何が起きるのか?• 型安全性がこわれる– 間違えた使い方をしてもコンパイルエラーにならない–
実際に動かすまで正しく動作するかわからない• 「型」を意識してコードを書く必要が出て来る– ある型の時のみ処理を分岐する、みたいな処理が出て来る– オープン・クローズド原則に違反する
56.
LSPを違反させる例• IDをもつ「Enemyクラス」– IDが同じならば同一の敵であると判定する
57.
同一性のチェック• IDが同じならtrue• IDが違ってたらfalse•
この場合は正しく動く!
58.
LSP違反クラス• 「EnemyWithTeamIdクラス」– IDとTeamIDの2つを使って同一性チェック–
基底のIsSameEnemyをnewで隠蔽している
59.
同じクラス同士で比較すると…• ちゃんと判定できる– Idが同じでもTeamIdが違うのでfalse判定になる
60.
これをEnemyにアップキャストすると…• 判定が壊れる– 両者でIsSameEnemyの挙動が違うのだからあたりまえ–
“EnemyWithTeamId”を”Enemy”として扱うと危険になってしまった
61.
リスコフの置換原則• 基底クラスの定めたルールには従うこと– 派生クラスで勝手にルールを書き換えると動作保証できなくなる–
is-aの関係を破壊するような継承を行うと違反しやすい– Equalsのoverrideも違反しやすいので注意• C#のnew修飾子はLSP違反を引き起こす可能性が高い– newでメソッドを隠蔽すると基底と派生でふるまいが変わってしまう– メソッドを上書きする場合はできるだけvirtual・override修飾子を使おう
62.
依存性逆転の原則Dependency Inversion Principle重要
63.
依存性逆転の原則(DIP)上位モジュールが下位モジュールに依存してはいけないどちらも抽象に依存するべきである
64.
つまり?• 上位モジュールが仕様を決め、下位モジュールがその仕様に従うのが正しい姿である– 上位モジュール:相手を使う側のクラス–
下位モジュール:上位から使われる側のクラス下位上位
65.
だめな例• 上位モジュール:Player• 下位モジュール:Enemy•
PlayerがEnemyに対してApplyDamageを実行する
66.
下位モジュールを変更する「Enemyの種類が追加された」「ApplyDamage()の仕様を一部勝手に書き換えた」↑増えた↑引数が増えた
67.
上位に変更が必要になる• PlayerはApplyDamage()の呼び出しを全部書き換える必要がある– シグネチャが変わったことに対応しないといけない–
Enemy2が増えたことで処理の分岐も必要になる– オープン・クローズド原則にも違反している
68.
修正:依存関係を逆転させる• インターフェイスをPlayer側に定義してそれを使う– インターフェイスの管轄をPlayer側にするのがキモ–
EnemyにPlayerの仕様を押し付けることができるようになる
69.
依存関係の「逆転」• 矢印の向きがちゃんと逆になってる
70.
適用できる場所の例• クラス内で他のクラスを直接newしている→ 他のClientに差し替えようとするとコードの修正が必要になる
71.
依存性逆転をすると• 依存するインスタンスを切り替えられるようになる– 用途に合わせてClientを差し替えられる
72.
他にも…• Singletonへの依存を弱めることができる– UnityだとManagerクラスをSingletonで作ることが多い–
利用するManagerを外から渡してあげるようにすれば、Singletonへの依存が消せるようになる
73.
依存性逆転の原則• 依存関係をインターフェイスを使って整理しよう– 上位が仕様を決め、下位がそれに従うのが正しい設計•
インターフェイスの使い所はここ!– インターフェイスは依存性逆転を行うためにある(と思う)• 「依存性注入」への話にもつながる– 詳しくは後述
74.
インターフェイス分離の原則Interface Segregation Principle
75.
インターフェイス分離の原則クライアントが利用しないメソッドへの依存を強制してはいけない
76.
意味• インターフェイスは適切な粒度で定義しよう– 不必要なメソッドがインターフェイスに紛れていると使う側で混乱する–
インターフェイスを適切に分離し、必要なインターフェイスにだけアクセスできるようにしよう
77.
SOLID原則のまとめ• SOLID原則はクラス設計の中核– これをちゃんと守っていれば設計はだいたいなんとかなる•
SOLID原則は絶対ではない– あくまで「原則」– あえて違反したほうが逆にキレイにまとまるんであれば、違反してもよい(柔軟に対応しよう)
78.
特に• オープン・クローズド原則• 依存性逆転の原則•
この2つは特に重要で、ここをしっかり意識するとかなりまともな設計ができる
79.
覚えておくべき知識• クラス図の読み方• SOLID原則•
デザインパターン
80.
デザインパターン
81.
デザインパターン• プログラムにおける設計の定石– こういう時はこの設計にするといいよ、というパターン集•
GoFデザインパターンが特に有名– 23個の汎用パターン– 他にもMVCやMVVMやMVPといったアーキテクチャに関するデザインパターンもある
82.
GoFデザインパターン一覧• Iterator• Adapter•
TemplateMethod• FactoryMethod• Singleton• Prototype• Builder• AbstractFactory• Bridge• Strategy• Composite• Decorator• Visitor• ChainOfResponsibility• Facade• Mediator• Observer• Memento• State• Flyweight• Proxy• Command• Iterpreter
83.
個人的によく使うGoFのパターン• GoFのデザインパターン– Observerパターン–
Mementoパターン– Facadeパターン
84.
Observerパターン• イベントの通知と購読を実現するパターン• 観察者(Observer)と観察対象(Subject)が登場する•
「Rx」はObserverパターンをベースに作られている– UniRxを使っている人は自然にこのパターンを使っているはず
85.
Mementoパターン• Undo機能を実現するパターン– インスタンスの状態を別の場所に保存しておくことで、特定のタイミングでインスタンスの状態を巻き戻せるようになるパターン•
パズルゲームで1手前の状態に戻す• プレイヤが死んだらプレイヤのステータスを開始時点に戻す• などといった場面に使える
86.
Facadeパターン• 処理を簡単化する窓口を提供するパターン– GameObjectにたくさんのコンポーネントが張り付いていて、どこから欲しい情報を集めたら良いのかわからない!みたいな時に、処理を一括して受け付ける窓口を提供する
87.
例• Playerから情報を取得したい– 今ダッシュしているのか?–
今空中にいるのか?– 気絶しているのか?– 何のアニメーションを再生しているのか?• どのコンポーネントから情報を取り出せばいいんだ?
88.
Facadeオブジェクトを作る• PlayerDataProvider– プレイヤの情報を収集して外に返す窓口クラス
89.
外からの情報取得が簡単になる• PlayerDataProviderさえ取得すれば情報が取れる– PlayerDataProviderが代表してデータの収集をする–
内部の構造がどうなっているか外から気にしなくて済む– 複雑なシステムを外からは簡単に触れる用にしたい時にFacadeパターンは有効
90.
デザインパターンのまとめ• 設計作業の指針にできる– 何かのデザインパターンに当てはめると簡単に実装できたってこともある–
チームでコミュニケーションを取る時に、デザインパターンの名前がスッと出てくると話が早い• ただしデザインパターンに振り回されてはいけない– メリットもあるが、デメリットもあるパターンが存在する– デザインパターンを妄信せず、自分で考えてアレンジする必要がある
91.
覚えておくべき知識・まとめ• クラス図の読み方、描き方– クラス図を読めるようになるとよい–
描く時はPlantUMLを使うのがおすすめ• SOLID原則– 特にオープン・クローズド原則と依存性逆転の原則が個人的に重要だと思う• デザインパターン– 覚えておくとよい
92.
以上が設計のお話
93.
おしながき• 設計とは– 設計とは何か、設計の何がよいのか–
モデリングとクラス設計• 覚えておくべき基礎知識– クラス図の読み方– SOLID原則– デザインパターン• Zenjectの紹介– 依存性注入とは何か• まとめ
94.
Zenject
95.
Zenjectとは• 依存性注入を管理してくれるフレームワーク– AssetStoreから無料でDLできる(MITライセンス)–
最近は採用事例が増えてきた
96.
Zenjectを知るにはまず依存性注入の理解が必要
97.
依存性注入Dependency Injection
98.
依存性注入• オブジェクトを外から「注入」すること– Dependency
Injection、略してDIと呼ぶことが多い• Dependencyに「依存性」という訳が当てられているが、本来の意味としては「オブジェクトの注入」である– 依存性逆転の原則(DIP)を適用した場合はこのDIが必要になる
99.
どの場面でDIは使うのか?• 依存性逆転の原則を適用した時– 実際に使うクラスをインタンス化し、上位モジュールに渡してあげる作業が「DI」
100.
(Zenjectの話は一旦忘れて)手作業でDIしてみる
101.
ResourceProviderの例を使ってDI• 「ResourceProvider」というデータを提供してくれるクラスがある• 「ResourceProvider」は「Client」を使ってデータを取得してくる•
「Client」は抽象化されインターフェイスが定義されている• 「Client」の実装はプロトコルごとに複数用意されている
102.
ResourceProviderの中身• コンストラクタで外からインタンスを受け取る– クラス内ではインターフェイスしか触らない
103.
ResoureProviderを誰が作るのか?• ResourceProviderの生成にClietも同時に必要になる• 2つまとめて生成する「Factory」を作ったほうが良さそう–
デザインパターンのFactoryMethodパターンが近い
104.
Factoryを作る• HttpResourceProviderFactory– HttpClientを使うResourceProviderを提供する
105.
Factoryの実装• ResourceProviderの生成時に使うClientを注入する
106.
手動でDIおわり• あとはFactoryを経由でResourceProviderを作ればOK
107.
単純なDIだったら簡単
108.
実際はもっと複雑になる
109.
例えば• ResourceManagerクラス– ここにも依存性逆転の原則を適用した方が良さそう
110.
こうなる• つまりFactoryのDIも必要になる– ResouceProviderの生成にFactoryが必要だった–
じゃあFactoryのFactoryを作るのか…?
111.
他にも• HttpClientをConfigに依存させる変更を入れる、とか– どのApiサーバに通信するかをConfigで切り替える–
ConfigをDIすることで挙動を変える
112.
依存性注入の問題• 依存性の解決を誰が行うのか?– 依存関係が多段になるほど解決が難しくなっていく–
依存関係を解決する順番も考える必要が出て来ることがある• オブジェクト数が増えると人間の手では管理できないほど複雑なDIが必要になってくる
113.
手動でDIには限界が出て来る
114.
そこで使われるのがDIフレームワーク
115.
つまりそれがZenject
116.
あらためてZenjectとは• DIを管理してくれるフレームワーク– オブジェクトの依存関係を簡単に定義できる–
自動的にDIを実行してくれる– Prefabの生成などにも対応
117.
さっきの例• Zenjectを使うとFactoryを使わずに書ける– 代わりに「DIコンテナ」という概念が出て来る(オブジェクトの関係性を定義するモジュール)
118.
1.Zenjectを導入• AssetStoreから入れて終わり
119.
2. Installerを定義• MonoInstallerを継承したInstallerを作る–
ここにDIコンテナにオブジェクトの関係性を記述していく
120.
3. Injectアトリビュートをつける• 注入して欲しいところに[Inject]アトリビュートをつける–
フィールド、またはメソッドに[Inject]をつけるとそこに注入してくれる– コンストラクタで注入している場合は何もしなくてOK
121.
4.SceneContextを配置• シーン単位でDIを管理するマネージャオブジェクト– 1シーンに1個必要–
ここに先程のInstallerを登録Installerを貼り付けて登録
122.
5.実行する• 後はZenjectがオブジェクトを注入してくれる– さっき作ってたFactoryみたいなのはZenjectがやってくれる–
もちろん自分でFactoryを作ってInstallerに登録も可能
123.
6. 注入したいオブジェクトを差し替える時• Installerを複数個定義して差し替えればOK
124.
以上がZenjectを使ったDIの例• 依存性逆転の原則をちゃんと守って作ってあれば、「Installer」に記述するだけで使えるはず• あとZenjectのDIコンテナを応用した機能もある
125.
ついでにZenjectの便利な機能
126.
Scene Bindings
127.
SceneBinding• Scene上にあるオブジェクトを登録して、実行時にInjectしてくれる機能– Unityのコンポーネント限定の機能–
「Inspector ViewでコンポーネントをD&Dで紐付ける作業」をZenjectに任せることができるようになる
128.
Zenject使わないいつもの• 例:MainGameManager が
GameTimerを 使う– [SerializeField]をつけてUnityEditorから設定する– いつもやるやつInspector Viewで設定
129.
これをZenjectにやらせる1.[SerializeField] を [Inject]
に変更
130.
これをZenjectにやらせる2.Zenject Bindng コンポーネントを用意–
貼り付ける場所はどこでもいい– ここに注入するオブジェクトを登録しておく(Installerに登録する作業を裏で自動でやってくれる)
131.
Scene Bindingsの設定おわり• これでZenjectが実行時にコンポーネントを注入してくれる–
設定が外れてMissing 状態になるリスクを減らすことができる– 扱うコンポーネントの数が増えた時にも簡単に対応できる– シーンをまたいで注入もできるハクレイフリーマーケットでの設定例
132.
Scene Bindings のよさ•
Singleton Mono Behaviourを消し去れる– 「インタンスの参照を簡単に取得できる」って理由で多用されたSingletonMonoBehaviourの代替として使うことが出来る– Zenjectを導入しているならScene Bindings でコンポーネントを解決するようにしよう
133.
依存性注入とZenjectのまとめ• 依存性注入は必須テクニック– モジュールを疎結合にするとどうしても必要になる–
DIしやすい形に設計していけるとよい• Zenjectはすごい便利– 複雑なDIをする必要があるなら使うことをオススメ– Scene Bindingsを使えばEditor上のぽちぽち作業を減らせられる– Singleton Mono Behaviour の代わりに使うこともできる
134.
ただし…• Zenjectの動作パフォーマンスはそれほど良くはない– 注入する時に内部でリフレクションが走る–
大量のオブジェクトを生成したりすると顕著に遅い– 導入するメリット・デメリットの見極めは必要
135.
おしながき• 設計とは– 設計とは何か、設計の何がよいのか–
モデリングとクラス設計• 覚えておくべき基礎知識– クラス図の読み方– SOLID原則– デザインパターン• Zenjectの紹介– 依存性注入とは何か• まとめ
136.
最後のまとめ• 設計作業はプログラミングにおいて普遍的なもの– 設計について勉強するなら、Unityの参考書よりはプログラミングそのものについて扱っている本の方が詳しく書いてあると思う•
Unityのサンプルプログラムは設計原則守ってないヤツ多い• 設計の学習はトライ&エラーで経験を積むのが一番早い– 実際に経験しないと設計の話はピンとこない– 手を動かしていろいろ設計を試し、失敗を繰り返して学ぶのがやっぱ一番はやい
137.
昔書いたQiita記事• グローバルゲームジャムでクラス設計をやった話2017– https://qiita.com/toRisouP/items/5b7814fda00cab120e39•
この講演を聞いた後に↑の記事を見返してもらえると新しい発見があるかと思います
138.
おすすめの本• C#実践開発手法デザインパターンとSOLID原則によるアジャイルなコーディング– Gary
McLean Hall(著),クイープ 訳 / 5,400円– デザインパターン、SOLID原則、依存性注入について詳しく解説している
139.
以上• ありがとうございました• @toRisouP
Download
[8]
ページ先頭
©2009-2025
Movatter.jp