Unityの冒険01始まり -基礎編-

Unity面白いなぁと思って記事を書き始めました。
記事の内容としては、初心者向けです。Unityでコードを自力で書けるようになってくれたら嬉しいです。

この記事は更新を含めた想定をしています:)
(図解やGIF画像で説明を入れる予定です)

もしこの記事が良かったら、いいね！すると元気が出るので、よろしくお願いします!

## 1. ゲームオブジェクト名をコンソールに出力してみよう
まずはコンソールウィンドウに、ゲームオブジェクトの名前を出力してみましょう。
```try1.cs
void Start()
{
    //ログ関数を使う場合
    Debug.Log(gameObject.name); 
    Debug.Log(this.gameObject.name);
    
    //print関数を使う場合
    print(gameObject.name);
    print(this.gameObject.name);
}
```
大きく２つ方法があり、どちらを使っても大丈夫です。どこまで正確に処理できているか、変数名には何が入っているのかを確認するのに便利です。「this」を使う場合もありますが、これ以降はなるべく「this」を省略した形で行っていこうと思います。

## 2. 表示・非表示してみよう
再生ボタンを押したら、ゲームオブジェクトを表示から非表示にしてみましょう。

```try2.cs
void Start()
{
    //非表示にする
    gameObject.SetActive(false);
    
    //表示する
    gameObject.SetActive(true);
}

```
インスペクターウィンドウにゲーム名の左横にチェックボックスがあると思います。これの切り替えをすることで、ゲームオブジェクトを表示したり、非表示にしたりすることができます。今回はゲームオブジェクトの表示・非表示を行いましたが、その他のコンポーネントにも適用できますので、チャレンジしてみてください。

## 3. ゲームオブジェクト名を３回コンソールに出力してみよう
さて、ゲームオブジェクトを３回コンソールに呼び出してみましょう。
```try3.cs
void Start()
{
    //3回呼び出す
    print(gameObject.name);
    print(gameObject.name);
    print(gameObject.name);
}
```
このように複数回呼び出すことができます。このままだと、回数が多くなるとコードを書くのが大変になってきます。プログラムは同じ処理は一回にまとめると楽になる。

## 4. 繰り返し文を用いて、10回コンソールに出力してみよう
新しい魔法を教えよう。それが、繰り返し文だ。
```try4.cs
void Start()
{
    for(int i = 0; i < 10; i++)
    {
        print(i);
    }
}
```

少し複雑に見えるかもしれませんが、print関数は一回だけ書けばOKになりました。あとは、for文で何回まで繰り返すかを指示します。

```try4-2.cs
void Start()
{
    for(int i = 0; i < 10; i ++)
    {
        print(gameObject.name);
    }
}
```
このようにゲームオブジェクト名を呼び出すこともできる。

## 5. 再生ボタンを押した２秒後にコンソールに出力してみよう
ゲームオブジェクト名を再生ボタンを押した2秒後にコンソールへ出力してみましょう。
```try5.cs
void Start()
{
    Invoke("TestPrint", 2);
}

void TestPrint()
{
    print(gameObject.name);
}
```
Invoke関数を使っていきます。また、Invoke関数の第一引数には関数名を入れます。そこで、新たにTestPrint関数を書きます。

## 6. 変名を宣言し、コンソールに出力してみよう
スクリプト内にて、変数を使ってみよう。
```try6.cs
public class TryCode:MonoBehaviour
{
    //変数を宣言する
    string player;

    void Start()
    {
        //変数にデータを入れる
        player = "warrior";

        //変数をコンソールウィンドウに出力してみる
        print(player);
    }
}
```
変数名の前に「string」とついてますね。これは文字列のデータを取り扱いますよ、という識別するためにつけます。
「string」の他に、「int」「double」「bool」などもあります。

## 7. 配列を宣言し、コンソールに出力してみよう
変数を扱ったところで、次に配列を使ってみよう。
```try7-1.cs
public class TryCode:MonoBehaviour
{
    //配列を宣言する
    string[] player;

    void Start()
    {
        //配列の中にデータを格納する
        player = string[]{"Warrior", "shooter", "wizard"};

        //配列からデータを取り出して、コンソールに出力してみる
        print(player[0]);
        print(player[1]);
        print(player[2]);
    }
}
```
一見難しそうなコードに見えますが、配列の基礎をここで学んでみてください。ここで配列を一個一個取り出すのに、print関数を配列の要素数書いています。配列の要素が多くなると、このコードはあまり良い書き方とは言えません。

配列の要素数だけ、繰り返すという処理をやってみましょう。
```tyr7-2.cs
public class TryCode:MonoBehaviour
{
    //配列を宣言する
    string[] player;

    void Start()
    {
        //配列の中にデータを格納する
        player = string[]{"Warrior", "shooter", "wizard"};

        //繰り返し文を用いて、配列の要素数だけコンソールに出力してみる
        for(int i = 0; i < player.Length; i++)
        {
            print(player[i]);
        }
    }
}
```
少し頭を使うかもしれません。でも配列に格納するデータが何個であっても、全ての要素を取り出すことができるので覚えて損しません。

## 8. 条件文を作って、コンソールに出力してみよう
続いて、条件文です。算数・数学であれば場合分けに当たります。「もしーーなら、こうしてね」という考え方が大切になってきます。７で行ったコードをさらに利用したいと思います。
```try8.cs
public class TryCode:MonoBehaviour
{
    //配列を宣言する
    string[] player;

    void Start()
    {
        //配列の中にデータを格納する
        player = string[]{"Warrior", "shooter", "wizard"};

        //繰り返し文を用いて、配列の要素数だけコンソールに出力してみる
        for(int i = 0; i < player.Length; i++)
        {
            //もし配列の中に、shooterという文字列があったら、次を実行してね
            if(player[i] == "shooter")
            {
                //shooterというデータを、コンソールへ出力する
                print(player[i]);
            }
        }
    }
}
```
だんだんプログラムが長くなってきましたが、「if」の部分を追加しただけです。

## 9.ランダムな数字を振り分けて、コンソールに出力してみよう
ここから少し面白くなってきます。
```try9-1.cs
void Start()
{
    //1から6までの範囲のランダムな数を作って、変数に代入する
    int random = Random.Range(1, 7);
    
    //変数をコンソールへ出力してみる
    print(random);
}
```
これでランダムな数を扱えるようになりました。でもこのままではあまり使えません。そこで配列の中からランダムに取り出せるようなプログラムを作ってみましょう。

```try9-2.cs
public class TryCode:MonoBehaviour
{
    //配列を宣言する
    string[] player;

    void Start()
    {
        //配列の中にデータを格納する
        player = string[]{"Warrior", "shooter", "wizard"};

        //配列の要素数までのランダムな数を作る
        int random = Random.Range(0, player.Length);

        //random変数とplayer配列を組み合わせて、コンソールへ出力する
        print(player[random]);
    }
}
```
これで配列の中からランダムにデータを取り出せます。このように組み合わせることで、ランダムの力を発揮できるようになるわけです。

## 10. 自分で関数を作って、コンソールに出力してみよう
関数ですが、すでに作ったものもあります。改めて関数の理解を深めてみましょう。
```try10.cs
public class TryCode:MonoBehaviour
{
    //Start関数
    void Start()
    {
        //Unityで再生ボタンを押すときに呼ばれる
    }

    //Update関数
    void Update()
    {
        //常に呼ばれる
    }
}
```
ここではUnityでスクリプトを作成する際に、自動で備わっている関数です。Start関数はUnityの再生ボタンを押された時一回だけ呼ばれます。Update関数はStart関数が呼ばれた次の瞬間に毎度呼ばれるようになります。

```try10-2.cs
public class TryCode:MonoBehaviour
{
    //Start関数
    void Start()
    {
        //自分で作った関数を呼び出す
        PlayerAttack();
    }

    //Update関数
    void Update()
    {
        
    }

    //戻り値なし、引数なしの関数を作成する
    void PlayerAttack()
    {
        //consoleへメッセージを出力する
        print("Playerの攻撃！");
    }
}
```
まずは戻り値なし、引数なしの関数を作ってみましょう。voidは戻り値なし、という意味です。
これだけで、自分で何かまとめたい処理を関数にして作成することができるんです。

```try10-3.cs
public class TryCode:MonoBehaviour
{
    void Start()
    {
        //自分で作った関数で「引数」を指定して呼び出す
        PlayerAttack(10);
    }

    void Update()
    {
        
    }

    //戻り値なし、引数ありの関数を作成する
    void PlayerAttack(int power)
    {
        //consoleへメッセージを出力する
        print("Playerは" + power + "のダメージを与えた！");
    }
}
```
ここでは、戻り値なし引数ありの関数を作ってみました。先ほどの関数にint型でpowerという引数名を付け加えました。この引数ありの関数を呼び出すときには、カッコの中にint型の数値を入れる必要があります。入れないとエラーとなってしまうので注意しましょう。

```try10-4.cs
public class TryCode:MonoBehaviour
{
    void Start()
    {
        //自分で作った関数を指定して呼び出す
        print(PlayerAttack());
    }

    void Update()
    {
        
    }

    //戻り値あり、引数なしの関数を作成する
    strig PlayerAttack()
    {
        //文字列を返す
        return "Playerは攻撃した！";
    }
}
```
今度は戻り値あり、引数なしの関数を試してみましょう。voidではなく、文字列を返す関数にしたいのでstring型を関数名の前に付けます。関数の中には、return文で何のデータを返したいのかを書きます。作った関数を呼び出したい時は、関数名を書けばOKです。

```try10-5.cs
public class TryCode:MonoBehaviour
{
    void Start()
    {
        //自分で作った関数で「引数」を指定して呼び出す
        print(PlayerAttack("スライム"));
    }

    void Update()
    {
        
    }

    //戻り値あり、引数ありの関数を作成する
    strig PlayerAttack(string enemy)
    {
        //引数名を加えながら、文字列を返す
        return "Playerは" + enemy + "を攻撃した！";
    }
}
```
最後に戻り値あり、引数ありの関数を作りましょう。「プレイヤーがスライムを攻撃する」場面を想像して、string型の関数名でstring型の引数名を想定します。このように作ってあげると、PlayerAttack関数の引数名を「スライム」「ゴーレム」のように引数を変えるだけで済むので、便利な機能になります。


< 練習してみよう >
プレイヤーが既に持っている所持金が100円とし、道ばだで10円を見つけて所持金とする設定にしてみます。
```try10-6.cs
public class TryCode:MonoBehaviour
{
    void Start()
    {
        //自分で作った関数で「引数」を指定して呼び出す
        print(PlayerMoney(100, 10));
    }

    void Update()
    {
        
    }

    //戻り値あり、引数ありの関数を作成する
    int PlayerMoney(int haveMoney, int getMoney)
    {
        //引数名を加えながら、文字列を返す
        return haveMoney + getMoney;
    }
}
```


## 11. ゲームオブジェクトをスクリプトで動かしてみよう
ここからゲームの実践に近い形になります。
```try11.cs
public class TryCode:MonoBehaviour
{
    void Start()
    {
        
    }

    void Update()
    {
        //TransformコンポーネントのX軸の数値をTime.deltaTime分移動する
        transform.Translate(Time.deltaTime, 0, 0);
    }
}
```
Time.deltaTimeを使って移動することができます。また直接数値を入力することも可能です。
```try11-2.cs
void Update()
{
    transform.Translate(0.02f, 0, 0);
}
```
このように浮動小数点型で数値を入れ、ゲームオブジェクトを移動させることができます。

## 12. ゲームオブジェクトをスクリプトで回転させてみよう
移動したあとは、回転もやってみましょう。
```try12.cs
void Update()
{
    //Y軸座標に対して回転してね
    transform.Rotate(0, 0.02f, 0);
}
```
Rotate関数には引数にそれぞれ X軸座標・Y軸座標・Z軸座標に値を指定することができます。