プログラミングをどう学んでいくか

# 初めに
　この記事を書こうと思ったのは~~次の記事までの時間稼~~（ゲフンゲフン）、コレまでにプログラミングを「どう学んできたか」をこれから学ぶ人の為にもアウトプットしていこうかと思ったからです。割と適当かつ気楽な感じで書いていくので気楽に見ていってください。
　書いている事は私の経験＋αなので、偏りやおかしい所などあると思いますが、あくまで一個人の意見なのでご了承下さい。

# 筆者の経歴

+ 言語歴
    + C/C++：約３年半
    + C#：授業で学んだ程度
    + Python：授業で学んだ程度＋数時間独学
+ 開発環境
    + ほとんどVisualStudio2019, ごくたまにVSCode

これ以上書いても堅苦しい事になるのでさっさと次へ行きましょう。

# プログラミングを組む「目的」を決める
　何をするにもまず「**目的**」が決まっていないと、普通はまず続きません。ごくたまに目的そっちのけでプログラミングそのものに興味を持つ人もいますが、そういう人は例外です。Out Of Rangeです。
　兎にも角にも「目的」が決まっていない人は、まず「目的」を決めることから始めて下さい。この「目的」は**決してブレないように**かつ、**一つだけ**にして下さい。やはり、目的がブレブレになると、プログラミングをする「方向性」までブレブレになるので重要です。同じように複数の目的を持つのも同じ理由で、更には時間も足りなくなるからです。
　私は「ゲームを作りたい」という一心でプログラミングをし続けています。そしてこれからもプログラミングをし続けていきます。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/4e249149-8cb0-3332-fa77-35b9d2dc1489.png)

# 最初は本「も」買うべき
　完全に０からプログラミングを始める場合は、やはり教師となる「何か」が必要です。その「何か」については色々と意見が分かれると思います。なので、あくまで１つの意見として受け取ってください。

　私は独学にしろ、どこかしらの学校で勉強するにしろ、本も使いつつ勉強するのが手っ取り早いと考えています。勿論、この記事のようなウェブサイト・Youtube・SNSなど色々な角度から無料で情報を取得できる時代です。そんな時代に「お金のかかる本？」と思うかもしれません。コスパの面で考えれば本は悪い選択です。ですが、いまだに本（電子書籍）が残っている理由を考えると悪くない手段だとは思います。では、なぜ？と思いますよね。
![book vs website.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/98845043-9e5b-076d-dd8a-3c41a206b021.png)


1. 本を見た時に「必要な情報」と「**＋α**」の情報が取得できる可能性が高い
    1. 必要な情報は他の手段でも取得できます。本は同じページに「＋別の情報」が書かれている場合もあるので、そういった点に関しては利点といえるのではないのでしょうか
1. 複数人で監修されている可能性が高く比較的信頼性が高い
    1. 「複数人」で情報を見る事は重要。
    1. 著者自体が有名な大学・会社・組織に携わっている場合もある。
1. 海外の著者が書いた本が翻訳を経て、情報を取得できる。
    1. ウェブサイトだと色々とやりようがあるんですが...。少し昔だとどうしても情報が本経由になる場合が多いので、日本語化してくれるだけでも非常にありがたいです。
    1. といっても、そもそも０から学習する場合は関係ない事がほとんどなので、気にしないで下さい。

いい所ばかり上げてもあれなので、逆にデメリットを上げると

1. 有料（当たり前）
1. 間違いがあった時の修正が出来ない
    1. 第〇版で修正されるか、公式サイトなどで間違いのアナウンスがされる
1. 本に書いてあることは大体ウェブサイトに書いてある
    1. 当たり前なんですが、本で学ぶ内容自体はウェブサイトなどで書かれています。

　まとめてみた結論としては以上になります。基本スタイルは本以外で情報を入手して、気になった所は本で調べてみるといった感じがベストなのではないかと考えています。つまり、本は「絶対必要というわけではないがあったほうが便利」というものです。なので、本当に必要かどうかは考えてから購入する事をオススメします。
![website + book.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/48a4ef09-299c-a5ce-833c-57319667eb27.png)

# 学ぶ言語と使う道具
　今更ですが、目的が決まったら「どのプログラミング言語を使うか」の選択がありますが、これは簡単です。必要に応じて選べばOKです。具体的には各自で調べてください。

　<font color="red">これ以降は**ゲームプログラミング**の話になるので、ゲームプログラミング以外の目的に来られている場合は、次の[勉強するときのコツのようなもの](#勉強するときのコツのようなもの)まで飛ばして下さい</font>。

　ここで一旦立ち止まって考えます。一言に「ゲームを作りたい」といいますが、ゲームのどの部分を作るかで使う道具は異なってきます。下図をご覧ください。
![プログラミングをどう学ぶか.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/91c5f74f-d883-c314-2c6b-9dd47c152950.png)

## アプリケーション部分を作りたい
　この記事を見ているほとんど方は、作りたいものはアプリケーション部分になると思います。そうなると、必要な道具は必然的に何かしらのライブラリを使ってゲームを作ることになります。結局「何のライブラリを使えばいいの？」となるので説明したいと思います。

### ゲームエンジン一覧

+ Unity
    + 一番有名なゲームエンジン
    + とりあえずコレを選んでおいたら問題ない
    + 日本語での情報が非常に多く非常に使いやすい
    + 初心者用の本も非常に多い
    + 開発言語は**C#**か**Bolt**を使用
    + エンジン自体は比較的軽い

![Unity.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/540c10f8-cd0d-a353-255e-b2da793ecdd4.jpeg)

+ Unreal Engine4
    + ハイエンドゲームでよく使われるゲームエンジン
    + Unityと比べると日本語の資料数は少なめ
    + 初心者用の本が結構少ない
    + 開発言語は**C++**と**Blueprint**のどちらか、もしくは両方を使用
    + エンジン自体はかなり重たい
![UE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/8e29693a-716a-17a1-efe3-47de470a3e2b.png)

+ GameMaker Studio 2
    + 2D特化のゲームエンジン
    + Undertaleはこのゲームエンジンで作られていたりする
    + 初心者用の本がとても少ない

![GameMaker Studio2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/fb48ac8a-17fa-f048-8662-854521a416fa.png)

+ Ren'Py
    + ヴィジュアルノベルに特化したゲームエンジン
+ RPGツクール
    + 名前の通りRPGに特化したゲームエンジン

### 結局

　これだけ色々なゲームエンジンを例に挙げましたが「結局使うのはどれやねーん」となるので言います。<font color="red">**Unityを使って勉強兼ゲーム制作をしてください**</font>。やはり、勉強するには日本語で情報を取得する手段が沢山ある方が絶対いいからです。ただし、言語はC#になるので注意してください。
　調べてみた所、こちらにも「Bolt」というヴィジュアルスクリプティングの手段が出ているので、UE4でのBlueprintの点で差は小さくなってきているのかなとは思います。
![Bolt - Visual Scripting.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/7e823b13-70b5-25dc-4872-9aaf1f17fc15.jpeg)

　じゃあ、UE4はどうなのかというと、勿論こちらでも大丈夫なのですが、Unityよりも日本語の情報手段は少なくなってしまいます。ですが、ヴィジュアルスクリプティングである**Blueprint**という手段もあり、そういう意味では非常に強い点になると思います。個人的にはC++で実装出来るのはありがたいですね。
![Blueprint - UE4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/970d0fe7-25b3-c3ce-95ca-973427cc32f1.jpeg)

## エンジン部分を見てみたい
　実際にこう考えている人はどれぐらいいるのでしょうか？「実際にゲームに使われているグラフィック部分やエディター部分を作ってみたい」という物好きな人には、ゲームエンジン側でそういった部分（エンジン内ではマテリアルだったりシェーダーだったり）をいじれたりするので、そこから手を付けていくべきかと私は思います。
![MaterialEditor_Windows.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/9f42d416-e4cc-16b0-aa3d-6618a12c67fa.jpeg)
![shader_graph-1-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/fbdbd89d-5b00-64f9-aa37-e05829ad0787.jpeg)
　１からグラフィックを勉強したいという人は、DirectX11[^0]を使って勉強する事になると思います。まあ、色々地獄なのですが...。これを楽しめると色々な意味で勝ち組です。

[^0]: DirectX9はかなり古いのですが、DirectX11と比べればかなり簡単だと思います。ただ、Compute ShaderやGeometry Shaderなど一部機能が無かったりするのですが、この時点で気にしても仕方ないかと思います。とりあえず、挫折しない事が大事なので...。

# 勉強するときのコツのようなもの

+ 出来る限り毎日勉強するようにして下さい
+ 特に最初の時は細かい目標を立て、目標を達成した時の「達成感」を大切にして下さい。
+ 頭で処理できなくなったら、メモなどを使い実際に書いて整理してみてください。

　私が考えるコツはこれぐらいです。上記以外は各自で考えてみて下さい。そして、自分に合った勉強法を見つけ、楽しく作品を作って下さい。言語をある程度使えるまでは絶対作品を作るのが難しいと思います。なので、最初は言語勉強を苦労しつつand楽しみつつ頑張って下さい。
![computer_yaruki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/eede4160-f8b8-c007-745e-25d46aa2fa1a.png)

# 便利なサービス

## バージョン管理ソフト

+ [Git](https://git-scm.com/)
+ [Github](https://github.com/)
+ [Sourcetree](https://www.sourcetreeapp.com/)

　最初に勉強する時は不要ですが、いずれは必要になってくるのでここにのせています。詳細は各自で調べてみて下さい。

## その他

+ [Draw.io](https://app.diagrams.net/)（無料のオンライン作図ツール）
+ [Visual Studio2019](https://visualstudio.microsoft.com/ja/downloads/)（総合開発環境）
    + WindowsではVS2019か[VisualStudio Code](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)の二択になると思います。そもそも、プログラミングする上でIDEは絶対必要です。
    + 勿論無料です。
+ [GIMP](https://www.gimp.org/)（無料の画像編集ソフト）
    + 必要無いと思うかもしれませんが、日常生活でちょっとした画像編集やゲームで使うアセットなどに使うかもしれません。
+ [Blender](https://www.blender.org/)（無料の統合3DCGソフト）
    + 完全に個人的なオススメ。絶対必要というわけではありません。
+ [Google ドキュメント](https://www.google.com/intl/ja_jp/docs/about/)（オンライン上のメモ）
    + 別にPCのメモ帳でも構わないのですが、スマホで見直したり、突然頭に振ってきたアイデアを記入したりする場合は、どこでも編集できるオンライン上のメモ帳があると便利です。Wordが使えるといいのですが、簡易的な使用目的なら無料のGoogle ドキュメントで十分です。

# 最後に
　具体的にどんな勉強すればいいの？という点については各自で調べて下さい。今は調べればいくらでも出てきて、様々な方向から情報を取得できます。流石に言語に必要な情報は異なりますし、自分のやり方で勉強した方が捗る上に楽しめると思います。
　兎にも角にも、<font color="red">**挫折せず勉強を続ける事が大切**</font>です。モチベーションの維持は大切です。

# 参考サイト
[Steamで販売されているゲームで最も多く採用されているゲームエンジンは何なのか？がわかる統計データが公開](https://gigazine.net/news/20210903-game-engines-steam-data/)

# 素材
+ [いらすとや](https://www.irasutoya.com/)
+ [矢印デザイン](http://yajidesign.com/)
+ [ヒューマンピクトグラム2.0](https://pictogram2.com/)
+ [GameMaker Studio 2の画像参照元（AUTOMATON）](https://automaton-media.com/articles/newsjp/game-maker-studio-2-announced/)
+ [UEロゴ（Wiki）](https://ja.wikipedia.org/wiki/Unreal_Engine)
+ 他は公式サイトから引用（Unreal Engine / Unity 公式サイト）