【完走目指す】初心者が25日で強くなる Advent Calendar 2022
18日目の記事です。
遅れました。
前回のあらすじ
Toggleの使い方を学んだ
スタンプカードの制御ができず、修正するところまで作った。
修正(続き)
スタンプカードを、出すことはできたけど消すことができなかった問題を修正します。
うまいこと消えてくれるように、以下のように修正しました。
if (DoA - 64 >= 0)
{
Day[6].SetActive(true);
DoA = DoA - 64;
}else
{ Day[6].SetActive(false); }
if文はもとからあった内容です。elseを追加しました。
DoAが64まで足りていなかったらDay[6]は消えます。
しかし、これだけだとDoAは最初に0になってしまい、このelseが機能しなくなってしまうため
さらに以下の文を追加しました
if (DoA == 0)
{
DoA = D.AggrigateDay;
}
これで、常にDoAにはAggrigateDayの内容が反映されます。
もう、これで動くでしょう。
確認
Toggleをオンにして、出る。
Toggleをオフにすると?
消えた!!!
これで、トグルの部分は完成です。
さて、次はいよいよスタンプの部分を作ります。
スタンプ
ではスタンプを作ります。
さっきのものに以下を追加しました。
時間がないので、ここからは出来上がった後のものを書いています。
修正した過程はすっ飛ばして、動いた状態のものを書いています
public GameObject[] Hanko;
public int HnkSv;
DayOfWeek Dt =DateTime.Today.DayOfWeek;
switch (Dt)
{
case DayOfWeek.Sunday:
if (Day[0].activeSelf == true)
{
if (Hanko[0].activeSelf == true)
{
}
else
{
HnkSv = HnkSv + 1;
Hanko[0].SetActive(true);
}
}
break;
case DayOfWeek.Monday:
if (Day[1].activeSelf == true)
{
if (Hanko[1].activeSelf == true)
{
}
else
{
HnkSv = HnkSv + 2;
Hanko[1].SetActive(true);
}
}
break;
case DayOfWeek.Tuesday:
if (Day[2] .activeSelf==true)
{
if (Hanko[2].activeSelf==true)
{
}
else
{
HnkSv = HnkSv + 4;
Hanko[2].SetActive(true);
}
}
break;
case DayOfWeek.Wednesday:
if (Day[3].activeSelf == true)
{
if (Hanko[3].activeSelf == true)
{
}
else
{
HnkSv = HnkSv + 8;
Hanko[3].SetActive(true);
}
}
break;
case DayOfWeek.Thursday:
if (Day[4].activeSelf == true)
{
if (Hanko[4].activeSelf == true)
{
}
else
{
HnkSv = HnkSv + 16;
Hanko[4].SetActive(true);
}
}
break;
case DayOfWeek.Friday:
if (Day[5].activeSelf == true)
{
if (Hanko[5].activeSelf == true)
{
}
else
{
HnkSv = HnkSv + 32;
Hanko[5].SetActive(true);
}
}
break;
case DayOfWeek.Saturday:
if (Day[6].activeSelf == true)
{
if (Hanko[6].activeSelf == true)
{
}
else
{
HnkSv = HnkSv + 64;
Hanko[6].SetActive(true);
}
}
break;
}
これで、今日の日付にスタンプが押されるはずです。
Toggleをオフにして、再度オンにしなおしてもちゃんと押されたままの状態が維持されています。
保存機能を作る
前回行った情報が維持されるようにします。
前編ですでに保存機能について学んだと思うので、やり方は省略します。
保存するものは、以下の通りです
・スタンプカード(日曜日から土曜日までで、トグルの状態も同じように保存する)
・スタンプの状況
以上2点です。
いろいろ試行錯誤した結果、
最終的にこうなりました。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class DayOpt : MonoBehaviour
{
public DCnt D;
public int DoA;
DayOfWeek Dt =DateTime.Today.DayOfWeek;
public GameObject[] Negirai;
public GameObject[] Day;
public GameObject[] Hanko;
public int HnkSv;
public int FC=0;
public int PP1;
public bool Pchk;
public DCnt DC;
// Start is called before the first frame update
void Start()
{
HnkSv = PlayerPrefs.GetInt("PD2");
PP1 = HnkSv;
if (Dt == DayOfWeek.Sunday)
{
HnkSv = 0;
PP1 = 0;
}
for (; FC <= 6; FC++)
{
Hanko[(6-FC)].SetActive(false);
Negirai[FC].SetActive(false);
Day[FC].SetActive(false);
if (PP1 - (Mathf.Pow(2,(6 - FC))) >= 0)
{
Debug.Log(6 - FC);
PP1 = (int)(PP1 - (Mathf.Pow(2, (6 - FC))));
Hanko[(6-FC)].SetActive(true);
}
}
DoA = PlayerPrefs.GetInt("PD1");
D.AggrigateDay = DoA;
if (D.AggrigateDay < 0) {
D.AggrigateDay = 0;
}
}
// Update is called once per frame
void Update()
{
PlayerPrefs.SetInt("PD1", D.AggrigateDay);
DoA = D.AggrigateDay;
if (DoA - 64 >= 0)
{
D.DayATe[6] = true;
Day[6].SetActive(true);
DC.DayA[6].isOn=true;
DoA = DoA - 64;
}else
{ Day[6].SetActive(false);
DC.DayA[6].isOn = false;
}
if (DoA - 32 >= 0)
{
D.DayATe[5] = true;
Day[5].SetActive(true);
DC.DayA[5].isOn = true;
DoA = DoA - 32;
}
else
{ Day[5].SetActive(false);
}
if (DoA - 16 >= 0)
{
D.DayATe[4] = true;
Day[4].SetActive(true);
DC.DayA[4].isOn = true;
DoA = DoA - 16;
}
else
{ Day[4].SetActive(false); }
if (DoA - 8 >= 0)
{
D.DayATe[3] = true;
DC.DayA[3].isOn = true;
Day[3].SetActive(true);
DoA = DoA - 8;
}
else
{ Day[3].SetActive(false); }
if (DoA - 4 >= 0)
{
D.DayATe[2] = true;
DC.DayA[2].isOn = true;
Day[2].SetActive(true);
DoA = DoA - 4;
}
else
{ Day[2].SetActive(false); }
if (DoA - 2 >= 0)
{
D.DayATe[1] = true;
DC.DayA[1].isOn = true;
Day[1].SetActive(true);
DoA = DoA - 2;
}
else
{ Day[1].SetActive(false); }
if (DoA - 1 >= 0)
{D.DayATe[0] = true;
DC.DayA[0].isOn = true;
Day[0].SetActive(true);
DoA = DoA - 1;
}
else
{ Day[0].SetActive(false);
}
if (DoA <= 0)
{
DoA = 0;
}
//ここまでスタンプカード
//ここからハンコ
switch (Dt)
{
case DayOfWeek.Sunday:
Negirai[0].SetActive(true);
if (Day[0].activeSelf == true)
{
if (HnkSv==0)
{
Debug.Log("OK");
HnkSv = HnkSv + 1;
Hanko[0].SetActive(true);
}
}
break;
case DayOfWeek.Monday:
Negirai[1].SetActive(true);
if (Day[1].activeSelf == true)
{
if (HnkSv<=1)
{
Debug.Log("OK");
HnkSv = HnkSv + 2;
Hanko[1].SetActive(true);
}
}
break;
case DayOfWeek.Tuesday:
Negirai[2].SetActive(true);
if (Day[2] .activeSelf==true)
{
if (HnkSv<=3)
{
Debug.Log("OK");
HnkSv = HnkSv + 4;
Hanko[2].SetActive(true);
}
}
break;
case DayOfWeek.Wednesday:
Negirai[3].SetActive(true);
if (Day[3].activeSelf == true)
{
if (HnkSv<=7)
{
Debug.Log("OK");
HnkSv = HnkSv + 8;
Hanko[3].SetActive(true);
}
}
break;
case DayOfWeek.Thursday:
Negirai[4].SetActive(true);
if (Day[4].activeSelf == true)
{
if (HnkSv<=15)
{
Debug.Log("OK");
HnkSv = HnkSv + 16;
Hanko[4].SetActive(true);
}
}
break;
case DayOfWeek.Friday:
Negirai[5].SetActive(true);
if (Day[5].activeSelf == true)
{
if (HnkSv<=31)
{
Debug.Log("OK");
HnkSv = HnkSv + 32;
Hanko[5].SetActive(true);
}
}
break;
case DayOfWeek.Saturday:
Negirai[6].SetActive(true);
if (Day[6].activeSelf == true)
{
if (HnkSv<=63)
{
Debug.Log("OK");
HnkSv = HnkSv + 64;
Hanko[6].SetActive(true);
}
}
break;
}
PlayerPrefs.SetInt("PD2", HnkSv);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class DCnt : MonoBehaviour
{
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;
}
}
}
}
多分これで動きます。
最後に、ログインした曜日に応じたメッセージが出るようにします。
メッセージ機能
まず、ねぎらいの言葉を描いたイラストを作ります。
1週間分作ります。
いい感じに配置します。
裏で七枚重なっています
その後、以下の文を追加します。
public GameObject[] Negirai;
Negirai[FC].SetActive(false);
Negirai[0].SetActive(true);
2つ目のfalseにする部分は、forループの中に入れましょう。
最後の部分は、caseで曜日ごとに分かれているところに入れます。
ではこれを設定して、
テストプレイします。
結果
ちゃんと動きました。
良かった
まとめ
保存の仕方を学んだ
結構複雑な仕組みになってしまい、途中どうなっているのかわからなくなることがあった。
わかりやすくすることの大切さを学んだ。