ログインボーナス　前編

[【完走目指す】初心者が25日で強くなる Advent Calendar 2022](https://qiita.com/advent-calendar/2022/aruhitoganbaru) 
１７日目です。　
# やる気
仕事や学校、家事その他もろもろログインボーナスがあると人は頑張れる。らしい。
なので、そういう人たちのためのログインボーナスを作る。
# 内容　
学校や会社についた時、家事をする前ややることを始める前にアプリを開いてボタンをタップ。
スタンプカードにスタンプがたまっていく。
たまったスタンプで、背景とか、スタンプカードを豪華にできるようにする。

# 保存機能
今回これを作るにあたり、保存機能の作り方を学びます。
ログインした記録を保存できるようにします。
参考: 

https://www.sejuku.net/blog/69991

Playerprefs。

# 制作
まず、スタンプカードを作ります。
![1718月.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/c6ca1798-1221-a216-9072-c72ca24d3919.png)
これを、日曜日まで作ります。
次に、スタンプを作ります。

![1718ハンコ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/124d49d9-b73c-396d-c3e2-0bff9e7d0720.png)
よくある済ハンコです。
後、背景も。
![スタンプカード背景.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/04489c39-89d8-d3b8-f109-ef539637041d.png)

とりあえず、これで準備OKです。
# 配置
いい感じに調節します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/a2c92756-9f01-ca46-f83b-00a80666d895.png)

とりあえずこれで。
言い忘れてましたが、タイトルも作ります。

# タイトル制作
Scene間を移動します。
まず新しいSceneを用意して、現在のSceneの名前を変えます。
としようとしましたが、名前を変えるとそのSceneの中のもの(今回はさっき作った奴）は消えるので気を付けましょう。ちなみに自分は消えました。
2つ目のSceneを作り、以下のようにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/03cefcd3-cf81-9ec3-0fd8-40a19e5910ad.png)
タイトルと中身の２つになります。
その後、
以下のように書きます。
```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class ScnMv : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.touchCount > 0)
        {
            Touch touch = Input.GetTouch(0);
            if (touch.phase == TouchPhase.Began)
            {
                SceneManager.LoadScene("Stamp");
            }
        }
    }

}

```
参考:

https://www.sejuku.net/blog/49352

これで、Sceneを変更できます。

ついでに、これをつけるためのオブジェクト（タイトル画面）も作りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/b92734a3-82b7-b1d4-d78d-e24f0ac31dad.png)
これでタイトルは完成です。
# 自分の使う曜日を決める
大事です。例えばこれを大学生が使う場合、日曜日には学校に行かないということもあります。そういった場合にも対応できます。
曜日を決め終わった後、以下のようにその情報が保存されます。
![保存の仕方.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/98b71f36-60d4-6a02-e9dd-5471d319c742.png)
パソコンの２進数の要領です。この値を呼び出すときは、大きいものから順に引きます。
例えば、
115
だったら、115から64をひいて51
51は0よりも大きいので64に対応するもの（今回は土曜日）は存在する
残った51から32を引いて１９
金曜日も存在した
19から16を引いて3
木曜日も存在する
3から8を引くとマイナスになるのでひかない
なので水曜日は存在しない
火曜日も引けないので存在しない
日、月は引ける。

こんな感じです。


このシステムを実装するために必要な、Toggleについて学びます。
# Toggleについて
on/offを切り替えるスイッチ。オスと切り替わる。チェックマークがつくやつ。
bool形で返される。
ざっとこんなところでしょう。

では、作っていきます。
# 制作
#### トグル
最終的にこんな感じになりました。
```
  public Toggle[] DayA;//トグル
    public bool[] DayATe;//動作用
   
    public int G;
    public int AggrigateDay;
    // Start is called before the first frame update
    void Start()
    {
        for(; G < 7; G++)
        {
            DayA[G].isOn = false;
            DayATe[G] = false;      }
    }
    
    // Update is called once per frame
    void Update()
    {
      
        if (DayA[0].isOn== true)
        {
           
                if (DayATe[0] == false)
                {
                    AggrigateDay = AggrigateDay + 1;
                    DayATe[0] = true;
                   

                }
            

        }
        else
        {
            if (DayATe[0] == true)
            {
                AggrigateDay = AggrigateDay - 1;
                DayATe[0] = false;
            }
            
           
           
        }
        if (DayA[1].isOn == true)
        {
            if (DayATe[1] == false)
            {
                AggrigateDay = AggrigateDay + 2;
                DayATe[1] = true;
            }


        }
        else
        {
            if (DayATe[1] == true)
            {
                AggrigateDay = AggrigateDay - 2;
                DayATe[1] = false;
            }
            


        }
        if (DayA[2].isOn == true)
        {

            if (DayATe[2] == false)
            {
                AggrigateDay = AggrigateDay + 4;
                DayATe[2] = true;


            }


        }
        else
        {
            if (DayATe[2] == true)
            {
                AggrigateDay = AggrigateDay - 4;
                DayATe[2] = false;
            }



        }
        if (DayA[3].isOn == true)
        {

            if (DayATe[3] == false)
            {
                AggrigateDay = AggrigateDay + 8;
                DayATe[3] = true;


            }


        }
        else
        {
            if (DayATe[3] == true)
            {
                AggrigateDay = AggrigateDay - 8;
                DayATe[3] = false;
            }



        }
        if (DayA[4].isOn == true)
        {

            if (DayATe[4] == false)
            {
                AggrigateDay = AggrigateDay + 16;
                DayATe[4] = true;


            }


        }
        else
        {
            if (DayATe[4] == true)
            {
                AggrigateDay = AggrigateDay - 16;
                DayATe[4] = false;
            }



        }
        if (DayA[5].isOn == true)
        {

            if (DayATe[5] == false)
            {
                AggrigateDay = AggrigateDay + 32;
                DayATe[5] = true;


            }


        }
        else
        {
            if (DayATe[5] == true)
            {
                AggrigateDay = AggrigateDay - 32;
                DayATe[5] = false;
            }



        }
        if (DayA[6].isOn == true)
        {

            if (DayATe[6] == false)
            {
                AggrigateDay = AggrigateDay + 64;
                DayATe[6] = true;


            }


        }
        else
        {
            if (DayATe[6] == true)
            {
                AggrigateDay = AggrigateDay - 64;
                DayATe[6] = false;
            }



        }
    }


}
```
Toggleは一度オンになるとずっとそのままなので、一度だけ処理を行うことができません。
そこで、もう一つboolを作り、それを使って処理しています。
図であらわすと、こんな感じです。
# 図解
1.トグルがOnになるがboolはまだOffの状態
![図解１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/ae93a857-8927-7adc-702f-4f7a36cc4b01.png)
この時に処理を実行。最後にboolをOnにするようにする。
2.どちらもOnの状態
![図解２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/652174f8-b726-4278-85e7-d5f24b7ae957.png)

この状態の時、トグルはOnの状態が維持される。boolがOnになっているため、処理はこれ以上行われない。
3.トグルをOFFにした時
![図解３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/c5f9199b-bd81-304b-2efc-2ecf9e040123.png)


この時、１とは別の処理を行う
処理の最後に、boolをOFFにする処理を入れる。
4.どちらもOFFの状態
これで、一番最初のなにもない状態に戻る。

こんなイメージです。

では、トグル操作により出た値をもとに自分の使う曜日を出すようにしていきます。
#### 曜日を出す
以下のように書きました。
```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DayOpt : MonoBehaviour
{
    public DCnt D;
    public int DoA;
    public GameObject[] Day;
    public int FC;
    // Start is called before the first frame update
    void Start()
    {
        for (; FC < 6; FC++)
        {
            Day[FC].SetActive(false);
        }
        
    }

    // Update is called once per frame
    void Update()
    {
        DoA = D.AggrigateDay;
        if (DoA - 64 >= 0)
        {
            Day[6].SetActive(true);
            DoA = DoA - 64;
            
        }
        if (DoA - 32 >= 0)
        {
            Day[5].SetActive(true);
            DoA = DoA - 32;

        }
        if (DoA - 16 >= 0)
        {
            Day[4].SetActive(true);
            DoA = DoA - 16;

        }
        if (DoA - 8 >= 0)
        {
            Day[3].SetActive(true);
            DoA = DoA - 8;

        }
        if (DoA - 4 >= 0)
        {
            Day[2].SetActive(true);
            DoA = DoA - 4;

        }
        if (DoA - 2 >= 0)
        {
            Day[1].SetActive(true);
            DoA = DoA - 2;

        }
        if (DoA - 1 >= 0)
        {
            Day[0].SetActive(true);
            DoA = DoA - 1;

        }
    }
}
```
これでいけるでしょうか。
# 結果
![スクリーンショット_20221217_161012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/d81724d3-1031-5be3-3ac5-ca32b42280df.png)


失敗です。
何がいけなかったのでしょうか
## 原因（１回目）
![スクリーンショット_20221217_161026.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/35bd5eeb-9ebc-c454-cb61-b7755527a8e9.png)
ここに原因はなし。
調べたら、void Start()内のfor文の設定が間違ってました。

```
 for (; FC < 7; FC++)
        {
            Day[FC].SetActive(false);
        }
```
このように変えます。

これでいけるでしょうか
# 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/aaad9dde-c0b7-cd42-b775-19e2c3371359.png)

見た感じは問題なさそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/5c869396-b57b-af9b-af47-57fbc38378ad.png)

トグルも問題なく作動しました。
ここからが問題でした。
トグルをOFFにしてやると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/214b0026-c394-8331-6d6e-fc566845d439.png)

消えない。スタンプカードがちゃんと消えない。
intのDoAが消してくれるはずだったのに。

# 修正

後編に回します。


# （ここまでの）まとめ
Toggleはboolだった
１つの変数で複数のToggleを操作する方法を考えた。
後編まだ書いてないので急いで書きます。