SlideShare a Scribd company logo
1 of 23
ゲーム開発とデザインパター
ン
~コスト削減とクオリティの両立を目指して~
もんぐり
この勉強会の目的
• デザインパターンに親近感をもってもら
うこと
• ゲーム開発における、よりよい設計につ
いて一緒に考えてもらうこと
• ゲームの品質と開発スピードの向上に寄
与すること
ちなみに、僕はデザインパターンの専門家でもゲーム開発の専
門家でもなく、どっちも駆け出しなので、暖かくご意見ご指摘
ください!
デザインパターンとは
• Wikipediaの定義
– 過去のソフトウェア設計者が発見し編み出した設計ノウハウを蓄積
し、名前をつけ、再利用しやすいように特定の規約に従ってカタロ
グ化したものである。
• 代表的なのはGoFの23個のデザインパターン
• 一言で表すと
「直に書かずにクラスを分けろ」
ってことかなと。(個人的解釈です)
デザインパターンを学ぶメリッ
ト
• 設計の世界共通言語
– 「ここはFactoryMethodで設計してるんだ」って説明すれば、
「ああFactoryMethodね」って、すぐ話が通じるよ!
• 巨人の肩に乗る
• 品質向上(バグを作りこみにくい設計)
• メンテナンス性向上(読みやすい、修正
しやすい)
• 品質向上≒開発スピード向上
デザインパターンを学ぶメリッ
ト
デザパタ駆使した
とき
クラスの独立性が
高くなるようにだ
け気をつけた時
直にがんがん処理
を書いてる時
パフォーマンス ◯ ◯ ◯
可読性 △ ◯ ☓
クラス独立性 ◯ △ ☓
ソースを書く速度 △ △ ◯
バグ発生率の低さ ◎ ◯ ☓
トータルな開発と
メンテのコストの
低さ
◎ ◯ ☓
※独断と偏見に基づく評価です
23個も覚えきれないよ!
(独断と偏見で)厳選したパター
ンを、
適用事例とともにご紹介します!
こんな経験ないですか?
• このインスタンスはアプリ内で1個だけのはずな
のに、勝手に別の場所でも作られちゃった!
– アプリ全体のデータを保持したクラスとかの話
• → 利用者がそれと知らずに、複数インスタンス
を扱っていると、バグに気づくのが遅れると大混
乱に
イン
スタ
ンス1
イン
スタ
ンス2
利用者
更新 参照
インスタンス
は
1個だけだよね
Singleton
• 1個しか作っちゃいけないものは1個しか作れないようにして
おこう
• コンストラクタで例外投げたりAssertしたり、コンストラクタ
をprivateにしたりして、newを禁止します。
• Cocos2d-xでは、CCTextureCacheなど、キャッシュ系でよく使
われてます。CCDirectorなどの単一機能クラスもSingletonに
なってます。
class SingletonClass {
public:
static SingletonClass* getInstance();
private:
static SingletonClass* m_instance;
SingletonClass();
};
こんな経験ないですか?
• Animalクラスを継承した子クラスを作って、子によって違う処理はそれぞ
れに隠蔽するぞ!
• → 開発してるうちに、子クラスの種類がどんどん増えてきたんだが。。。
• → 大量の子クラスのヘッダを#includeしちゃってるよ! Switch-caseの
caseの数がめっちゃ多いよ!
• ビルド時間増大、依存性増大、クラスの行数が増大し、扱いにくいソース
に。。。
#include “Cat.h”
#include “Dog.h”
・・・ 100個の#include
#include ”Dragon.h”
bool Game::init() {
m_cat1 = new Cat();
m_dog1 = new Dog();
・・・
m_doragon1 = new Dragon();
return true;
};
FactoryMethod(&AbstractFactory)
• 派生クラスのどれでもインスタンス生成できるクラス
を別に作っておいて、それを使うようにしよう
• 派生クラスへの依存性をなくし、ポリモーフィズムを
駆使できます
class AnimalFactory {
public:
IFAnimal* createAnimal(ANIMAL_TYPE type);
};
IFAnimal* AnimalFactory::createAnimal(ANIMAL_TYPE type) {
switch(type) {
case CAT:
return new AnimalCat();
case DOG:
return new AnimalDog();
・・・
default:
return NULL;
}
}
こんな経験ないですか?
• 敵によって攻撃パターン(アルゴリズム)が違う。攻撃パ
ターンはそれぞれの敵クラスに実装しよう
• → 攻撃パターン変更依頼もらったけど、それぞれの敵クラ
スに処理が散らばってて、少しずつ差分があるから修正量が
半端ないよ!
• → 「敵Aの攻撃パターンを敵Bと同じやつに差し替えとい
て」って依頼もらったけど、アルゴリズムに結びつけたソー
スにしてるからほぼ全て書きなおしだ!
Strategy
• →アルゴリズムごとにクラス作って、クラス内に詳細
な処理は隠蔽し、どれも同じI/Fで使用できるようにし
ておこう
• 僕は、複数パターンのAIを使い分けるときによく使っ
ています。
class AttackAIFactory {
public:
IFAttackAI* createAttackAI(AI_TYPE type);
};
IFAttackAI* AttackAIFactory::createAttackAI(AI_TYPE type) {
switch(type) {
case VERTICAL_LASER:
return new AttackAIVerticalLaser();
・・・
default:
return NULL;
}
}
class IFAttackAI {
virtual vector<Cell> createAttackCollisionArea() = 0;
・・・
};
こんな経験ないですか?
• 状態管理はenumだね。ゲームのループで呼ばれるメ
ソッド内でSwitch文書いて、処理を分岐すればよし!
• → case数の増大、case内処理の増大。。。クラスの
行数が増えて3000行を超えますた
switch(m_state) {
case STATE_MOVING:
・・・
break;
case STATE_ATTACKING:
・・・
break;
・・・
case STATE_DEAD:
break;
default
break;
}
State
• 状態ごとにクラス作って、どれも同じI/Fで処理を起動できる
ようにしよう!
• 実際は、主クラスから、状態依存する処理だけを独立して切
り出すのはなかなか難しい印象。使えるところに使っていこ
う。
class PlayerStateFactory {
public:
IFPlayerState* createPlayerState(PLAYER_STATE state);
};
IFPlayerState* PlayerStateFactory::createAttackAI(PLAYER_STATE state) {
switch(state) {
case PLAYER_STATE_POISON:
return new PlayerStatePoison();
・・・
default:
return NULL;
}
}
class IFPlayerState {
virtual void moveTo(Point point) = 0;
・・・
};
こんな経験ないですか?
• 弾幕シューティング、弾発射時にインスタン
ス生成、画面外にいったらインスタンス解放
だ!
• →弾が多くなるとめっちゃフレームレート落
ちるんですが。。。
Flyweight
• →必要なくなったインスタンスを解放せずに
再利用すべし
• オブジェクトをプーリングするってことです
• Cocos2d-xの場合はCCTextureCacheとか
CCSpriteBatchNodeとかの仕組みは揃ってるけ
ど、まああんまり生成解放が頻繁だったら最
初からプーリング書いてもいいと思う
• サンプルコードは書くのが面倒くさいので省
略
こんな経験ないですか?
• PlayerとEnemyとStageクラスを作ったぞ!
• 3者が密接に絡みすぎて、何か一つ修正する
だけで影響範囲調査がしんどい。。。
Player
Enemy
1
Stage
Enemy
2
Mediator
• →各オブジェクトを仲介するクラスを用意し、独立な
オブジェクト同士は直接やりとりしないようにする
• Mediatorは、次回に紹介するObserverパターンと組み
合わせて、非同期処理の命令を実装するといいです
– 非同期処理の例:
• 命令:メソッド
• 結果通知:次で紹介するObserverパターンによる通知
PlayerEnemy Stage
GameManager
(デザパタって)
本当にゲーム開発の現場で
役に立つんかいな?
知り合いに聞いてみた
※このスライドは、個人情報が入ってくるので、
SlideShare版では記載を外しました。
• 個人的には、経験上、取捨選択すればおおい
に使えると思っています。
まとめ
• デザインパターンをいい感じに使えるように
なって開発スピードと品質を向上させよう!
– Singleton
– FactoryMethod
– State
– Strategy
– Flyweight
– Mediator
• 次回はObserverとMVCパターンを議論します。
参考書籍
• 検索するとわかりやすい解説サイトが出てくるのでそ
れで十分かもです。
• オブジェクト指向における再利用のためのデザインパ
ターン
– いわゆるGoF本
• リファクタリング Martin Fowler著
上の2冊は僕は読んでません!
• Java言語で学ぶデザインパターン
• Java言語で学ぶリファクタリング入門
– 結城浩さんの本です

More Related Content

What's hot

プログラマが欲しい仕様書とは
プログラマが欲しい仕様書とはプログラマが欲しい仕様書とは
プログラマが欲しい仕様書とは
Katsutoshi Makino
 

What's hot (20)

Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介
 
プログラマが欲しい仕様書とは
プログラマが欲しい仕様書とはプログラマが欲しい仕様書とは
プログラマが欲しい仕様書とは
 
ゲーム制作初心者が知るべき8つのこと
ゲーム制作初心者が知るべき8つのことゲーム制作初心者が知るべき8つのこと
ゲーム制作初心者が知るべき8つのこと
 
Cinemachineで見下ろし視点のカメラを作る
Cinemachineで見下ろし視点のカメラを作るCinemachineで見下ろし視点のカメラを作る
Cinemachineで見下ろし視点のカメラを作る
 
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
 
Doozy UI 使おうぜ! #unity_lt
Doozy UI 使おうぜ! #unity_ltDoozy UI 使おうぜ! #unity_lt
Doozy UI 使おうぜ! #unity_lt
 
CEDEC2015「加算合成コストが0になる!?すぐに使えるP-MAPブレンドテクニック」発表スライド
CEDEC2015「加算合成コストが0になる!?すぐに使えるP-MAPブレンドテクニック」発表スライドCEDEC2015「加算合成コストが0になる!?すぐに使えるP-MAPブレンドテクニック」発表スライド
CEDEC2015「加算合成コストが0になる!?すぐに使えるP-MAPブレンドテクニック」発表スライド
 
Riderはいいぞ!
Riderはいいぞ!Riderはいいぞ!
Riderはいいぞ!
 
ノベルゲーム動的演出の考え方
ノベルゲーム動的演出の考え方ノベルゲーム動的演出の考え方
ノベルゲーム動的演出の考え方
 
コールバックと戦う話
コールバックと戦う話コールバックと戦う話
コールバックと戦う話
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
 
Unityでオンラインゲーム作った話
Unityでオンラインゲーム作った話Unityでオンラインゲーム作った話
Unityでオンラインゲーム作った話
 
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
 
Unityではじめるオープンワールド制作 エンジニア編
Unityではじめるオープンワールド制作 エンジニア編Unityではじめるオープンワールド制作 エンジニア編
Unityではじめるオープンワールド制作 エンジニア編
 
インタフェース完全に理解した
インタフェース完全に理解したインタフェース完全に理解した
インタフェース完全に理解した
 
Unityでパフォーマンスの良いUIを作る為のTips
Unityでパフォーマンスの良いUIを作る為のTipsUnityでパフォーマンスの良いUIを作る為のTips
Unityでパフォーマンスの良いUIを作る為のTips
 
次世代ゲームにおける自動生成技術
次世代ゲームにおける自動生成技術 次世代ゲームにおける自動生成技術
次世代ゲームにおける自動生成技術
 
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
 
仕様書作成のポイント_180814
仕様書作成のポイント_180814仕様書作成のポイント_180814
仕様書作成のポイント_180814
 

Viewers also liked

Reactive extensions入門v0.1
Reactive extensions入門v0.1Reactive extensions入門v0.1
Reactive extensions入門v0.1
一希 大田
 

Viewers also liked (7)

ゲームオブジェクトの管理
ゲームオブジェクトの管理ゲームオブジェクトの管理
ゲームオブジェクトの管理
 
Unityで覚えるC#
Unityで覚えるC#Unityで覚えるC#
Unityで覚えるC#
 
【アシアル塾】PHPオブジェクト指向再入門・第四回デザインパターンに学ぶクラス設計
【アシアル塾】PHPオブジェクト指向再入門・第四回デザインパターンに学ぶクラス設計【アシアル塾】PHPオブジェクト指向再入門・第四回デザインパターンに学ぶクラス設計
【アシアル塾】PHPオブジェクト指向再入門・第四回デザインパターンに学ぶクラス設計
 
Reactive extensions入門v0.1
Reactive extensions入門v0.1Reactive extensions入門v0.1
Reactive extensions入門v0.1
 
未来のプログラミング技術をUnityで -UniRx-
未来のプログラミング技術をUnityで -UniRx-未来のプログラミング技術をUnityで -UniRx-
未来のプログラミング技術をUnityで -UniRx-
 
Reactive Programming by UniRx for Asynchronous & Event Processing
Reactive Programming by UniRx for Asynchronous & Event ProcessingReactive Programming by UniRx for Asynchronous & Event Processing
Reactive Programming by UniRx for Asynchronous & Event Processing
 
若輩エンジニアから見たUniRxを利用したゲーム開発
若輩エンジニアから見たUniRxを利用したゲーム開発若輩エンジニアから見たUniRxを利用したゲーム開発
若輩エンジニアから見たUniRxを利用したゲーム開発
 

Similar to ゲーム開発とデザインパターン

Xp Terakoya No04
Xp Terakoya No04Xp Terakoya No04
Xp Terakoya No04
takepu
 
DiGRAJ-GD 12/04/2011 大野 功二
DiGRAJ-GD 12/04/2011 大野 功二DiGRAJ-GD 12/04/2011 大野 功二
DiGRAJ-GD 12/04/2011 大野 功二
Kenneth Chan
 
111204 受発注のコミュニケーションイベント資料
111204 受発注のコミュニケーションイベント資料111204 受発注のコミュニケーションイベント資料
111204 受発注のコミュニケーションイベント資料
Ryohei Katayama
 
Mda framework for gcs2013
Mda framework for gcs2013Mda framework for gcs2013
Mda framework for gcs2013
Kenneth Chan
 

Similar to ゲーム開発とデザインパターン (20)

A Framework for integrating software design patterns with game design framework
A Framework for integrating software design patterns with game design frameworkA Framework for integrating software design patterns with game design framework
A Framework for integrating software design patterns with game design framework
 
Xp Terakoya No04
Xp Terakoya No04Xp Terakoya No04
Xp Terakoya No04
 
Dc3 profile 1
Dc3 profile 1Dc3 profile 1
Dc3 profile 1
 
Developers Summit 2013【14-E-4】デザインをするときにデザイナーが考えること〜デザイナーの頭の中〜
Developers Summit 2013【14-E-4】デザインをするときにデザイナーが考えること〜デザイナーの頭の中〜Developers Summit 2013【14-E-4】デザインをするときにデザイナーが考えること〜デザイナーの頭の中〜
Developers Summit 2013【14-E-4】デザインをするときにデザイナーが考えること〜デザイナーの頭の中〜
 
プログラムと名前にまつわる座談会
プログラムと名前にまつわる座談会プログラムと名前にまつわる座談会
プログラムと名前にまつわる座談会
 
Game design pattern language
Game design pattern languageGame design pattern language
Game design pattern language
 
デザイン仕様書(ガイド)の書き方 (初歩者用)
デザイン仕様書(ガイド)の書き方 (初歩者用)デザイン仕様書(ガイド)の書き方 (初歩者用)
デザイン仕様書(ガイド)の書き方 (初歩者用)
 
リードデザイナーってどんな人か考えてみた
リードデザイナーってどんな人か考えてみたリードデザイナーってどんな人か考えてみた
リードデザイナーってどんな人か考えてみた
 
ブランド勉強会プロセス編2
ブランド勉強会プロセス編2ブランド勉強会プロセス編2
ブランド勉強会プロセス編2
 
DiGRAJ-GD 12/04/2011 大野 功二
DiGRAJ-GD 12/04/2011 大野 功二DiGRAJ-GD 12/04/2011 大野 功二
DiGRAJ-GD 12/04/2011 大野 功二
 
BPSttudy#84 アイデアをカタチにする方法
BPSttudy#84 アイデアをカタチにする方法BPSttudy#84 アイデアをカタチにする方法
BPSttudy#84 アイデアをカタチにする方法
 
デザインパターン
デザインパターンデザインパターン
デザインパターン
 
Game Design in Society (in Japanese)
Game Design in Society (in Japanese)Game Design in Society (in Japanese)
Game Design in Society (in Japanese)
 
カードゲームで学ぶテキストエディタ
カードゲームで学ぶテキストエディタカードゲームで学ぶテキストエディタ
カードゲームで学ぶテキストエディタ
 
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1  ドメイン駆動設計の基本を理解する3週連続DDDその1  ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
 
これからはじめるサービスデザイン
これからはじめるサービスデザインこれからはじめるサービスデザイン
これからはじめるサービスデザイン
 
111204 受発注のコミュニケーションイベント資料
111204 受発注のコミュニケーションイベント資料111204 受発注のコミュニケーションイベント資料
111204 受発注のコミュニケーションイベント資料
 
『ゲームクリエイター育成会議 オフラインミーティングVol.1 「遊びと学びの研究者に聞く、ゲームデザイナーの育て方」』に参加するにあたって自分なりに考えたこと
『ゲームクリエイター育成会議 オフラインミーティングVol.1 「遊びと学びの研究者に聞く、ゲームデザイナーの育て方」』に参加するにあたって自分なりに考えたこと『ゲームクリエイター育成会議 オフラインミーティングVol.1 「遊びと学びの研究者に聞く、ゲームデザイナーの育て方」』に参加するにあたって自分なりに考えたこと
『ゲームクリエイター育成会議 オフラインミーティングVol.1 「遊びと学びの研究者に聞く、ゲームデザイナーの育て方」』に参加するにあたって自分なりに考えたこと
 
Mda framework for gcs2013
Mda framework for gcs2013Mda framework for gcs2013
Mda framework for gcs2013
 
111112 受発注のセオリーイベント資料
111112 受発注のセオリーイベント資料111112 受発注のセオリーイベント資料
111112 受発注のセオリーイベント資料
 

Recently uploaded

Recently uploaded (12)

論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 

ゲーム開発とデザインパターン