【完走目指す】初心者が25日で強くなる Advent Calendar 2022
10日目です。
今回は今まで勉強した知識を使って、なるべく調べないで作っていきます。
大学の課題がいつもよりも多めなのでボリュームが減ってますが、気にしないでください。
時計
アナログ時計とか、デジタル時計とか。
時間があればどっちも作ります。
デジタル時計
まずはデジタル時計から作ります。
24時間表示です。
まず、
と
を用意します。
さて、ここで2通りの作り方が思いつきました。
1.これで数字の画像を作ってそれを表示
2.この2種類の画像を使い分けてデジタルっぽく作る
今回は、2のほうで行きます。
制作
ならべる
さっきのをこんな感じに並べます。
灰色のやつの下には、黒色のやつが隠れています。
これで準備OKです。
書く
試しに以下のように書いてみました。
switchってcaseをこんな風になれべられたっけと考えましたが、エラーになっていないのでOKです。とりあえず動かしてみます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class Clock : MonoBehaviour
{
public GameObject[] BarGray;
public int Min;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
Min = DateTime.Now.Minute;
Debug.Log(Min);
switch (Min)
{ case 1:case 11: case 21:case 31:case 41: case 51:
BarGray[5].SetActive(false);
BarGray[6].SetActive(false);
break;
case 2:
case 12:
case 22:
case 32:
case 42:
case 52:
BarGray[5].SetActive(true);
BarGray[1].SetActive(false);
BarGray[2].SetActive(false);
BarGray[3].SetActive(false);
BarGray[4].SetActive(false);
break;
case 3:
case 13:
case 23:
case 33:
case 43:
case 53:
BarGray[1].SetActive(true);
BarGray[2].SetActive(true);
break;
case 4:
case 14:
case 24:
case 34:
case 44:
case 54:
BarGray[2].SetActive(true);
BarGray[4].SetActive(true);
BarGray[0].SetActive(false);
break;
case 5:
case 15:
case 25:
case 35:
case 45:
case 55:
BarGray[5].SetActive(true);
BarGray[2].SetActive(false);
BarGray[4].SetActive(false);
break;
case 6:
case 16:
case 26:
case 36:
case 46:
case 56:
BarGray[1].SetActive(false);
break;
case 7:
case 17:
case 27:
case 37:
case 47:
case 57:
BarGray[0].SetActive(true);
BarGray[1].SetActive(true);
BarGray[2].SetActive(true);
BarGray[3].SetActive(true);
BarGray[5].SetActive(false);
break;
case 8:
case 18:
case 28:
case 38:
case 48:
case 58:
BarGray[0].SetActive(false);
BarGray[1].SetActive(false);
BarGray[2].SetActive(false);
BarGray[3].SetActive(false);
break;
case 9:
case 19:
case 29:
case 39:
case 49:
case 59:
BarGray[1].SetActive(true);
break;
case 0:
case 10:
case 20:
case 30:
case 40:
case 50:
case 60:
BarGray[3].SetActive(true);
;
BarGray[1].SetActive(false);
break;
}
}
}
一番右の数字を制御しています。
こんな感じのやつを4つ作り、それぞれの数字を制御します。
今回は、うるう秒にも対応するためにcaseを60まで取っています。
結果
動かない。
caseの取り方が悪かったようです。
追記
caseでも行けるかもしれないです。
BarGrayとBarBlackが逆になってました。
改善
caseは1つの処理に1個しか付けられないようなので、caseの中身をまとめます。
ここのswitchでは分の一番右、一の位を制御しています。
なので、どうにかして Minの一の位だけを取得 → その数字に対応した処理を行う
このようにしたいわけです。
そういえば、MOS試験を受けた時にleftとかrightとかいう関数について書いてありました。使えそう。
↑使えませんでした。C#は対応していない関数のようです。
では、C#ではどのように書くのか調べました。
やはりありました。
今回はToString()を使用します。
分(1の位)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class Clock : MonoBehaviour
{
public GameObject[] BarGray;
public int SPMin;
public int Min;
// Start is called before the first frame update
void Start()
{
BarGray[0].SetActive(true);
BarGray[1].SetActive(true);
BarGray[2].SetActive(true);
BarGray[3].SetActive(true);
BarGray[4].SetActive(true);
BarGray[5].SetActive(true);
BarGray[6].SetActive(true);
}
// Update is called once per frame
void Update()
{
Min = DateTime.Now.Minute;
if (Min >= 10)
{
String ChMin = Min.ToString();
int InMin = ChMin[1];
SPMin = InMin - 48;
}
else
{
String ChMin = Min.ToString();
int InMin = ChMin[0];
SPMin = InMin - 48;
}
switch (SPMin)
{
case 1:
BarGray[0].SetActive(true);
BarGray[1].SetActive(true);
BarGray[2].SetActive(true);
BarGray[4].SetActive(true);
BarGray[5].SetActive(true);
BarGray[6].SetActive(true);
BarGray[5].SetActive(false);
BarGray[6].SetActive(false);
break;
case 2:
BarGray[5].SetActive(true);
BarGray[6].SetActive(true);
BarGray[1].SetActive(false);
BarGray[2].SetActive(false);
BarGray[3].SetActive(false);
BarGray[4].SetActive(false);
BarGray[5].SetActive(false);
break;
case 3:
BarGray[1].SetActive(true);
BarGray[2].SetActive(true);
BarGray[3].SetActive(true);
BarGray[4].SetActive(true);
BarGray[5].SetActive(true);
BarGray[2].SetActive(false);
BarGray[3].SetActive(false);
BarGray[4].SetActive(false);
BarGray[5].SetActive(false);
BarGray[6].SetActive(false);
break;
case 4:
BarGray[2].SetActive(true);
BarGray[3].SetActive(true);
BarGray[4].SetActive(true);
BarGray[5].SetActive(true);
BarGray[6].SetActive(true);
BarGray[0].SetActive(false);
BarGray[3].SetActive(false);
BarGray[5].SetActive(false);
BarGray[6].SetActive(false);
break;
case 5:
BarGray[0].SetActive(true);
BarGray[3].SetActive(true);
BarGray[5].SetActive(true);
BarGray[6].SetActive(true);
BarGray[0].SetActive(false);
BarGray[2].SetActive(false);
BarGray[3].SetActive(false);
BarGray[4].SetActive(false);
BarGray[6].SetActive(false);
break;
case 6:
BarGray[0].SetActive(true);
BarGray[2].SetActive(true);
BarGray[3].SetActive(true);
BarGray[4].SetActive(true);
BarGray[6].SetActive(true);
BarGray[0].SetActive(false);
BarGray[1].SetActive(false);
BarGray[2].SetActive(false);
BarGray[3].SetActive(false);
BarGray[4].SetActive(false);
BarGray[6].SetActive(false);
break;
case 7:
BarGray[0].SetActive(true);
BarGray[1].SetActive(true);
BarGray[2].SetActive(true);
BarGray[3].SetActive(true);
BarGray[4].SetActive(true);
BarGray[6].SetActive(true);
BarGray[4].SetActive(false);
BarGray[5].SetActive(false);
BarGray[6].SetActive(false);
break;
case 8:
BarGray[4].SetActive(true);
BarGray[5].SetActive(true);
BarGray[6].SetActive(true);
BarGray[0].SetActive(false);
BarGray[1].SetActive(false);
BarGray[2].SetActive(false);
BarGray[3].SetActive(false);
BarGray[4].SetActive(false);
BarGray[5].SetActive(false);
BarGray[6].SetActive(false);
break;
case 9:
BarGray[0].SetActive(true);
BarGray[1].SetActive(true);
BarGray[2].SetActive(true);
BarGray[3].SetActive(true);
BarGray[4].SetActive(true);
BarGray[5].SetActive(true);
BarGray[6].SetActive(true);
BarGray[0].SetActive(false);
BarGray[2].SetActive(false);
BarGray[3].SetActive(false);
BarGray[4].SetActive(false);
BarGray[5].SetActive(false);
BarGray[6].SetActive(false);
break;
case 0:
BarGray[0].SetActive(true);
BarGray[2].SetActive(true);
BarGray[3].SetActive(true);
BarGray[4].SetActive(true);
BarGray[5].SetActive(true);
BarGray[6].SetActive(true);
BarGray[0].SetActive(false);
BarGray[1].SetActive(false);
BarGray[2].SetActive(false);
BarGray[4].SetActive(false);
BarGray[5].SetActive(false);
BarGray[6].SetActive(false);
break;
}
}
}
分(10の位)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class Clock2: MonoBehaviour
{
public GameObject[] BarGray;
public int Min;
public int SPMinB;
// Start is called before the first frame update
void Start()
{
BarGray[0].SetActive(true);
BarGray[1].SetActive(true);
BarGray[2].SetActive(true);
BarGray[3].SetActive(true);
BarGray[4].SetActive(true);
BarGray[5].SetActive(true);
BarGray[6].SetActive(true);
}
// Update is called once per frame
void Update()
{
Min = DateTime.Now.Minute;
if (Min >= 10)
{
String ChMin = Min.ToString();
int InMin = ChMin[0];
SPMinB = InMin - 48;
}
else
{
SPMinB = 0;
}
switch (SPMinB)
{
case 1:
BarGray[0].SetActive(true);
BarGray[1].SetActive(true);
BarGray[2].SetActive(true);
BarGray[4].SetActive(true);
BarGray[5].SetActive(true);
BarGray[6].SetActive(true);
BarGray[5].SetActive(false);
BarGray[6].SetActive(false);
break;
case 2:
BarGray[5].SetActive(true);
BarGray[6].SetActive(true);
BarGray[1].SetActive(false);
BarGray[2].SetActive(false);
BarGray[3].SetActive(false);
BarGray[4].SetActive(false);
BarGray[5].SetActive(false);
break;
case 3:
BarGray[1].SetActive(true);
BarGray[2].SetActive(true);
BarGray[3].SetActive(true);
BarGray[4].SetActive(true);
BarGray[5].SetActive(true);
BarGray[2].SetActive(false);
BarGray[3].SetActive(false);
BarGray[4].SetActive(false);
BarGray[5].SetActive(false);
BarGray[6].SetActive(false);
break;
case 4:
BarGray[2].SetActive(true);
BarGray[3].SetActive(true);
BarGray[4].SetActive(true);
BarGray[5].SetActive(true);
BarGray[6].SetActive(true);
BarGray[0].SetActive(false);
BarGray[3].SetActive(false);
BarGray[5].SetActive(false);
BarGray[6].SetActive(false);
break;
case 5:
BarGray[0].SetActive(true);
BarGray[3].SetActive(true);
BarGray[5].SetActive(true);
BarGray[6].SetActive(true);
BarGray[0].SetActive(false);
BarGray[2].SetActive(false);
BarGray[3].SetActive(false);
BarGray[4].SetActive(false);
BarGray[6].SetActive(false);
break;
case 6:
BarGray[0].SetActive(true);
BarGray[2].SetActive(true);
BarGray[3].SetActive(true);
BarGray[4].SetActive(true);
BarGray[6].SetActive(true);
BarGray[0].SetActive(false);
BarGray[1].SetActive(false);
BarGray[2].SetActive(false);
BarGray[3].SetActive(false);
BarGray[4].SetActive(false);
BarGray[6].SetActive(false);
break;
case 7:
BarGray[0].SetActive(true);
BarGray[1].SetActive(true);
BarGray[2].SetActive(true);
BarGray[3].SetActive(true);
BarGray[4].SetActive(true);
BarGray[6].SetActive(true);
BarGray[4].SetActive(false);
BarGray[5].SetActive(false);
BarGray[6].SetActive(false);
break;
case 8:
BarGray[4].SetActive(true);
BarGray[5].SetActive(true);
BarGray[6].SetActive(true);
BarGray[0].SetActive(false);
BarGray[1].SetActive(false);
BarGray[2].SetActive(false);
BarGray[3].SetActive(false);
BarGray[4].SetActive(false);
BarGray[5].SetActive(false);
BarGray[6].SetActive(false);
break;
case 9:
BarGray[0].SetActive(true);
BarGray[1].SetActive(true);
BarGray[2].SetActive(true);
BarGray[3].SetActive(true);
BarGray[4].SetActive(true);
BarGray[5].SetActive(true);
BarGray[6].SetActive(true);
BarGray[0].SetActive(false);
BarGray[2].SetActive(false);
BarGray[3].SetActive(false);
BarGray[4].SetActive(false);
BarGray[5].SetActive(false);
BarGray[6].SetActive(false);
break;
case 0:
BarGray[0].SetActive(true);
BarGray[2].SetActive(true);
BarGray[3].SetActive(true);
BarGray[4].SetActive(true);
BarGray[5].SetActive(true);
BarGray[6].SetActive(true);
BarGray[0].SetActive(false);
BarGray[1].SetActive(false);
BarGray[2].SetActive(false);
BarGray[4].SetActive(false);
BarGray[5].SetActive(false);
BarGray[6].SetActive(false);
break;
}
}
}
時間も同様に書けばOKです。
追記
BarGrayと書いてますが、すべてBarBlackの誤りでした。
直す気力もないし、ちゃんと動くので大丈夫です。
時間も同様に書けばOKです。
10分以下(0~9分)は、char型の[1]がうまく機能しないので、
ifで条件分岐 → 10分以下の時だけ特殊な処理(強制的にSPMinB)を0としています。
結果
動いた!
まとめ
自分で考えて書くのは難しい。
多分、わからないことはすぐ調べたほうが早く終わる。
10日目 終わり