初心者向け UnityでC#の基礎を1から簡単に習得する方法

# C#を学びたい！
Unityは触れるけどC#がいまいちよく分からない。
てっとり早くC#の基礎を学びたいそんな方におすすめの方法を紹介します。

### 動画で学ぶとめっちゃ楽！！
[ドットインストール - 3分動画でマスターできるプログラミング学習サービス](https://dotinstall.com/)
老舗の動画で学べる学習サイトです。
おすすめするポイントはとにかく喋るのが早い！
「えー」とか「あー」とか余談とか余計な事を一切言わないので先生に学んでいるような「わかったから、もう先に進んでくれ。。。」という感情をまったく抱きません。
(先生ごめん！)

### ただ注意点も
**C#入門 #6から有料になってった。。。。**
準備中気づいたのですが#6以降が有料になってました > <
なので#4、#5で勉強してみて自分にあってれば[プレミアム会員(1080円/月)](https://dotinstall.com/premium)に登録してください。
無料時代に全編見た僕の感想は「これ無料でいいの？？マジか！神か！」と思ったので有料でも損は無い内容です。

# ドットインストールで学べる内容
[C# 入門 (全36回)](https://dotinstall.com/lessons/basic_csharp)
\#01〜03はUnityで学ぶ上で必要が無いので割愛します。

**#04 変数を使ってみよう (02:47) 無料公開中**
変数、定数
型推論
**#05 変数の型を見ていこう (02:34) 無料公開中**
基本的なデータ型
**#06 データの演算をしてみよう (02:51)**
データの演算
**#07 文字列を扱ってみよう (03:00)**
文字列の連結
特殊文字
変数の展開
式の評価
書式指定
**#08 ifで条件分岐をしてみよう (02:57)**
条件分岐
比較演算子
**#09 switchで条件分岐をしてみよう (02:25)**
switch
**#10 whileでループ処理をしてみよう (02:39)**
while
do ... while
**#11 forで繰り返し処理をしてみよう (02:33)**
for
break
continue
**#12 配列で複数のデータを扱おう (02:51)**
配列
要素へのアクセス
**#13 foreachを使ってみよう (02:05)**
Length
foreach
**#14 メソッドで処理をまとめてみよう (02:28)**
メソッド
返り値
**#15 引数を使えるようになろう (02:36)**
引数
初期値
名前付き引数
**#16 クラスを使ってみよう (02:51)**
クラス
フィールド、メソッド
インスタンス
**#17 コンストラクタを使ってみよう (02:59)**
コンストラクタ
オーバーロード
**#18 クラスを継承してみよう (03:01)**
継承
オーバーライド
**#19 アクセス修飾子を理解しよう (02:35)**
アクセス修飾子
**#20 プロパティを使ってみよう (02:58)**
プロパティ
アクセスのコントロール
**#21 インデクサを使ってみよう (02:29)**
インデクサ
要素へのアクセス
**#22 static修飾子を使ってみよう (02:42)**
static修飾子
**#23 抽象クラスを使ってみよう (02:46)**
抽象クラス
抽象メソッド
**#24 インターフェースを使ってみよう (02:15)**
インターフェースの作成
インターフェースの実装
**#25 ジェネリックで型を汎用化してみよう (02:53)**
ジェネリックを利用しない例
ジェネリックを利用した例
**#26 名前空間を使ってみよう (02:27)**
名前空間
using
**#27 構造体を使ってみよう (02:18)**
構造体
クラスとの違い
**#28 列挙体を使ってみよう (02:46)**
列挙体
定数へのアクセス
数値への変換
**#29 例外を扱ってみよう (02:39)**
例外の捉え方
例外クラスの作り方
**#30 delegateを使ってみよう (02:37)**
delegate型の宣言
delegateの利用
マルチキャスト
**#31 匿名メソッド､ラムダ式を使おう (01:55)**
匿名メソッド
ラムダ式
**#32 eventを使ってみよう (02:49)**
event
動作確認
**#33 Listでデータ管理してみよう (02:40)**
Listの宣言、初期化
Count
要素へのアクセス
**#34 HashSetを扱ってみよう (02:20)**
HashSetの宣言、初期化
HashSetの扱い
**#35 Dictionaryを使えるようになろう (02:49)**
Dictionaryの宣言、初期化
Disctionaryの扱い
**#36 LINQを使ってみよう (02:41)**
SQLのようなLINQへのアクセス
メソッドのようなLINQへのアクセス
# 学習の準備
**ドットインストールに会員登録する**
動画を観るには必ず会員登録する必要があります。
登録したからといってプレミアム会員に入らないといけないわけではないので安心してください。
https://dotinstall.com/signup

**Unityのプロジェクトを作る**
適当なUnityのプロジェクトを作成してください。2Dでも3Dでもどっちでも良いです。

# スクリプトを準備

Unityプロジェクトを開いて、Window > General > Test Runnerを開きます。
2017以前のバージョンをお使いの場合はWindow > Test Runner
<img width="456" alt="スクリーンショット 2020-06-28 18.06.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389614/3992e41c-676b-eed6-24ae-703c21f55cef.png">

開いたTest Runnerのウィンドウを見やすいように配置します。
<img width="733" alt="スクリーンショット 2020-06-28 18.26.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389614/ff13eb1c-a035-c40c-dbf9-ad0dda978a52.png">

EditorModeの状態で「Create EditMode Test Assembly Folder」をクリック
するとフォルダ名がリネームできる状態になるのでリネームせずフォルダをクリックします
<img width="705" alt="スクリーンショット 2020-06-28 18.28.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389614/c32950a2-abfc-a084-7408-a298565d6581.png">

フォルダをクリックするとTest Runnerのボタン名が変わって「Create Test Script in current folder」になります。
<img width="723" alt="スクリーンショット 2020-06-28 18.27.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389614/0f7ec07c-3be8-5c6f-a57a-1a809bab0856.png">

更にボタンをクリックすると新しく生成されたスクリプトがリネームできる状態になるのでLessonという名前に修正します。
<img width="724" alt="スクリーンショット 2020-06-28 18.29.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389614/62acf8de-a848-a80c-4e14-bfcb325033ba.png">

Lessonのドロップダウンを開いてLessonSimplePassesの上で右クリック > 「Open source code」でコードを開きます。
<img width="413" alt="スクリーンショット 2020-06-28 18.29.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389614/bd6c332f-f70a-8b92-6e7a-9d549dfc3999.png">

下記のようなコードが生成されました。

```C#
using System.Collections;
using System.Collections.Generic;
using NUnit.Framework;
using UnityEngine;
using UnityEngine.TestTools;

namespace Tests
{
    public class Lesson
    {
        // A Test behaves as an ordinary method
        [Test]
        public void LessonSimplePasses()
        {
            // Use the Assert class to test conditions
        }

        // A UnityTest behaves like a coroutine in Play Mode. In Edit Mode you can use
        // yield return null; to skip a frame.
        [UnityTest]
        public IEnumerator LessonWithEnumeratorPasses()
        {
            // Use the Assert class to test conditions.
            // Use yield to skip a frame.
            yield return null;
        }
    }
}
```

コードを下記のように修正します。

```C#
using NUnit.Framework;
using UnityEngine;

namespace Tests
{
    public class Lesson
    {
        [Test]
        public void Lesson04()
        {
          // ここにコードを記述していく
        }
    }
}
```

# 学習の進め方
ブラウザでドットインストールの[C#入門 #04変数を使ってみよう](https://dotinstall.com/lessons/basic_csharp)を開きます。

冒頭の「`Console.WriteLine("Hello World")`」をTest Runnerで表示する流れをやってみます。
<img width="1177" alt="スクリーンショット 2020-06-28 18.34.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389614/84f5d1ab-a20d-2fd6-c10d-0c721b6aec92.png">

スクリプトを下記のように修正します。
`Console.WriteLine`は`Debug.Log`に読み替えてください。

```C#
using NUnit.Framework;
using UnityEngine;

namespace Tests
{
    public class Lesson
    {
        [Test]
        public void Lesson04()
        {
            // Console.WriteLineは読み替える
            Debug.Log("Hello World");
        }

        // #05用に予め用意
        [Test]
        public void Lesson05()
        {
           
        }
    }
}
```

Test Runnerを見ると下記のように表示が変化しています。
<img width="354" alt="スクリーンショット 2020-06-28 18.32.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389614/32314e35-b58e-69b2-9f24-3faef6912c49.png">

「Lesson04」をクリックします。
Test RunnerのログとConsoleに「Hello World」が表示されれば成功です。
<img width="796" alt="スクリーンショット 2020-06-28 18.32.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389614/60ee69f2-a6b3-4e03-1f84-b6fa31141820.png">

この要領でスクリプトを修正したらTest Runner上でクリック。終わったらLesson05を増やしてというのが学習の流れです。

# Test Runnerについて
今回使用した[Test Runner](https://docs.unity3d.com/ja/2018.4/Manual/testing-editortestsrunner.html)はUnityを実行しなくてもコードをテストできるめちゃくちゃ便利なツールです。
いつか使うかもしれないので頭の片隅に置いといてください。

# C#を勉強したその後は
最近Unityが提供するチュートリアル[Unity Learn Premium](https://unity.com/ja/products/learn-premium)が無料になったってご存知ですか？
Unityのすべての機能を本家が解説しているので本で勉強するよりおすすめだと思います。
是非覗いてみてください。

▼ 日本語対応のチュートリアル一覧
[https://learn.unity.com/tutorials/?k=%5B%22lang%3Aja%22%5D&ob=starts](https://learn.unity.com/tutorials/?k=%5B%22lang%3Aja%22%5D&ob=starts)