初心者がUnity2Dでゲーム作ってみた記録

#目次
[作ったもの](#作ったもの)
[ざっくり設計・機能](#ざっくり設計機能)
[学び](#学び)
[おわりに](#おわりに)

#作ったもの
![3_unity_MC_title.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521032/b4c324ec-29df-6239-e7bc-dcae87a4ca00.png)

[まほうのクッキング | unityroom]
(https://unityroom.com/games/magic_cooking)
リンク先で遊べます。PC推奨、スマホなどでも一応動作はするようですがサポート外のためデザインが崩れます。
イラストなど諸々込で制作期間2週間、制作時間15時間ちょいくらい。完成したのは11月頃。
####ゲーム概要
子ども向け。遊びに来るお客さんのためにケーキを作ろう！というストーリー。ヒントからお客さんは誰か・使うべき食材は何か考え、調理パートで食材を選ぶ。選んだ食材によって完成するケーキが変化し、クリア分岐します。

#ざっくり設計・機能
![magic_cooking.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521032/ff4b3215-6b7c-f15a-4dbd-8845925a9118.png)
[スクリプト一覧 | Git]
(https://github.com/sky9-20/Magic_Cooking/tree/master/scripts)

〆切的にイラストが間に合わなそうで諦めたけどお客さんをランダムに設定したかったところ。
主に頑張ったのはケーキ土台とトッピングを数種用意し、選んだ食材によってケーキの完成図を変化させる部分。
![3_unity_MC_select.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521032/9261a201-d4bf-c1b3-2a58-e669d946e853.png)
![3_unity_MC_cake2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521032/29d9488e-8fb5-ae5d-6b2b-b3eb5f0da050.png)

「これでつくる」ボタンに変数を用意。食材を選ぶと、インスペクターで指定した値分「これでつくる」の変数を変化させるメソッドを呼ぶ仕様。

 ↓一部抜き出し
<details><summary>「これでつくる」ボタン側スクリプト</summary><div>

```C#:Judge
    public int which_cake = 0;
    public int whichi_decoration = 0;

   //食材側で呼び出される、判定値を変更
    public void Pc1()
    {
        which_cake += 1;
        Debug.Log("which_cake: " + which_cake);
    }

    public void Pw1()
    {
        whichi_decoration += 1;
        Debug.Log("whichi_decoration: " + whichi_decoration);
    }
   void OnMouseDown()
    {
        if(which_cake == 7)
        {
            cake_freshcream.SetActive(true);
        }
        else if(which_cake == 17)
        {
            cake_chocolate.SetActive(true);
        }
        else
        {
            cake_failed.SetActive(true);
        }

        if (whichi_decoration == 3 && (which_cake == 7 || which_cake == 17))
        {
            banana.SetActive(true);
            strawberry.SetActive(true);
            P.SetActive(true);
        }
        else if (whichi_decoration == 1 && (which_cake == 7 || which_cake == 17))
        {
            banana.SetActive(true);
            P.SetActive(true);
        }

        else if(whichi_decoration == 2 && (which_cake == 7 || which_cake == 17))
        {
            strawberry.SetActive(true);
            C.SetActive(true);
        }
        else
        {
            B.SetActive(true);
        }
    }
```
</div></details>

<details><summary>食材側スクリプト</summary><div>

```C#:Judge
   //足す値をインスペクター上で指定
    public int plus = 1;

    void OnMouseDown()
    {
        //ループ用の変数を定義
        int p = plus;

        //+値が0になるまでJudgeで足す
        while (p != 0)
        {
            judger.GetComponent<Judge>().Pc1();
            --p;
        }
        
        this.gameObject.SetActive(false);
    }
```
</div></details>

###ハマった問題
他オブジェクトのスクリプトから値を変化させる方法

```C#:共有する変数が記述されたクラスA
 public static int a = 0
```
```C#:利用側
 A.a = 0
```
上記のようにpublicかつstaticな変数であればクラス外からもアクセスでき、異なるシーン間でも共有することができる。またクラス外からも値を変更できます。ただしエラーのもとのためprivateにして、プロパティで操作するのが原則らしい。
今回はそもそも他オブジェクトのスクリプトから値を変化させないことで解決しました。

プロパティについては↓
[プロパティ - C# プログラミング ガイド | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/csharp/properties)
[プロパティ？フィールド？メンバー？C#のクラス構造のおさらい](https://qiita.com/toshi0607/items/801a0d37fb48313cbdbd)

#学び
- ハマったとき、どうしてもその方法に限る場合を除いて別手段を検討する
- その方法に限る場合早めに人に聞いてみる
- 後々まとめることを念頭にキャプチャなどを残しておくと未来の自分が喜ぶ。


##おまけ
制作前の自分用ざっくりメモ
![IMG_3458.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521032/ad1ba9c6-47af-c4e6-cf60-3dff00f9e6e2.jpeg)

#おわりに
見ていただきありがとうございました！