UnityでC#プログラミングの基礎を学習する

Unity+C#でプログラミングの学習をしましょう。
誤字脱字があったらコメントで教えて下さい〜

ここではUnityを使っていますが、Unityの説明はほとんどせず、プログラミング(C#)の解説をメインとしています。

##対象者
・Unity5系をインストールしている
・プログラミング初心者
・タイピングできる
・半角と全角の違いがわかる
人です。

##使用エディタ
エディタはUnityをインストールするときに自動的にインストールされるMonodevelop(モノデベロップ)を使用します。

##注意事項
・プログラミングは基本的に半角文字のアルファベットで書いています。日本語に対応していないプログラミングも多々あります。
・しかし、UnityはUnity5くらいから日本語に対応したので、わかりやすさを踏まえて所々日本語で書いていきます。
・全角スペースを入れないように注意しましょう。
・UnityやMlnodevelopはたまに強制終了しやがります。落ち着いて、起動しなおしましょう。
・詰まったらプログラミングの参考書を読んだり、 `1.Unityプロジェクトを立てよう` からやり直しましょう。プログラミングを学習するのは一筋縄ではいきません。
・「スクリプト」と「コード」はほとんど同じ意味として使っています。
・スクリプトはただのテキストです。怖がる必要がありません。
・プログラミングには構文という記述ルールがあります。構文を間違えるとエラーが発生します。正しい構文に修正すればエラーは消えます。
・プログラミングでコメント(構文としてコンピュータが見ない部分)を書くには、先頭に//をつけます。//を付けた行の//以降は全てコメントとして判断されます。
例

```
    // ここはコメント
    int hoge = 1; //ここからコメント
```
という感じです。
・コードを書く時に行番号を気にする必要はないです。
・空行はいくらあっても無視されます。
・なるべく分かりやすさ優先で書いているので、一部正確ではない表現も含まれています。

##用語説明
・Monodevelop => Unity付属のエディタ。たまにフリーズするけど気にしちゃ負け。
・スクリプト => コードとほとんど同義だけど、この記事では「スクリプトが書いてあるテキストファイル」という意味で使うことが多いです。
・コード => プログラミング文字列を指しています。
例えば

```
void Hoge() 
{
    if(isClear) {
        Debug.Log("ゲームクリアしたよ！");
    }
}
```

のようなプログラムの文字列をコードと呼んでいます。
・コーディング => コードを書くこと
・Hoge => ほげ、とよむ。別に意味はない。ゲームをやる時に主人公の名前を「ああああああ」にするくらいの扱い。いろんな場面で名前をつけるのですが、名前を考えるのが面倒なのでとりあえずHogeを使ったりします。

***
それでは勉強していきましょう〜

##1.Unityプロジェクトを立てよう
Unityを起動してください。
こんな感じのwindowが表示されると思います。
適当なプロジェクト名を入力してプロジェクトを作成しましょう :)
![Monosnap 2016-04-21 13-15-28.jpg](https://qiita-image-store.s3.amazonaws.com/0/67575/a85287f2-a032-ed46-ebb0-38c59dab5b4e.jpeg)
![Untitled - CharpTest - PC, Mac & Linux Standalone <OpenGL 4.1> 2016-04-22 10-27-43.jpg](https://qiita-image-store.s3.amazonaws.com/0/67575/7dfc64b5-76a8-dbc0-d981-f53982a9c2aa.jpeg)


プロジェクトが作成できると、いろんなwindowが表示されます。
Unityではこの見た目(Layout)を簡単に変えることができます。
windowのタブをドラッグしたり、画面右上のプルダウンメニューからLayoutを変更することができます。
今回はConsole , Project , Hierarchy , Inspector を使うのでこんな感じのレイアウトにしてみました。Windowのタブをドラックすれば誰でも変更できるので是非やってみてください。
![Untitled - CharpTest - PC, Mac & Linux Standalone <OpenGL 4.1> 2016-04-22 10-32-30.jpg](https://qiita-image-store.s3.amazonaws.com/0/67575/1238af0c-39de-a736-3202-17ba9e69db6f.jpeg)


###(プチ解説)UnityのWindowについて
UnityのWindowは沢山あります。特に重要なWindowを一言で解説していきます。
・Project (プロジェクト)
![Untitled - CharpTest - PC, Mac & Linux Standalone <OpenGL 4.1> 2016-04-22 10-28-28.jpg](https://qiita-image-store.s3.amazonaws.com/0/67575/7f89b2ff-da1f-06ab-4f4c-97a96689c637.jpeg)

`1.Unityプロジェクトを立てよう` で作成したUnityProjectで使用できる素材(画像や音声、スクリプトファイル等)を置く場所です。
・Console (コンソール)
![Untitled - CharpTest - PC, Mac & Linux Standalone <OpenGL 4.1> 2016-04-22 10-29-07.jpg](https://qiita-image-store.s3.amazonaws.com/0/67575/adbc1f5d-5a9a-bc34-1e16-ed7954c99401.jpeg)

スクリプトと連携して文字を出力させます。主にデバック時に使用します。
・Hierarchy (ヒエラルキー)
![Untitled - CharpTest - PC, Mac & Linux Standalone <OpenGL 4.1> 2016-04-22 10-29-37.jpg](https://qiita-image-store.s3.amazonaws.com/0/67575/1ee1ce19-fa81-94c6-4e02-d346078d6fc1.jpeg)

Unityは、基本的に1画面を「1シーン」という概念で管理しています。現在開いているシーンの中身がHierarchyに表示され、確認/修正/追加/削除等をすることができます。Hierarchyに画像を置いたりすることで画像が表示できるようになったりします。
・Inspector (インスペクター)
![Untitled - CharpTest - PC, Mac & Linux Standalone <OpenGL 4.1> 2016-04-22 10-30-01.jpg](https://qiita-image-store.s3.amazonaws.com/0/67575/1272f208-0ae4-e709-ea83-e5851437500c.jpeg)

ProjectやHierarchyに存在しているファイル(オブジェクト)の詳細を見れるwindowです。選択中のオブジェクトの詳細が表示されます。
・Scene
![Untitled - CharpTest - PC, Mac & Linux Standalone <OpenGL 4.1> 2016-04-22 10-30-23.jpg](https://qiita-image-store.s3.amazonaws.com/0/67575/d9412089-82bd-3a44-e4a2-c30f2aca84a6.jpeg)

現在開いているシーンを視覚的に見れます。今回は使用しません。
・Game
![Untitled - CharpTest - PC, Mac & Linux Standalone <OpenGL 4.1> 2016-04-22 10-30-39.jpg](https://qiita-image-store.s3.amazonaws.com/0/67575/3cbcd8cb-1892-95ef-5a11-20232b066332.jpeg)

現在開いているシーンをビルドしたときにどのように表示されるのかがわかるようになっています。今回は使用しません。

###Unityの設定を変える
Unityの設定をちょっとだけ変えましょう。
画面上部にあるメニューの
`Unity / Preference`
を実行します。
![Unity Preferences 2016-04-22 15-21-01.jpg](https://qiita-image-store.s3.amazonaws.com/0/67575/11b24dd0-bdd4-3138-fb7a-ea1153819b8c.jpeg)
これで後ほどゲームを再生したときに、わかりやすくなります。


##2.スクリプトを作成しよう
さて、スクリプトを作成していきます。
Unityでスクリプトを作成するのはとても簡単です。
**Project window** を使います。
1: Projectのタブのすぐ下にあるCreateメニューを選択しドロップメニューを出す
2: **C# script** を選択
するとProject Window内にC#のスクリプトが作成され、スクリプト名を記入できるようになります。
スクリプト名は下記のルールを守ればなんでもOKです。今回はわかりやすく **Test** にしました。
なお、スクリプトやその他のファイルをUnity上で作成する時は、拡張子は必要ないです。Unityが裏側で拡張子を付け足してくれるので。


**注意! 
スクリプト作成直後に、すぐにエンターを押してスクリプトを押すと、デフォルトで入力されている文字(NewBehaviourScript)がスクリプト名になってしまいます。
スクリプト名の変更は後からでもできるのですが、面倒かつ混乱するのでオススメしません。
スクリプト作成直後にスクリプト名を指定するようにしましょう。**


**注意2!
スクリプト名は以下のルールがあります。
・スクリプト名の頭文字は大文字アルファベットから始める(2文字目以降は小文字)
・スクリプト名では日本語は使わない
・スペースを入れない
これらを守りましょう。**
![Untitled - CharpTest - PC, Mac & Linux Standalone <OpenGL 4.1> 2016-04-21 14-13-07.jpg](https://qiita-image-store.s3.amazonaws.com/0/67575/bcd5f379-eebd-1fbb-1b44-c418a60e4b05.jpeg)



##3.Monodevelopの設定をしよう
Monodevelopはコーディングをアシストしてくれるエディタです。
Monodevelopを使うことで以下の利点があります。
・コード補完が効く(途中までコードを書いた時に残りのコードを自動で追記してくれる機能)
・Unityをインストールする時に自動的にインストールされるので楽

まずはMonodevelopを起動しよう。
MonodevelopはUnityと連携しているので、Unity上からMlnodevelopを起動することができます。
まずはUnityを開こう。先ほど作ったTestスクリプトをダブルクリックします。
すると、Unityにひも付けられているMlnodevelopが起動して、Testスクリプトを編集できるようになります。
Monodevelopは重いので起動に時間がかかるので注意です :)
焦らずいきましょう
![Untitled - CharpTest - PC, Mac & Linux Standalone <OpenGL 4.1> 2016-04-22 13-02-27.jpg](https://qiita-image-store.s3.amazonaws.com/0/67575/7176964f-bf0f-29f4-41fc-d05ed964281a.jpeg)
Monodevelopが起動したら、設定をいじりましょう。
画面上にあるメニューからMonodevelop-Unity/Preferencesを選択し、以下のように設定しましょう。
<img width="765" alt="スクリーンショット 2016-04-25 20.32.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/67575/3b8b863d-63a6-f48f-18ea-f4bbaa477f6f.png">
<img width="761" alt="スクリーンショット 2016-04-25 20.32.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/67575/73841a6c-1661-33b2-b683-c1039d7a0049.png">
<img width="788" alt="スクリーンショット 2016-04-25 20.33.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/67575/42e12088-131b-0046-c569-1ba67cd210bb.png">


Monodevelopの設定が終わったら、MonodevelopからTestスクリプトを見てみましょう。





##4.Unityが自動的に作成するスクリプトのプチ解説
MonodevelopでTestスクリプトを正常に開けましたか？
ここではUnity上でスクリプトを作成した時に自動で生成されたコードをちょっとだけ見ていきます。
MlnodevelopでTestスクリプトを見ると、こんな感じのコードが最初から書いてあるのではないでしょうか？

```
using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour
{
	// Use this for initialization
	void Start ()
	{

	}

	// Update is called once per frame
	void Update ()
	{

	}
}
```

では上からコードを読んでいきます。
###using Hogeについて

```
using UnityEngine;
using System.Collections;
```

この二つは気にしなくてok。
意味を簡単に説明すると、
UnityEngineというグループ(namespaceという)にあるスクリプトをTestスクリプトで使用しますよ。
System.CollectionsというグループにあるにあるスクリプトをTestスクリプトで使用しますよ。
という意味。

### public class Hoge : MonoBehaviour 行について
(ここでかいているHogeというのは適当な文字です。)

```
public class Test : MonoBehaviour
{
略
}
```
ここでTestという文字が出てきました。ここのTestはUnityでスクリプトを作成したときに付けたスクリプト名(=クラス名)になっています。
なので、Hogeというスクリプト名だったら
`public class Hoge : MonoBehaviour` みたいになります。
ようは
`public class スクリプト名 : MonoBehaviour`
という書式になっています。

これで、
**Testというスクリプトは、MonoBehaviourを継承(けいしょう)しているclass(クラス)です**
という意味になります。
MonoBehaviourや継承、classというキーワードが出てきましたがまだ難しいので後で解説します。
ここでは `public class` の次にスクリプト名(クラス名)が来るということを覚えておきましょう。

### void Start() 行について

```
   // Use this for initialization
   void Start ()
    {

    }
```

**// Use this for initialization**
これは//から始まっているので **コメント** になります。コメントなので、コンピュータは、//がある行の//以降を読み込みません。(次の行からは読み込まれます)

これはStartという名前の関数です。
コードを書く時は *関数(かんすう)* というものをたくさん書きます。
(関数の説明は後でしますが、 
**いろんな処理をまとめて、自由に実行できるようにしたもの** 
と覚えておいてください)

Unityは自動的に特殊な関数を作っておいてくれます。それがStart関数です。
このStart関数を簡単にいうと、
**ゲームが開始された時に一度だけ実行される処理を書く**
というUnity側がわざわざ用意してくれている超特別な関数です。
一般的にUnityで開発をする時は、Start関数の **{ }** の中で初期化処理(コインの数を0にしたり、画像を読み込んだり)を記述します。
いまは **{  }** の中に何も書いていないので、ゲームをスタートしても何の処理も実行されないです。
ここでは **Start関数はゲーム開始するときに呼ばれる処理** と覚えておきましょう。

### void Update() 行について

```
        // Update is called once per frame
	void Update ()
	{

	}
```

update関数を簡単にいうと **毎フレーム実行される関数** です。
**フレーム** が何か説明します。
フレームは、ゲームや映像作品の開発時に使われる考え方です。
アニメでは何枚もの絵を書いたあと、高速に絵を切り替えて動画を作っています。
このとき使用されている1枚1枚の絵をフレームと呼びます。
よくあるスマホゲームでは、1秒で30枚くらい絵を更新しています。
なので、絵を更新するタイミングが1秒で30回あり、Unityではこの更新タイミングでUpdate関数が実行されます。
Update関数の中に、キャラクターがちょっとずつ右に動く処理を書けば、キャラが右方向に歩いているようなアニメーションになるわけですね。
今回はUpdate関数を使わない予定なのでざっとこんな感じで説明は終わりです><

詳しくは[こちら](http://unity-yb.github.io/articles/frame_and_update.html)を読んでみてください。


次の章でログを出す処理を書いてみましょう。

##5.Hello WorldをLogに表示させよう
プログラミングを始めたら最初に書くコードはHello Workdです。
習慣的なものですね。
Hello Worldを出すために必要なものは2つあります。
1: 文字や数字を出力する画面
2: 文字や数字を出力するように命令する処理
です。

1:はUnityのConsole Windowがやってくれます。Console Windowに文字や数字等が表示されます。
2:は
`Debug.Log("Hello World");`
というコードを書くことでConsoleにHello Worldという文字列を出力させる命令になります。

###Debug.Logについて
`Debug.Log`はUnity側が定義している関数になります。
`Debug.Log`と書いた後に、`( )`を書いて、このかっこの中に文字列等を入れてあげると、かっこの中に書かれた文字列等がConsoleに表示されます。
Consoleに表示される文字列や数字を**ログ**と言います。

今回は
`Debug.Log("Hello World");`
と書いているので、かっこの中に`"Hello World"`が渡されています。
そのためHello Worldという文字がConsoleに表示されるはずです。
**注意!
文字列を書くときはダブルクォーテーションで囲む必要があります。なので今回はHello Worldではなく、"Hello World"とかっこの中に書いてあります。**

###実際にConsoleにログを出すコードを書いてみる
さて、`Debug.Log("Hello World");`でConsole上にログを表示するのは分かったけど、
Testスクリプトのどこに書けばよいのでしょうか？

いろんな方法で書くことができるのですが、今回は **Start関数** の中に書くことにしましょう。

では、関数のどこに処理をかけばいいか説明していきます。

```
    void Start() 
    {
      ずばりここ
    }
```

`ずばりここ` というところに関数の処理は書いていきます。
具体的にいうと、 **{** から **}** までの間に書きます。
 **{** から **}** までがStart関数の範囲だからです。

実際に書いていきましょう。

```
    void Start() 
    {
       Debug.Log("Hello World");
    }
```

これでゲームを開始したときにConsole画面にログ(今回はHello World)が表示されるようになりました。
書けたら「Command + S」で保存しましょう。

いくつか失敗している書き方を載せますね。間違えないようにしましょう。

```lang:失敗1
    void Start() 
    {
       Debug.Log("Hello World")
    }
```

Debug.Log("略") の最後に **;** セミコロンが無い。
=>セミコロンは忘れずに書く

```lang:失敗2
    void Start() 
    {

    }
       Debug.Log("Hello World");
```

Start関数の外に処理を書いている。
=>Start関数は { から } までです。{  } の中に処理を書きましょう。

```lang:失敗3
    void Start() 
    {
       Debug. Log("Hello World");
    }

```
Debug. Logのドットの隣に余計なスペースが入っています。
Debug.Logのようにつなげて書くようにしましょう。

コードを変更したら「Command + s」で保存するのを忘れずに

###ゲームをスタートさせる方法
Unityに戻ります。
スクリプトに変更があると、Unityの右下にローディングマークが一瞬表示されます。
このローディングマークが表示されている間に、Unityはスクリプトの構文を見て、おかしなところがないかチェックしてくれます。
構文におかしなところがあると、赤文字でエラーが発生します。
エラーがないか確認しましょう。
![Untitled - CharpTest - PC, Mac & Linux Standalone <OpenGL 4.1> 2016-04-22 15-07-04.jpg](https://qiita-image-store.s3.amazonaws.com/0/67575/86d69fb3-57ff-7f0b-6540-62a7e063fea1.jpeg)

エラーはなかったですか？
エラーがあればTestスクリプトを削除してもう一度やり直すのがいいでしょう。

###作ったスクリプトをゲームに取り込む
さて、それでは進んでいきます。
Hierarchyに`Main Camera`があるので、それを選択しましょう。
![Untitled - CharpTest - PC, Mac & Linux Standalone <OpenGL 4.1> 2016-04-22 15-10-38.jpg](https://qiita-image-store.s3.amazonaws.com/0/67575/d26e8dff-fa3a-d59f-478d-e79f30b105b0.jpeg)

選択した状態でInspectorを見てみると、いろんな情報が書いてあります。
![Untitled - CharpTest - PC, Mac & Linux Standalone <OpenGL 4.1> 2016-04-22 15-12-39.jpg](https://qiita-image-store.s3.amazonaws.com/0/67575/8c345c26-3ef0-0672-7678-a86c4a0991e6.jpeg)

Inspectorにある **Add Component** をクリックして
検索バーから先ほど作ったスクリプトの名前 **Test** を入力して、候補にでてきたTestスクリプトをクリックしましょう。
そうすることでゲームにTestスクリプトが取り込まれます。
![Untitled - CharpTest - PC, Mac & Linux Standalone <OpenGL 4.1> 2016-04-22 15-15-14.jpg](https://qiita-image-store.s3.amazonaws.com/0/67575/c1b8abe7-1d8d-0f1c-687f-aa6bf5946684.jpeg)
こうなればOKです。

###ゲームを再生する
最後にゲームを再生します。
ゲームを再生することでStart関数が実行されて、Start関数の中にかいてあるログを出す処理が実行されるので、Console画面にHello Worldが表示されるはずです。

ゲームを再生するのは簡単で、
![Untitled - CharpTest - PC, Mac & Linux Standalone <OpenGL 4.1> 2016-04-22 15-17-35.jpg](https://qiita-image-store.s3.amazonaws.com/0/67575/a44dd259-3fd9-c706-7d5b-a852ca8441de.jpeg)
画面上部にある再生ボタンを押せば、再生されます。

では再生してみましょう。

![Untitled - CharpTest - PC, Mac & Linux Standalone <OpenGL 4.1> 2016-04-22 15-24-38.jpg](https://qiita-image-store.s3.amazonaws.com/0/67575/57a97e8b-d76b-90ca-7795-c47b4a26c122.jpeg)
ConsoleをみるとHello Worldと表示されていますね！
ここまでできればokです :)

`Debug.Log(中身)`の中身をいろいろ変えたりしてみましょう :)

##6.変数とは
```
　変数についてよく使われる表現は「数値や文字列といったデータを入れるための入れ物」というものです。「変数に値を格納する」「代入する」という言い回しからもイメージがしやすいのではないでしょうか。

　さらに、この入れ物にはそれぞれ固有の名前があり、これを「変数名」と言います。変数名でそれぞれの入れ物を区別し、指し示すことができます。変数名は文法に沿った形で開発者が自由に付けることができます。

　なお、データを格納するといってもデータベースなどとは異なり、メモリ上で保持するだけです。プログラムの実行が終わると、変数に格納されたデータは消えてしまうので、長期的に保存したい場合は、データベースやファイルに保存するようなコードを書くことになります。
```
PHPに関する記事ですが、分かりやすいので[こちら](http://www.atmarkit.co.jp/ait/articles/1403/20/news105.html)から引用させていただきました。

要は、
変数とは、
・数字や文字等の値を入れて管理できる箱です。
・箱には名前をつけることができます。
これだけ覚えておきましょう。


##7.型とは(文字列・整数・少数・真偽値・その他について)
変数は箱に情報を入れることで管理できるんでしたね。
あと変数は名前をつけて人間が分かりやすい形で管理できる。

この変数の箱はいろんな種類があります。 **箱の種類によって大きさや入れられる情報が違ったりします。** Unityが予め用意してくれている種類もありますし、コーディングによって自由に新しい種類の箱を作成することもできます。

この箱の種類のことを **型(かた)** と言います。

なぜ型というのものが存在しているのでしょうか？なくても良いじゃないですか。
たしかに型が1種類しかなく、型指定をせずともどのような情報でも入れられるプログラミング言語はあります。PHPやjavaScirptですね。
ただ型がないと間違いに気付きにくいのです。
たとえば 1 + 1 という計算をやるときに、間違って 1 + "あ" をやろうとしたとしましょう。
このとき、数字と文字列の型が分かれている場合は、
 1 + "あ" をやろうとしたときに、すぐに間違いだと気づけます。型が分かれているのでコンピューターは、数字と文字という違いを認識できるのです。
対して、型が分かれていない場合は、
コンピューターは実際に計算してみないと 1 + "あ" のそれぞれの要素が数字なのか文字なのかがわからず、エラーが発生してしまいます。

一見、型があるせいで分かりにくいなと思うかもしれませんが、
実は型があるおかげで分かりやすくコードを書けるので、しっかり理解するようにしましょう。

###型が違うってどういうこと
変数を作成するときは、情報の種類によって適切な型を用意する必要があります。
文字列という情報を扱う変数を作成するときは、文字列の型を使う必要がありますし、
数字をという情報を扱う変数を作成するときは、数字の型を使う必要があります。

ちょっと分かりにくいかもしれないので例え話をしましょう。

```
Aさんはスーパーから食材を買ってきて、帰宅しました。Aさんはキッチンに移動したあと食材をゴミ箱にしまいます。
```

おかしいですよね？買ってきた食材をゴミ箱に入れて保管しないですよね？
食材は、普通は冷蔵庫とかの適切な場所に入れて保管します。

ではこれはどうでしょうか？

```
Aさんは財布にあったレシートをゴミ箱に捨てました。
```

これはおかしくないですね。

このように現実世界でも「ものをしまう場所」というのは「適切な場所」があるわけなんですね。
同じようにプログラミングの世界にも情報の種類によって適切な箱が変わってくるのです。

###型の種類について
型には様々な種類があります。
もともとC#等の言語自体が用意している超基本的な型もありますし、
そもそも型を自由に定義することもできます。
まず最初に前者のC#等の言語自体が用意している超基本的な型というのを見てみましょう。

###C#等の言語自体が用意している超基本的な型
文字、整数値、小数値、真偽値があるのでこれらを見ていきましょう。

|タイプ|型|読み方|解説|
|:--|:--|:--|:--|
|文字|string|すとりんぐ|文字を扱える型です|
|整数値|int|いんと|整数値を扱える型です。小数は扱えないので注意しましょう|
|小数値|float|ふろーと|小数値を扱える型です。|
|真偽値|bool|ぶーる|真偽値(しんぎち)を扱える型です。真偽値とは「正しい(true)」か「正しくない(false)」かだけを表すことができます。|

###変数宣言の仕方
変数というのは箱です。
変数を使うために変数を宣言して箱を作る必要があります。
変数の宣言の方法を学んでいきましょう。

変数の宣言の方法は簡単で、

```
型 変数名;
```

のような記述で宣言することができます。
詳しくいうと、
型 + スペース + 変数名 + セミコロン
になります。特にセミコロンを忘れないように注意しましょう。

いくつか変数を作ってみましょう。

ex:整数値を扱えるhoge変数

```
int hoge;
```

これで「hoge」という名前のint型変数を作ることができました。
他にも、

```
float score;  //scoreという名前のfloat型変数
string userName; //userNameという名前のstring型変数
bool isClear; //isClearという名前のbool型変数

```

という感じで変数の宣言が可能です。

###変数を使おう
変数には二つの使い方があります。
1つめは **変数への代入** です。代入をすることで変数という箱に中身を入れることができます。
2つめは **変数の中身の取得** です。変数という箱に入っている中身を取得することができます。

まず最初に代入を見てみましょう。

###変数に代入する方法

```
int hoge; //変数を宣言
hoge = 10; //変数に10を代入
```

これでint型のhogeという変数に10という数字を代入することができます。
数学と似ていますね。
左辺に変数を置いて、右側に代入する情報を置き、イコールで結びます。
文末にセミコロンを忘れないようにしましょう。

```
string hoge;
hoge = "こんにちは！";
```

変数は、型を同じものしか代入できません。
なので、文字を扱えるstring型に代入できるのは文字だけです。
文字を代入するときには注意が必要です。
プログラミングで文字を扱う場合は、プログラムの構文と区別するために、文字を **ダブルクォーテーション** で囲う必要があります。 
今回も **"こんにちは!"** のようにダブルクォーテーションで囲っていますね。
数字系の変数とは違い、文字は必ずダブルクォーテーションで囲う必要があるので忘れないようにしましょう。

```
float hoge;
hoge = 10.123f;
```

次はfloat型の変数への代入です。float型は数字が扱えるのでint型と似ていますね。
ただし、数字の語尾に **f** を付ける必要があるので注意しましょう。


```
bool hoge;
hoge = true;
hoge = false;
```

bool型は真偽値のみ扱えるので 「true(正しい)」もしくは「false(正しくない)」のみ代入することができます。
注意しましょう。
また、bool型だけ面白い方法で代入することができます。
bool型はtrueかfalseしか値を入れられないので、この性質を利用して、「***ではない」という風に代入することができます。
実際に見ていきましょう。

```
bool hoge;
hoge = !true;
hoge = !false;
```

わかりますでしょうか？trueやfalseの前にビックリマークを置くことで、
**trueだったらfalse** に **falseだったらtrue** に置き換わります。
よく使うので覚えておきましょう。

変数は宣言と同時に代入することもできます。
例えばこんな感じです。

```
int hoge = 10;
```

これでhogeの中に10が代入されます。
よく使うので覚えておきましょう。

###変数の中身を取得する方法
変数の中身を取得するのは簡単です。先ほどの代入と合わせて勉強していきましょう。

```
int hoge1 = 10; //hoge1が作成されて10が代入される。
int hoge2; //hoge2が作成される。
hoge2 = hoge1; //hoge1の中身である10がhoge2にコピーされる。
```

こんな感じで右辺に変数を書いておくだけで自動的に変数の中身が参照されて、左辺に代入されます。

bool型のときはビックリマークをつけることで反転させた状態で中身を取得することができます。

```
bool hoge1 = true;
bool hoge2 = !hoge1; //hoge1にtrueが入っていたので、それが反転したもの(false)がhoge2の中に入る
```


##8.関数とは
関数は一連の処理をまとめたものです。
UnityやC#言語が用意してくれた関数もありますし、
開発者はそれらを組み合わせて自由に関数を定義することができます。
大切案概念として引数(ひきすう)や戻り値(もどりち)が

##9.関数を書いてみよう。
関数は大きく分けで4のパーツを組み合わせたものです。
1: 戻り値の型
2: 関数名
3: 引数名
4: 処理
です。

戻り値って何？引数ってなに？
というのはともかく、書いてみましょう。

注意点として、
関数の中に関数を定義することはできません。classの中でのみ関数を定義することができます。

関数を書くときはこういう風な形で書きます。

```
戻り値の型 関数名 (引数名) 
{
    なんらかの処理
}
```

関数は `{`　から `}`までの間に処理を書いていきます。

実際に書くときはこんな感じです。

```
void Attack() {
    //todo
}
```

この関数はAttackという名前が付いているのでAttack関数と言いましょうか。
Attack関数を見ると、こういう情報がわかります。

```
戻り値なしで、引数もなし。処理は何も書いていなくて、関数名はAttack
```

です。
ポイントとなるのは **void(ゔぉいど)** ですね。これは特別な型で、
**戻り値なし** を表しています。

0(int型)を返すHoge関数を作ってみる

```
int Hoge() 
{
    return 0;
}
```

こういう風にかきます。
戻り値の型のところは、先ほどは戻り値なしだったのでvoidでしたが、今回は数字を返すのでintになっていますね。
そして処理のところに `return 0;` が書いてあります。
このreturn ??? ; で関数を実行したときに戻り値の型で指定した型の情報を呼び出し元に返すことができます。

"こんにちは！"を返すHello関数を作ってみる

```
string Hello()
{
    return "こんにちは!";
}
```

returnで変数を返すこともできます。

```
string Hello()
{
    string aisatu = "こんにちは!";
    return aisatu;
}
```

上の二つはやっていることは同じですね :)

次は引数がある関数を定義してみましょう。
引数とは、関数実行時に渡す情報です。
例えばお使いをしてくれるおつかい関数があったとして、この関数を実行するときはお金を渡す必要があります。このときに渡すお金を引数って読んだりします。

では書いてみましょう。
引数にint型を1つだけ持つOtukai関数を書く

```
void Otukai(int money)
{
}
```

こうなります。引数の部分に `int money` と書いてありますね。
お金は数字なのでint型です。
変数の宣言と同じように `型 引数名` を書けばokです。これで関数実行時にint型のなんらかの値が渡ってきて、money引数に代入されます。

引数はほとんど変数と同じように使えるのでこんな感じに使うこともできます。

```
void Otukai(int money)
{
   Debug.Log(money);
}
```

今回の引数名はmoneyにしましたが、別にこれはただの名前なので「int aaaa」にしても問題ないでが、なるべく分かりやすい引数名をつけましょう。

次に、引数と戻り値を使って、引数に渡された数字をそのまま返すReturnNumber関数を作ってみましょう。

```
int ReturnNumber(int number)
{
    return number;
}
```

こういう風に書けます。


##10.関数を実行しよう
関数の実行は簡単です。
`関数名 + (引数があればここに書く) + ;`
を書くだけで実行されます。

注意点として、
関数は関数の中でのみ実行(呼び出し)することができます。

例えばゲームを再生されたときに呼び出されるStart関数の中でHello関数を実行してみましょう。

```
//コンソールにこんにちは！と表示してくれる関数
void Hello() {
   Debug.Log("こんにちは！);
}


void Start() {
    Hello();
}
```

こんな感じになります。Helloという名前の引数のない関数を実行するので
`Hello();`
で実行することができます。

次に引数のある関数を実行してみましょう。

```
void Hello(string userName){
    //文字列を連結しているので、こんにちはXXXさん とログに表示される。
    Debug.Log("こんにちは" + userName + "さん"); 
}

void Start() {
   Hello("たなか"); //直接かっこの中に引数の型と同じ情報を入れる
   string name = "やまだ";
   Hello(name); //変数を渡すことも可能
}
```

こういう風になります。

戻り値を受け取る関数をやってみましょう。

```
string GetHelloWord() 
{
    string word = "こんばーんわ";
    return word;
}

void Start() {
    string hoge = GetHelloWorld(); //hoge変数に戻り値を代入している
    Debug.Log(hoge); //コンソールにこんばーんわと表示される
}
```

こういう風になります。

最後にこれらを組み合わせて、引数で渡した数字を二倍にして返してくれる関数を実行してみましょう。

```
int Nibai(int aaa){
   int number = a * 2; //プログラミングでは掛け算を * で表します。
   return number;
}

void Start() {
   int result = Nibai(10); //10の二倍の数が帰ってくるのでresult変数に20が入る
   Debug.Log(result);  //コンソール(ログ)に20が表示される
}
```

以上で関数の実行になります。

##11.for文を使おう
for文は繰り返し処理を行うときにつかいます。
割と使うので覚えておきましょう。

```
for(int i=0;i<10;i++){
   //なにかしょり
   Debug.Log("やほー");
}
```

これでConsoelに10回"やほー"と表示されます。
詳しく見ていきましょう。

for文の構文はこうなっています。

```
for(1カウンターの生成 ; 2いつまで繰り返すか ; 3カウンターを動かします){
   //for文が動いているときに実行する処理
}
```
for文は、1と2と3をセミコロンで区切っているだけです。
1のカウンターの生成で繰り返している回数を記録してくれる変数を作成しています。
2でいつまで繰り返すか条件を指定することができます。

```
カウンターが変数iで 条件がi<10なら、iが10以下のときfor文が繰り返し処理される
```

ということになります。

3でカウンターを1プラスします。**i++** がそういう役割ですね。 **++**を書くことで、変数iの中身を1加算してくれます。

for文ではカウンターを参照することで今何回めの処理なのかを把握することができます。

```
for(int i=0;i<10;i++) {
    Debug.Log(i+"回めの処理です。"); //consoleに "X回めの処理です。"と表示される
    //今回は10回繰り返されるので、
    //"0回めの処理です。" 
    //"1回めの処理です。" 
    //"2回めの処理です。" 
    // 略~ 
    //"10回めの処理です。"
    //という感じで10回表示されます。
}

```

##12.if文を使おう
if文は条件分岐と言います。
if文を使えば、
正しければAの処理を
正しくなければBの処理を
みたいな感じで処理を条件分岐させることが可能です。

if文の文法はこういう風になっています。

```
if(bool型の情報){
   // Aの処理
} else {
   // Bの処理
}
```

ifと書いて、次にかっこをつけます。かっこの中にbool型の情報を入れて、
trueだったらAの情報を、falseだったらBの情報を実行することができます。

正しかったらAの処理をやる。正しくなかったら何もしないときのifの使い方
こういう風に書きます。

```
if(true){
  Debug.Log("ただしいよ");
}
```

`if(true) `なので必ずコンソールに"ただしいよ"と表示されます。
このようにelse以降は省略することができます。

```
if(false){
  Debug.Log("ただしいよ");
}
```

この場合は、`if(false)`となっているので`Debug.Log("ただしいよ");`という処理がまるごとスキップされます。なのでこのif文を実行されても何も起きません。

正しくなかったらBを実行するif文の使い方

```
if(false) {
  //A
} else {
  //B
  Debug.Log("Bだよ");
}
```

if(false)だとAの処理はスキップされるので、else以下のBの処理が実行されます。

if文はチェーンのようにつなげて書くことができます。else句は1つしか書けないので注意してください。

```
if(true) {
    //Aの処理
} else if(true) {
    //Bの処理
} else {
    //Cの処理
}
```

のような感じです。この場合、一番最初でif(true)になっているのでAの処理だけが実行されます。それ以降の処理は実行されません。

```
if(false) {
    //Aの処理
} else if(true) {
    //Bの処理
} else {
    //Cの処理
}
```

この場合はBの処理だけが実行されます。


```
if(false) {
    //Aの処理
} else if(false) {
    //Bの処理
} else {
    //Cの処理
}
```

この場合はCの処理だけが実行されます。

if文は変数と組み合わせて使用していきます。

```
bool isClear = true;

if(isClear) {
   Debug.Log("クリアしました！");
} else {
   Debug.Log("クリアしていない！");
}
```

こんな感じです！

##最後に
ここまでやればプログラミングの入り口に立てたのではないでしょうか？
プログラミングの勉強引き続き頑張って下さい!