C#&Unityの演習問題：しまづ君にプログラミングを教えよう！パート3【スタジオしまづアカデミア】

（ベータ版：いいねと思ったらtwitterに投稿してもらえると嬉しいです＾＾）
（おすすめの問題があれば、編集リクエストで追加していただけると助かります）

前回：https://qiita.com/simanezumi1989/items/ff9ef19f4ea7850cd17c

#これはあなた自身の物語です
ときは戦国、、、
ゲーム開発をするためにプログラミングを学び始めたしまづ君（永遠の3才）。
ところが彼はまだまだプログラミングのことがわかっていません。
のちに世界を救うこととなる「スタジオしまづ」設立のために彼にプログラミングを教えましょう！

演習問題を行う前の準備：[困った人向け](https://youtu.be/XquKGX3RB8I)


スタジオしまづの[YouTube](https://www.youtube.com/channel/UCDunz_CPkqkQT5ljKXcYkhg?view_as=subscriber)
スタジオしまづの[学習サイト](https://d35e.uscreen.io/)


##演習問題：関数の作成方法がわかっている？
しまづくん：とりあえずビール！じゃなくて関数ってものを2作ろうとしたんだけどうまくいかないんだ！どうすればいいかな？

参考動画：[イラスト解説 関数（メソッド）](https://youtu.be/9xXYZbkGpHw)
しまづ君のコード

```Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
 
    void Start()
    {
    }

    FirstFunc1
    {

    }

    FirstFunc2()
    {

    }
}
```

---解答ルパン---

```Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
 
    void Start()
    {
    }

    void FirstFunc1()
    {

    }

    void FirstFunc2()
    {

    }
}
```
しまづ君：ありがとう！関数の作成方法がわかったよ＾＾


##演習問題：関数の実行
しまづくん：関数を作ったけど、何も表示されないんだ。。。どうすれば実行されるの？
しまづ君のコード

```Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
 
    void Start()
    {
    }

    void Sample()
    {
        Debug.Log("スタジオしまづのオンラインサロンとは？");
    }
}

```

---解答ルパン---

```Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
 
    void Start()
    {
        Sample();
    }

    void Sample()
    {
        Debug.Log("スタジオしまづのオンラインサロンとは？");
    }
}
```
しまづ君：ありがとう！関数は作るだけじゃダメで実行しないといけないんだね。

でもでも、、、Start関数は実行されてるじゃないか？
解答ルパン：Start関数はUnityが用意してくれている"イベント関数"というもので特定のタイミングで実行される関数なんだよ。他にもイベント関数はたくさんあって、開発者は"いつ"関数を実行したいかによってどのイベント関数で実行すればいいか決めるんだ＾＾
・参考動画：[イベント関数について](https://youtu.be/Kjhv6jLbjiw)

##演習問題：変数のスコープ（範囲）
しまづくん：xとyの足算をログに出す関数を作ろうとしたんだけど、エラーが出ちゃったよ。何がおかしいのかな？
しまづ君のコード

```Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    void Start()
    {
        int x = 10;
        int y = 2;
        Sample();
    }

    void Sample()
    {
        Debug.Log(x+y);
    }
}
```

---解答ルパン---

```Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    int x = 10;
    int y = 2;

    void Start()
    {
        Sample();
    }

    void Sample()
    {
        Debug.Log(x+y);
    }
}
```
しまづ君：ありがとう！"関数が指定する変数において、別の関数で使われている変数は使えないこと"がわかったよ＾＾（誰か編集リクエストからわかったことを書いてください）

##演習問題：引数あり関数
しまづくん：x,y,zのそれぞれの足算をログに出す関数を作ったんだけど、毎回毎回関数を作るのって大変だね。引数を使えば3つの関数を1つの関数にできるって聞いたんだけどどうやってするの？教えて教えて！！

参考動画：[イラスト解説 関数の返り値](https://youtu.be/dY55zcbvVEs)
しまづ君のコード

```Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    int x = 10;
    int y = 2;
    int z = -3;

    void Start()
    {
        Sample1();
        Sample2();
        Sample3();
    }

    void Sample1()
    {
        Debug.Log(x + y);
    }
    void Sample2()
    {
        Debug.Log(y + z);
    }
    void Sample3()
    {
        Debug.Log(z + x);
    }
}
```

---解答ルパン---

```Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    int x = 10;
    int y = 2;
    int z = -3;

    void Start()
    {
        Sample(x,y);
        Sample(y,z);
        Sample(z,x);
    }

    void Sample(int a, int b)
    {
        Debug.Log(a+b);
    }
}
```
しまづ君：ありがとう！がわかったよ＾＾（誰か編集リクエストからわかったことを書いてください）

##演習問題：引数あり関数のゲームでの応用イメージ
しまづくん：if文と関数ってよく使うって聞いたんだ。だから
x=0,y>0 => 上
x=0,y<0 => 下
x>0,y=0 => 右
x<0,y=0 => 左
x=0,y=0 => 停止
それ以外 => その他
って表示する関数を作ってみたいんだけど、後どうすればいい？

しまづ君のコード

```Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    void Start()
    {
        Move(0, 19);  // 上
        Move(0, -1);  // 下
        Move(20, 0);  // 右
        Move(-20, 0); // 左
        Move(0, 0);   // 停止
        Move(-1, -1);   // その他
    }

    void Move(int x, int y)
    {
        if (x == 0 && y > 0)
        {
            Debug.Log("上");
        }
        Debug.Log("停止");
    }
}


```

---解答ルパン---

```Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    void Start()
    {
        Move(0, 19);  // 上
        Move(0, -1);  // 下
        Move(20, 0);  // 右
        Move(-20, 0); // 左
        Move(0, 0);   // 停止
        Move(-1, -1);   // その他
    }

    void Move(int x, int y)
    {
        if (x == 0 && y > 0)
        {
            Debug.Log("上");
        }
        else if (x == 0 && y < 0)
        {
            Debug.Log("下");
        }
        else if (x > 0 && y == 0)
        {
            Debug.Log("右");
        }
        else if (x < 0 && y == 0)
        {
            Debug.Log("左");
        }
        else if (x == 0 && y == 0)
        {
            Debug.Log("停止");
        }
        else
        {
            Debug.Log("その他");
        }
    }
}


```
しまづ君：ありがとう！実際のゲームではこんな感じで使うんだね＾＾

##演習問題：返り値あり関数
しまづくん：「しまづは100をうけました。」,「しまづは20をうけました。」の後に合計でいくらダメージを受けたのか表示したいんだ！関数の返り値ってのを使ってうまくできないかな？
しまづ君のコード

```Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    
    void Start()
    {
        int sum = 0;
        Damage("しまづ", 100);
        Damage("しまづ", 20);

        // sum = 100+20; //100とか20が変わるたびに修正しないといけないのでミスが起こりやすい
        Debug.Log("合計のダメージは" + sum+"です") ;
    }

    void Damage(string target, int damage)
    {
        Debug.Log(target+"は"+damage+"をうけました。");
    }
}

```

---解答ルパン---

```Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    
    void Start()
    {
        int sum = 0;
        sum += Damage("しまづ", 100);
        sum += Damage("しまづ", 20);

        // sum = 100+20; //100とか20が変わるたびに修正しないといけないのでミスが起こりやすい
        Debug.Log("合計のダメージは" + sum+"です") ;
    }

    int Damage(string target, int damage)
    {
        Debug.Log(target+"は"+damage+"をうけました。");
        return damage;
    }
}
```
しまづ君：ありがとう！がわかったよ＾＾（誰か編集リクエストからわかったことを書いてください）

##演習問題：引数あり関数と配列
しまづくん：配列の中身を確認するとき、毎回for文を書くのが面倒なんだ、、、配列の中身を表示する関数って作れない？
しまづ君のコード

```Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    int[] numbers1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    int[] numbers2 = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };

    void Start()
    {
        for (int i = 0; i < numbers1.Length; i++)
        {
            Debug.Log(numbers1[i]);
        }
        for (int i = 0; i < numbers2.Length; i++)
        {
            Debug.Log(numbers2[i]);
        }
    }

    void ShowArrayValueLog()
    {

    }
}


```

---解答ルパン---

```Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    int[] numbers1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    int[] numbers2 = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };

    void Start()
    {
        ShowArrayValueLog(numbers1);
        ShowArrayValueLog(numbers2);
    }

    void ShowArrayValueLog(int[] numbers)
    {
        for (int i = 0; i < numbers.Length; i++)
        {
            Debug.Log(numbers[i]);
        }

    }
}
```
しまづ君：ありがとう！がわかったよ＾＾（誰か編集リクエストからわかったことを書いてください）

##演習問題：平均の計算
しまづくん：２つの配列の平均を出そうと思ったんだ。関数をどう作ったらいいのかわからなくて。。。教えて教えて＾＾
しまづ君のコード

```Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    int[] numbers1 = { 2, 4, 6};
    int[] numbers2 = { 1, 2, 3};

    void Start()
    {
        Debug.Log(Mean(numbers1));
        Debug.Log(Mean(numbers2));
    }

    int Mean(int[] numbers)
    {
        int sum = 0;
        int count = numbers.Length;

        return sum / count; // 合計/個数
    }
}
```

---解答ルパン---

```Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    int[] numbers1 = { 2, 4, 6};
    int[] numbers2 = { 1, 2, 3};

    void Start()
    {
        Debug.Log(Mean(numbers1));
        Debug.Log(Mean(numbers2));
    }

    int Mean(int[] numbers)
    {
        int sum = 0;
        int count = numbers.Length;
        for (int i=0; i<count;i++)
        {
            sum += numbers[i];
        }
        return sum / count; // 合計/個数
    }
}
```
しまづ君：ありがとう！がわかったよ＾＾（誰か編集リクエストからわかったことを書いてください）

##演習問題：intとfloatの計算
しまづくん：「1, 1, 2, 2」の平均って1.5だよね？でもさっき作ったコードでは1って出るんだ、、、何がおかしい？
しまづ君のコード

```Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    int[] numbers = { 1, 1, 2, 2 };

    void Start()
    {
        Debug.Log(Mean(numbers));
    }

    int Mean(int[] numbers)
    {
        int sum = 0;
        int count = numbers.Length;
        for (int i=0; i<count;i++)
        {
            sum += numbers[i];
        }
        return sum / count; // 合計/個数
    }
}


```

---解答ルパン---

```Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    int[] numbers = { 1, 1, 2, 2 };

    void Start()
    {
        Debug.Log(Mean(numbers));
    }

    float Mean(int[] numbers)
    {
        float sum = 0;
        int count = numbers.Length;
        for (int i=0; i<count;i++)
        {
            sum += numbers[i];
        }
        return sum / count; // 合計/個数
    }
}


```
しまづ君：ありがとう！がわかったよ＾＾（誰か編集リクエストからわかったことを書いてください）


##つづき
- [こちら](https://qiita.com/simanezumi1989/items/6dbae3a8739b9c1546f2)：いいねと思ったらtwitterでシェアお願いします＾＾
- スタジオしまづの[YouTube](https://www.youtube.com/channel/UCDunz_CPkqkQT5ljKXcYkhg?view_as=subscriber)：チャンネル登録お願いします！
- スタジオしまづの[学習サイト](https://d35e.uscreen.io/)：特典：Udemyを含む動画教材見放題+オンラインサロンの加入