「エンジンに頼らず一からプログラミングしてるんだ~♪」(by ねねっち[アニメ「NewGame!!」より])
いいこというじゃない、ねねっち。
そんなわけで今回は、エンジンに頼らないで、ゲーム開発の地力を得るために必要なおすすめ技術書の数々をご紹介。Unreal EngineやUnityを使って開発する場合は、こんな記事よりもパッチノートを熟読した方が有益かもしれませんよ。
ではいってみましょう。
(編集後記:こんなに書くつもりじゃなかったのに書き出したら紹介したくなって大作(長文)になってしまった・・)
Contents [hide]
ゲームが動く根本原理を理解する
ゲームプログラマになる前に覚えておきたい技術
ゲーム開発の基礎から、ゲーム開発で考慮すべきC++のポイント、3D座標変換の計算の本質、コリジョン判定、骨アニメーション、データ化・・・などゲーム開発するにあたって身につけておきたい一通りの知識が幅広く、そして根本原理から得られる超有益な本です。
8年前、ゲーム業界で働き始める直前に僕自身がゲーム作りの根本を学んだ本です。そのタイミングでこの本が発売されていたことは今思えば幸せでした。昔は、2Dゲーム作りから始まり、ハードウェアの進化ととも技術をアップデートし、自然とこういった知識を身につけていったと思います。今は、3Dゲームを作るとなると、いきなりこれらの知識全般とぶつかることになります。そういった知識が、根本原理から順序立てて解説されてます。
9年前の本ではありますが、ゲーム作りの根本的・普遍的な内容ですので、いまだに間違いなく有益な本です。このレベルで根本まで噛み砕いて解説してくれている本は他にありません。まさしく、エンジンに頼らないでゲーム作りできる技術力を身に付けたいのであれば必読の一冊です。逆にエンジンを使ってゲームロジック実装のみに集中したいのであれば無用の長物となるでしょう。
現場で使えるゲーム開発の全般知識を得る
ゲームエンジン・アーキテクチャ(第2版)
「ゲームプログラマになる前に覚えておきたい技術」に並んで、必読な本。ただし、ゲーム開発初心者が読むには多少敷居が高いです。
タイトルからするとゲームエンジンを作るための本とも思いがちですが、ゲームエンジンを作るためにも必須なゲーム開発全般の知識を詰め込んだ本です。UnityやUnrealEngineはどうやったら作れるかということではありません。そういったゲームエンジンを作るための前提知識、すなわち、ゲーム作りの基本の知識です。
前半では、C++やMath(数学)、開発環境やデバッグ、並列化といった、ゲーム開発に当たってのベースの知識が比較的最近の事例として解説されており、今読んでも問題ない内容です。また、後半では、グラフィクス、アニメーション、物理といった比較的高度な専門知識を必要とする内容を、浅すぎずかつ実用的に解説しています。開発内容によりますが、ここの知識だけでも事足りることも多いかもしれないです。終盤では、ゲームエディタとして必要な要素や、ゲームループの実装、オブジェクトの実装などより上のレイヤーのゲームのフレームワーク実装について解説されています。継承ベースではなくコンポジション指向で実装する方法など、近年の変更に耐えられるゲームコード実装方針などの知識も詰まっています。
個人開発でもいいのでゲーム開発のフローを少し体験してから読むと、それまでよくわからなかった部分や、浅かった知識を深めるのを手助けしてくれる有益な本となるでしょう。
ゲームコーディング・コンプリート
こちらもゲーム開発にあたって必要な知識を網羅的に取り扱っている本。同様に、C++やMath、グラフィックなどゲーム開発に必要な幅広い内容を解説しています。ただし少し内容が古いです(日本語版で2010年発売。原著はもっと前)。ゲーム開発は、ベースの部分は普遍的な、数学やC++の低レベルな部分の知識が前提となるのは、昔から変わりないので、役に立つ部分はいまだに多いですが、開発環境や、最近のテクニック的な部分は古い内容なのは否めません。
まずは、上記した2冊(ゲームプログラマになる前に覚えておきたい技術、ゲームエンジン・アーキテクチャ)を読んで余裕があれば眺めて、有用そうな知識を吸収すると良いです。
現場で使えるゲーム開発コードパターンを知る
ゲームプログラマのためのC++
ゲームプログラムに必要な観点(60FPS維持やイテレーションを早めるなど)からC++の各要素(継承、テンプレート、例外)の使用方法やその注意点、メモリの取り扱い、STLやデザインパターンを考慮した実装パターンの解説など、現場で扱われる問題やテクニックが多く解説されています。
C++は低レベルな操作が可能な高級言語ですが、その性能を活かすも殺すも使用者次第です。C++をゲーム開発に活かすための知識が詰め込まれた良書です。
Game Programming Patterns
デザインパターンをゲームで使うシチュエーションに当てはめて解説したり、ゲーム向けのGoFにはまらないパターンを挙げています。
変更に強くする設計パターンや、データ駆動実装するためのパターンなど、ゲーム実装をフレキシブルにする例がいくつかパターンとして紹介されています。個人的にバイトコードパターンがデータ駆動の可能性を大きく広げてくれて、好きです。
また、最適化、負荷軽減という部分を考慮したパターン解説などもあります。昨今は最適化といえば、必ずといっていいほど触れられるキャッシュミスを減らすためのパターンなども紹介されています。
ゲーム開発のイロハがつかめてきた後に読むと、さらに実装パターンの幅が広がって良いです。
デザインパターン系の本
本家デザインパターンの本も何か1冊は読んでおいて損はありません。ただ、勘違いしてはいけないのは、デザインパターンは魔法の道具ではありません。実際大したことをやっているわけではありません。それ普通に実装で取り入れてたわ、なんてパターンが結構多いです。安全かつ変更に強く、といったことを心がけて普段からしっかりと設計し、スキルがありそうな人のコードを読むなどしていれば自然と身についていることが多いですし、そうあるべきだと思います。
本でこんなパターンがある、といわれてもピンと来づらいものです。必要なときに自分で考えぬいて適用した方が身につきます。デザインパターンの本を読んで、あぁこれね、ってゆう答え合わせになるのが理想だと思います。
ではなぜ読むのかというと、よくいわれているのが、共通の名前が着くことで、会話・意思疎通がしやすくなるというメリットです。他の人、例えば後輩ができたときに、「よくあるあれをこうするやつ・・」みたいな抽象的ないいかたをせずとも、デザインパターンの〇〇で設計すると安定する、なんて会話ができるのがメリットです。
で、実際の本ですが、僕自身は独習デザインパターンを読みました(例がC++だったという理由だけ)が、悪いほどではないですがわかりやすいとは言い難いです。結城浩さんの本↓が評判良かった気がします。
現場で使う数学処理を知っておく
数学の知識は、あらかじめ読んでおくと理解は深まりますが、実際には使うタイミングでリファレンス的にみることのほうが多いと思います。
実例で学ぶゲーム3D数学
数学に関しては、基本はこれがあれば問題ないかと思います。2Dも3Dも変換処理載っています。Vector, Matrix, Quaternionの各種計算や、それぞれへの相互変換など。鏡面反転や、アフィン変換以外の変換等含めて、幅広い内容が載っています。
ゲームアプリの数学
かなり基礎的な内容から平易な文章で読みやすいことと、スプラインや補間に関して取り上げているのがポイントです。意外とスプラインや補間の解説ってないんです。ゲーム3D数学と合わせて手元に置いておいて損はない本。Unityも取り上げているのでUnity好きな方はなおよしです。
ゲームを動かす数学・物理
最近見て意外と良いなと思った本。3D数学変換の内容は深くはないですが、コリジョン(衝突)と乱数といった、あまり他の数学本にのってないトピックがのっています。コリジョン周りは、後述の本が最強ではありますが、そこまで必要ないと思うなら、この本にのっている程度の知識は身につける、またはリファレンスできるように置いておくと良いと思います。
ゲームプログラミングのためのリアルタイム衝突判定
最近だとコリジョン判定も物理エンジンに頼るのが普通になってきてますが、ベース知識としてどういった計算で判定をしているかを知っていると良いです。
オーバーラップ判定や交差ポイントを取る方法とその計算コストは、シェイプによって大きく変わることがわかります。物理エンジンを使っているとしても、どういったシェイプを取り扱ってあげれば軽くなるのかイメージが付きやすくなると思います。また、場合によっては自前でコリジョン判定実装することもあります。よりルールを単純化(xz回転はしない条件にするなど)して、自前で判定してあげたほうが処理が単純かつ負荷軽減することが可能です。
10年以上前の本ですが、書いて有ることはコリジョンの原理の部分なので、いつまでも通用する知識です。お高いのが難点。
C++の理解を深める
やはりゲーム開発は性能を追い求めるため今後もしばらくC++ベースです。C++の知識は可能な限り幅広く身につけておいて損はないです。 EffectiveC++は必須ですね。
ロベールのC++入門講座
C++の言語機能は、一通り何かしらで触れておいた方が良いのですが、入門本だと浅い知識になりますし、かといって言語仕様書のような本は学習目的には向いていません。その点こちらの「ロベールのC++入門講座」は、入門と謳ってはいますが、かなり幅広い内容に触れながら、学習形式に向いたチャプター区切りの構成であり、著者の平易な語り調で学習しやすいです。テンプレート、関数ポインタ、メモリ配置、といったことまで最終的に通しで学べるのは貴重です。
「初心者を中級者まで育てる本」というのが最も相応しい謳い文句かなと思っています。10年前の本ですが、いまだに売れ続けている理由が上述したバランスの本がいまだにこれしかないような気がするからかなと思っています。
ただし、C++11/14の内容は一切含まれていないので注意です。モダンなC++のコーディング方法を効率的に学びたいなら、最新書籍を随時調べたほうが良いでしょう。この点を差し引いても、初心者が中級者へステップアップするのには、いまだオススメの本だと思います。約1000ページありますが、思ったよりはスピーディに読み進められると思います。
プログラミング言語C++ 第4版
C++の生みの親ビャーネ・ストラウストラップによる、C++11までのすべてがつまった本。細かな仕様まで、C++について知りたことがあればこの本で知ることができます。STLの内容も含まれています。
濃い内容と大ボリューム(1360ページ)の本なので、C++の初学として一から最後まで読むのはなかなか難しいです。リファレンス的な使い方や、ある程度C++に慣れた人が足りない知識の部分を補間するために読む、といった読み方がおすすめです。ただ、内容はただの「言語仕様の列挙」ではなく、案外読みやすい解説文章となっているので、時間と根気があれば読み物としてC++のすべてを一から最後まで追っても良いでしょう。
C++で開発するなら手元に1冊あると心強い本です。
Effective C++
C++の言語機能を一通り学んだら読む本。必読といってもいいです。この本に載っている内容は、現場でほぼ常識として知っておくべきことといっていいほど、重要なことが書かれています。
constや参照の使い所や、virutal宣言をすべきでないとき、new,deleteのカスタマイズなど、言語仕様を学んだのはいいけど使い所は?、といった疑問を解消してくれるエッセンスが詰まっています。また、C++をただ学習しただけでは頭に入っていないような気をつけるべきこと(メモリのアラインメントやスタック変数の寿命、コンパイル依存性によるビルド時間肥大化など)が明示的に解説されており、どういったことを考慮してC++を使うべきか意識が高まります。
C++で物作りをするならば、必読の一冊です。
More Effective C++
Effective C++で語りきれていないC++のプログラミングエッセンスの解説。Effective C++の方がやはり基本かつ重要なことが多く、こちらのMoreの方では、なかなか細かい部分になってきています。リソース管理(メモリ、参照カウントなど)やデザインパターン的な内容の比重が大きい印象です。
できるなら読んでおきたいが、即効性のあるような効果は期待できない。Effective C++を一通り把握した上で余裕があるなら読んでおきたい本です。
Effective Modern C++
ModernはC++11/14のこと。基本的にC++11/14に関する内容のみで、C++11/14を解説しているのではなく、C++11/14の機能を使う場合にどういったことに気をつけて、どう活用していくべきかが書かれています。これまでのEffectiveと同様、C++11/14の機能をある程度把握して使いはじめてから読んでこそ、内容が頭に入ってくると思います。
C++11/14をがっつり使い始めたら読んでおきたい本です。
Effective STL
STLの扱いで注意すべき点が載っています。STLには意外と知らない機能や、認識できていない落とし穴があります。読むとSTLを安全かつ効率的に扱えるようになります。ただし古いのでC++11より前の内容です。C++11以降で入った機能で改善されるものも多いかもしれません。すでに絶版となっています。
コーディングのお作法を学ぶ
言語を学べば、何か作ることは可能にはなるのですが、プロとして通用するコードとはどんなものか知る必要があります。そのためのお作法を学べるのが以下に挙げる本です。
Code Complete 上
設計の重要性、設計と実装をすすめるバランスや考え方、オブジェクト指向設計において重要なこと、コーディング自体で気にかけるべきこと、コーディングのお作法、それらを網羅的に学ぶことが出来ます。現場で使えるコードというのは、ただ動けばよいのではなく、保守性、拡張性、再利用性などの高いコードを指します。そういったコードにするにはどうするのかという、考え方や実例を学ぶことが可能です。
(特にオブジェクト指向)プログラミングにおいて、言語仕様よりも重要な根本的で普遍的な内容であり、必読の本といえます。ただし、文章や言い回しがわかりにくい部分もあるため、若干読みにくいと感じる人もいるかもしれません。
リーダブルコード
コーディングお作法部分を平易に語った本。命名方法やコードブロックの粒度などオブジェクト指向設計に限定しない普遍的な、読みやすいコードにするとはどうゆうことかが書かれています。Code Completeを読んでいるならあまり目新しい発見はないですが、Code Completeとくらべて、内容量も少なく、文章も読みやすいので、若手や万人が読みやすいのはこちらの本だといえます。
リファクタリング 既存のコードを安全に改善する
すみません、紹介しておいてこの本は自分は読めてないのですが、コード設計レベルやお作法を学ぶには、リファクタリング本が役立つと思われます。昔からある名著の部類に入るもので、2014年に新装されたので、読むには良い機会だと思います。(そのうち読む)
ツールやスクリプト環境を作れるようになる
ゲーム作りではイテレーションを早く回すためデータ駆動となるよう、環境を作っていく必要あります。そのためには、ツールやスクリプト環境を導入していくこととなります。
大規模開発だとツール担当者が決まっていたりしますが、それにとらわれずツール等を自作できると自身や周囲を含めた作業効率が大幅に改善されることもあります。主要言語(C++)と別に、軽量系言語も何かは使えるようにしておきましょう。
〔速攻入門〕 C#プログラミング すぐに現場で使える知識
Windowsのツールを作るならやはり王道はC#でしょう。C++やJavaとの違いをベースに解説しているので、どちらかを習得していると、差が明確になってよいです。比較的短くまとまっているので読みやすいです。C++知識がベースにあれば、C#はこの本とネットで事足ります。
Python系
Lightweight Languageなら今はPythonが人気です。特に流行りのAI・ディープラーニング関係のライブラリが豊富ですので、将来性としてもオススメです。ネット学習でもいいと思いますが、僕は以下の本でざざっと眺めて把握、リファレンスとしても利用しています。
Ruby系
軽量言語で残りおすすめできるのはRubyです。Ruby自体は、非常に書きやすいオブジェクト指向の軽量言語でこちらも良いと思います。ただ最近はWeb向けの印象が強くなっています。
組み込みスクリプト(Lua)
ツールだけじゃなく、組み込みスクリプトを使えるようにして、ゲームロジックをプログラム可能としながらイテレーションを早くすることも重要です。組み込みスクリプトだとLuaが最もメジャーかと思います。下記の本に、LuaとC++の連携からわかりやすく書いてあり、導入は難しくありませんのでスクリプトを試してみたい場合良いと思います。
ゲーム開発テクニックの具体的レシピを知る
ゲームのコード実装は、様々なアイディアの集合体です。コンシューマハードの制約下(省メモリ、低処理負荷、高フレームレート)で、いかにかっこよく、多くのことを実現するか、そのために多くのアイディアが世に出されてきました。そういったゲーム特化した技術アイディア集として以下のようなものがあります。
Game Programming Gemsシリーズ
ゲーム開発テクニックレシピといえばGemsシリーズです。刊行は止まり少し古くなりましたが、最近でも十分役立つようなアイディアやヒントになることは意外と散らばっています。日本語版がお高いのが難点です。さすがに古い内容なので、フルプライスでシリーズをそろえて読むほどではないですが、開発現場などにはよく置いてあると思うので眺めてみると良いと思います。
Game Engine Gems シリーズ
最近のゲーム開発のGemsはこちらの印象です。ゲームエンジンレベルで使えるベースのグラフィクスやキャラ制御、AIなどの実装テクニックが最近のトピック含めて載っています。英語版しかないのが難点です。
低レベルなレイヤーを理解する
C++は高級言語ですが、低レベルなレイヤー(メモリ等を直接)を扱える言語です。C++を上辺だけの、オブジェクト指向やテンプレートが使える言語として扱うのはC++を使いこなしているとはいえません。時には、メモリのアラインメントを意識し、時には各データtがどうゆうビット列で構成されているか意識し、時にはメモリ以上に高速なキャッシュアクセスを意識する。そういったことができてこそ、C++本領発揮といえます。その辺を理解するのに必要な本です。
プログラムはなぜ動くのか
まさしく、低レベルレイヤーを理解するための本です。CPU、メモリ、記憶装置の基本構成からレジスタ、アセンブラの動きまでかなり読みやすく書かれています。低レベルな部分はより難しい印象ももたれがちですが、かなり読みやすい本です。古い本ですが、プログラムを組んでCPUを使う限り普遍的な内容です。今でも間違いなく読むべき一冊、低レベルを意識するなら必読の一冊です。
コンピュータはなぜ動くのか
上記「プログラムはなぜ動くのか」をよりコンピュータアーキテクチャよりにした内容です。こちらも普遍的な内容なので古いですが、読んでおくとよい本です。
プロセッサを支える技術
プロセッサ(CPUl)がどう構成され、どう計算しているか、そこにどういった技術が詰め込まれているかがわかります。キャッシュや仮想メモリなどの、データアクセスへの高速化への手がかりも記載されています。下記のパタヘネ本よりは読みやすいので、プロセッサの動きを理解するのに読んでいるといい本だと思います。
パターソン&ヘネシー コンピュータの構成と設計 上・下
コンピュータアーキテクチャをかなり低レベルな部分から網羅的に扱った本です。コンピュータアーキテクチャの教科書の定番のような本。プロセッサで使える命令セットのレベルから、プロセッサの構成などまで、組み込み系でもいけるレベルの知識が詰まっています。文章的に読みやすくはない上に、内容が低レベルの詳細に特化しすぎているので、余裕があればでいいと思います。
今気になっている本
今回紹介できてないですが、最近気になっている本こちらです。そのうち読めれば、上記の紹介側へ記載したいところです。
Optimized C++ ―最適化、高速化のためのプログラミングテクニック
C++最適化は奥深くも面白い領域です。知っていおいて損はないでしょう。
プリンシプル オブ プログラミング3年目までに身につけたい一生役立つ101の原理原則
ソフトウェア開発における「原則」はたしかにあります。原則は守りたいが守れてないのが実際です。原則は改めて学びたいところ。
ベスト5に厳選!
最初の想定より多くなってしまいました。入門者にこんなにぶつけて心を折りたいわけじゃないんです。良かった本紹介したら結果こうなった・・。
ということで、特にこれからゲームプログラマを目指し始める人を想定して、中でもおすすめの5冊を厳選しました。
以上!
この5冊を7割以上理解していれば、ゲームプログラマとして現場でも問題なく働けると断言しましょう!(保証なし!!!!僕のおすすめであることだけ保証します。)
上記5冊でゲーム開発にこなれてきたら、次点で
あたりが、ゲームプログラミングの幅を広げたり知識を深掘りするのにおすすめです。
まとめ
いかがだったでしょうか。入門者が見たら多すぎ乙・・。って感じが大半の感想でしょうか。 もちろんはじめからこれらの知識すべてがあるべきというわけではありません。日々勉強して足りない知識・必要な知識を徐々に補完していければいいと思います。
また、「エンジンに頼らない」という謳い文句の本記事ですが、エンジンを利用した開発でももちろん身につけておいたほうがよい知識ですし、エンジンカスタマイズするなら同様に必須の知識となるでしょう。
それから今回は、ゲームプログラムのベース知識向けのもので、今回触れてない分野として、グラフィクス、ネットワーク、AI、プログラマ精神論、エディタなどの環境周り論、などの大きなジャンルもあります。僕は特にこれらのエキスパートというわけではないのであまり語るに値しないと思っていますが、機会があれば取り上げてみたいですね。
いじょうでっす。
Comment
[…] エンジンに頼らないゲームプログラマになるためのおすすめ本まとめ ニュース解説 – […]