masa's blog

Masa's Gamesの開発ブログ

【Unity】数値の増減ボタンで%(あまり)を使って一周したら戻るようにする


概要

パスコードを入力させるときによくある数値の増減ボタンで、9の状態で↑を押したら0、0の状態で↓を押したら9になるように、一周したら戻ってくる仕様にするとボタンを押す回数が減って入力が楽になります。
if文で簡単に実装できますが、今回は%(あまり)を使ってより簡単に実装する方法を書きます。

結論

↑を押したらOnClickUpButton、↓を押したらOnClickDownButtonが呼ばれることを想定しています。

public class NumberUpDown : MonoBehaviour
{
    public Text text;
    public int value = 0;

    public void OnClickUpButton(){
        value = (value + 1) % 10;
        text.text = value.ToString();
    }

    public void OnClickDownButton(){
        value = (value + 9) % 10;
        text.text = value.ToString();
    }
}

解説

増加時(7行目)

ここは直感的だと思います。
(value + 1)が1~9のときは、1 % 10 = 1, ..., 9 % 10 = 9なので普通に1を足した時と変わりません。
(value + 1)が10になるタイミングで、10 % 10 = 0となり、0に戻ってきます。

減少時(12行目)

1減らすのに9を足すという直感的でないことをしていますが、計算してみると

  • value = 9のとき、(value + 9) % 10 = 18 % 10 = 8
  • value = 8のとき、(value + 9) % 10 = 17 % 10 = 7
  • value = 7のとき、(value + 9) % 10 = 16 % 10 = 6

のように、確かに1ずつ減っていきます。
また、value = 0のとき、
(value + 9) % 10 = 9 % 10 = 9
なので、一周して9に戻ります。

(value - 1) % 10じゃダメなの?

C#の仕様では-1 % 10 = -1なので、0から減少させたとき9に戻らなくなってしまいます。

数字が10種類でない場合は?

今回は0~9の10種類の数字を使うことを想定しましたが、それ以外の場合でも同じ方法が使えます。
N種類の数字を使う場合、

とすればよいです。