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

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

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

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

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


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

##補足：クラスについて
クラスとは
・変数と関数を合わせたもの

ゲーム内に再現したいものがあるとき、下のように、変数と関数の組み合わせを考えれば実現できる
<img width="461" alt="スクリーンショット 2020-03-04 15.49.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67439/81611dbf-194f-d158-4756-1d18b82ede35.png">
（理想的なクラスを作るには、どのクラスにどんな機能/管理/責任を持たせるかが重要となる。 人に太陽の動きを管理させるのはおかしいように）
・クラスの生成に関して、Unityの場合は通常のC#と生成方法が違います。今回はUnity版のクラス生成で行います。


##演習問題：他クラスの関数（メソッド）の利用
しまづくん：Playerクラスってのを作ってみたんだけど、どうやったらAttack関数をQuestionで使えるの？UnityエディタでQuestionには持ってきたんだけど、、、

しまづ君のコード

```Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    public Player player;

    void Start()
    {
        //ここでPlayerのAttack関数を実行したい
    }
}
```

```Player.cs
using UnityEngine;

public class Player : MonoBehaviour
{
    int hp;

    void Attack()
    {
        Debug.Log("攻撃");
    }
}
```

しまづ君のプロジェクト
<img width="337" alt="スクリーンショット 2020-03-04 18.32.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67439/77bbc07e-6de5-8a74-4572-d661072b5246.png">

<img width="430" alt="スクリーンショット 2020-03-04 18.33.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67439/3a52bf2a-5395-89ea-3f20-39cbbfca46a4.png">

<img width="435" alt="スクリーンショット 2020-03-04 18.33.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67439/95ce085d-e265-0aef-49ed-49f98a86b161.png">

パッケージから環境を設定したい方：[こちら](https://drive.google.com/open?id=1LhD1r_RHKrssgdtdIU5jZGR6e7GObYi7)
パッケージのインポート方法：こちら（準備中）

---解答ルパン---

```Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    public Player player;

    void Start()
    {
        player.Attack();
    }
}

```

```Player.cs
using UnityEngine;

public class Player : MonoBehaviour
{
    int hp;

    public void Attack()
    {
        Debug.Log("攻撃");
    }
}
```
しまづ君：ありがとう！〇〇がわかったよ＾＾（わかった方は編集リクエストお願いします）


##演習問題：public関数
しまづくん：PlayerクラスにDamage関数も作ったんだけど、エラーが出ちゃった。。。どうすればいいかな？
<img width="706" alt="スクリーンショット 2020-03-04 18.47.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67439/12aa35e7-4e9b-73d0-abbe-5e71213c70d8.png">


（解答ルパン：わからなかったら検索しようよ、しまづくん、、、）

状況は"演習問題：他クラスの関数（メソッド）の利用"と同じ

しまづ君のコード

```Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    public Player player;

    void Start()
    {
        player.Attack();
        player.Damage(10);
    }
}
```

```Player.cs
using UnityEngine;

public class Player : MonoBehaviour
{
    int hp;

    public void Attack()
    {
        Debug.Log("攻撃");
    }

    void Damage(int damage)
    {
        hp -= damage;
        Debug.Log(hp);
    }
}

```

---解答ルパン---

```Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    public Player player;

    void Start()
    {
        player.Attack();
        player.Damage(10);
    }
}

````

````Player.cs
using UnityEngine;

public class Player : MonoBehaviour
{
    int hp;

    public void Attack()
    {
        Debug.Log("攻撃");
    }

    public void Damage(int damage)
    {
        hp -= damage;
        Debug.Log(hp);
    }
}
```
しまづ君：ありがとう！〇〇がわかったよ＾＾（わかった方は編集リクエストお願いします）

##演習問題：public変数
しまづくん：さっきと同じ状況で、playerのhpをQuestionで使おうと思ったんだけど、またエラーが出ちゃった＾＾；どうすればいいかな？

状況は"演習問題：他クラスの関数（メソッド）の利用"と同じ

しまづ君のコード

```Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    public Player player;

    void Start()
    {
        int hp = player.hp;
        Debug.Log(hp);
    }
}
```

```Player.cs
using UnityEngine;

public class Player : MonoBehaviour
{
    int hp;

    public void Attack()
    {
        Debug.Log("攻撃");
    }

    public void Damage(int damage)
    {
        hp -= damage;
        Debug.Log(hp);
    }
}


```

---解答ルパン---

```Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    public Player player;

    void Start()
    {
        int hp = player.hp;
        Debug.Log(hp);
    }
}
````

````Player.cs
using UnityEngine;

public class Player : MonoBehaviour
{
    public int hp;
    public void Attack()
    {
        Debug.Log("攻撃");
    }

    public void Damage(int damage)
    {
        hp -= damage;
        Debug.Log(hp);
    }

    // あるいはプロパティってものを作ったり
    /*
    public int HP
    {
        get { return hp; }
        set { hp = value; }
    }
    関数で渡すこともある
    public int GetHP()
    {
        return hp;
    }
    */
}
```
しまづ君：ありがとう！〇〇がわかったよ＾＾（わかった方は編集リクエストお願いします）


クラス以外にも構造体ってものがあるんだけど、使い方はクラスと似てるから困ることはないと思います。
・スタジオしまづYouTube：[Unity特有のクラスについて紹介するぞ！](https://youtu.be/0s8-MiA6kXo)

##つづき
- 超演習問題編：https://qiita.com/simanezumi1989/items/57ee8e80c6364244fb2d
- スタジオしまづの[YouTube](https://www.youtube.com/channel/UCDunz_CPkqkQT5ljKXcYkhg?view_as=subscriber)：チャンネル登録お願いします！
- スタジオしまづの[学習サイト](https://d35e.uscreen.io/)：特典：Udemyを含む動画教材見放題+オンラインサロンの加入