ゲーム作成の教本って小難しくて意味不明だからゲーム制作の基礎解説してみる(1)

初めてゲーム作ろうと思った時、私はエクセルでゲームが作れる教本を手にしました。
結果は惨敗。配列は四角い箱ってなんですか？って感じで、何も出来ずに投げ出して終了しました。
そもそもゲームを作る本を読んでみても、基礎知識が抜けていたり、小難しく書いていることが多いなと個人的に思います。本を読んでもわからなかった、なんてことがあるのではないでしょうか。そこで私は私の知っている基礎知識を少しでも共有したいなと思いこの記事を書くことにしました。(Web業界のプログラミングの記事に対してゲーム業界のプログラミングの記事って少ないですしね)

ふわっとした知識で書いている所や、分かりやすくするために、あえて書き換えている所もあるので、**書いてあることをすべて鵜呑みにせず**、読んでいただいて、この記事をきっかけに素人さんも含めゲームを楽しんで作ってたりして貰えれば幸いです。

[第二回はこちら](https://qiita.com/OrotiYamatano/items/1777564b246141511248)

#あんた誰
なにはともあれ、見知らぬ奴にいきなりゲームについて語られても信用できないですよね。
自己紹介をさせていただきます。詳しくは語れませんが経歴のみ紹介します。

- やまだ　たいしと申します→ [ツイッター](https://mobile.twitter.com/OrotiYamatano)
- 経歴
 - 専門学校にてゲームの作成をサークルで参加。元ゲームプログラマの講師に基礎知識を叩き込まれる(PCゲー C++ Direct X)
 - システムエンジニアとしてWebを含め二年半ほど開発を経験(Java『SpringBootとかやってた』、PHP、JS、HTML、DBMagic) 
 - その後、案外楽しくないなと思い退職
 - ゲーム業界に転職(Unityでスマホゲー C#)

簡単に紹介するとWebとか、かじった下っ端ゲームプログラマ24歳💩ってわけです。

#で、何話すの？
- 対象

 > ど素人(中学生並み)、Unityとかのエンジンしか触ったことのないプログラマとか、Webやってたけどゲーム作ってみたいって人とか
 > ど素人向けでもあるのでわかりやすくしてます。
 > 分かりやすくしようとし過ぎたがためオイオイその説明全然正しくねぇじゃねぇか！って所もあります。
 > この記事を読んだからって知ったかぶりしたら大恥なので注意してください。苦情は受け付けません。
 > どうしても気になる人はこの記事を引用して別の記事を書いて指摘してください。(ゲームの記事が増えるだけで私は嬉しい)

- 内容

 > この記事をきっかけに右も左もわからない人が色んな調べるための取っ掛かりになるような内容を目指します。
 > そもそもコンシューマ、スマホ、筐体、PCゲームってどうやってできてるのか？どうやって動いてるのか。
(Webで言うところのgetとかpostとかの基礎知識部分まで言えればいいな)

>ゲームを作る上で必要な基礎知識全般。
この1回目の記事はゲームとりあえず作りたいけど、言語やら環境やらも何が何やら意味不明って人にオススメ。

#この記事を読む前に
俺はゲームを作りたいんだ！！！基礎なんてやってられるか！！！って人もいるかと思います。
そんな方はこの記事を読む前にゲームを一本作って来たら良いでしょう。熱量の有るうちに作るのが吉です。
ここでは基礎知識は教えますが、作り方は教えません。

良し分かった！今から作る！って方にアドバイスをしておきます。
ゲームを作るためにプログラムの勉強から行い教本にしたがってやるのもいいでしょう。
しかし、正直オススメできません。ハッカーが触りそうな黒い画面のコンソールに向かってHelloWord!の文字を出力させる。
なんて詰まらなすぎるのでUnityでもUnreal Engineでも何でもいいので実際に入れて作り動かす所から、やってみることをお勧めします。(因みにツクール/‎ウディタは否定はしませんが癖が強いのでオススメしません)

Unityはこちらで勉強してくれば良いと思います→https://dotinstall.com/lessons/basic_unity

ゲームを作る時は環境を整えるところで、つまずく人も多いです。私もそうでした。
そもそも中学生の私はローマ字さえ、まともに読めない阿呆でした。
教本どおりにやってもバージョンが変わっていたりして環境が整わない(動かない)ことがあるので心折れる前に簡単な環境から初めましょう。
正直、Web作成もゲーム作成も環境を整えるのが一番の難関です。
どんな大作だって走り出しは大変だと思います。焦らずいきましょう。

では、とりあえず基礎を知ってからにしようと考えた方や、もう既にゲームを一本作られた方は引き続きお読みください。
あ、もちろん熱量が冷めてしまった方も。

#ゲームの仕組み
##画面上に表示するときの動き
そもそも、どうやってゲームは動いているのか？

- コンソール(黒い画面。コマンドプロンプトとかターミナルとか)のプログラム 
- Web(インターネット)のプログラム
- ゲーム(PCゲームとかコンシューマとか)のプログラム

以上3つを比較しながら3つの違いを重点的に今回は説明していこうと思います。
(ゲームの動きや作りに関しては別途記事を書きます)

###xxxと文字と文字を出力する場合

- コンソールのプログラム場合 

> xxxと文字を出力してくださいとコンソールに対しての命令を出します。すると文字が表示されます。
コンソールはCUIと言って"基本的に"文字しか表示できません。グラフィカルなものは表示は無理です。

 - Webの場合

> xxxと文字を出力してくださいとHTMLとかでブラウザを通して端末に命令します。すると表示されます。

 - ゲームの場合

> xxxという文字をテクスチャ化(画像のようなものに)し、透明な板(ポリゴン)に貼付け、
表示する機能(**グラフィックライブラリ**)に表示しろと命令します。すると表示されます。
因みに画面に表示させることを**描画**と言います。ポリゴンを描画することを**レンダリング**といいます。(なお、デザイン業界では３Dモデルを書き出す事をレンダリングということも、あるので混合しないように注意が必要)

なんだか、同じプログラミングとはいえ、それぞれ難しそうにみえますね。
同じことをしようと思っても実現手段が全然違います。
単純にゲームを作るためにプログラムの勉強を漠然とすると大穴にハマります。

では、画像を表示する場合は文字と比べどう変わるのでしょう？
###画像を表示する命令をする場合
- コンソールの場合

> まず、その機能自体をプログラムで作り画像表示をOSに直接表示してくれと命令することになります。丁寧に沢山の命令を出す必要があります。これが出来る人は、十中八九変態です。それも変態と言われ喜ぶタイプ。

- Webの場合

> 画面表示するにはブラウザに命令し画像を指定してやると、勝手に**HTMLレンダリングエンジン**(グラフィックライブラリへの命令をしてくれるウェブ用エンジン)が表示します。超簡単、表示だけなら小学生でもできる。

 - ゲームの場合

> テクスチャ化された画像を、ポリゴンに貼付け、グラフィックライブラリに命令し画像の描画をします。難しい。

どうでしょうか？理解できましたでしょうか？
根本的には同じことをしていますが、それぞれ
コンソールの場合はグラフィックライブラリから作る必要があり、
Webの場合はHTMLレンダリングエンジンが勝手に画像を表示してくれ、
ゲームの場合はレンダリングエンジンの代わりに自分で書く必要がある。

つまり、画像を表示する命令をする場合、ゲームはコンソールよりは簡単でWebより厄介ってわけです。
かといって、コンソールがダメとか言うわけではなく、各それぞれに良いところ悪いところがあり用途によって使い分けるのが重要です。(Gitだとコンソールがいいですし推すし)

##ゲームエンジンとは
グラフィックライブラリへの命令を書くのは面倒です。
しかし、最近はその厄介な部分を一括で担ってくれるものがあります。
**ゲームエンジン**です。

物理計算やら、あたり判定の計算は通常通りグラフィックライブラリへの命令を書くことになると正直面倒です。
また、複数の端末(**マルチプラットフォーム**)に対応させる場合、環境依存の関係を調べ端末ごとにプログラミングをする必要があります。面倒。
ゲームエンジンは、そこらへんを(ほぼ)全部ひっくるめてやってくれる存在です。面倒を押し付けられます。

たとえばオブジェクトへのタッチ座標検出の場合、オブジェクトの大きさを定義して、どこに表示されているか画面上の座標を取得し、タッチした点は画面上のどこで、オブジェクトに対してどの程度タッチした点が離れているか判定する必要があります。円のあたり判定の場合、三角関数の計算を使ったり……。

これだったら自分で書くのは面倒ですし、ゲームエンジン使うしかないですよね。
でも、ゲームエンジンを使うのには欠点もあります。

例えば簡単な物理計算で十分な落ちものゲームを作った場合です。
必要ないにもかかわらず複雑な演算処理が入って、処理が重くなったり、想定しない演算がされてその部分を補うための修正が必要になったりします。
また、ゲームエンジンを使ってしまうと既存のゲームも同じゲームエンジンを使っていることが有ります。
同じゲームエンジンを使っているのですから、同じような表現方法になりがちです。
また、グラフィックを超絶きれいにしたいなどの細やかな修正に対応しきれません。(できないわけではありませんが大変です)

##ゲームエンジンの選定
自分がどんなゲームを作りたいのかによって、どのようなゲームエンジンとグラフィックライブラリを使うのか選定する必要があります。
ゲームエンジンも物理エンジンまでは対応してないものや、エンジンというよりライブラリに近いもの等様々です。
パソコンで動くノベルゲームを手軽に作りたい場合は吉里吉里とかを使えば良いし、ゲーム作るのを凄く凝りたいならDXライブラリやHavokエンジン等を使えばいい。
とりあえずゲームを作りたくて難しくないのをやりたければ比較的、環境構築の楽なUnityやWeb上で動くJavaScriptを探せばいいと思います。

#今回のまとめ
正直思いつくまま書いたのでグダグダですが、
私が言いたかったのはゲームはどんな環境で作れるものではない。
ゲームを作りたいからって教本を取るんじゃなくて何がしたいのかをハッキリさせて、しっかり勉強するものを決めましょう。ということです。
また、今回出てきた太字のワードでググるだけでも色んな事が知れると思います。私はそんな調べるきっかけとなるワードを今後どんどん出していきたいと思うので皆の調べるための踏み台になればいいなと思います。

次回は仕組みの話は一旦置いて、実際にゲームを作る場合ってどんな手順で進め計画したり、どんな役職の人がいるのかを解説していきたいと思います。

[第二回はこちら](https://qiita.com/OrotiYamatano/items/1777564b246141511248)