質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.65%

Unity)表示の制限をしたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 296

navesanta

score 168

元号や年をタップすると数字が順に変わるアプリを作成しています。

(例えば)平成は31年までしかないので平成をタップした場合、
年の2桁目は0~3までしか表示されず、具体的には0→1→2→3→0と
3をタップすると0に戻るようにしてあります。

質問は年の1桁目と2桁目の連動についてです。

平成で且つ年の2桁目が0か1か2の時は→0~9を順に表示
平成で且つ年の2桁目が3の時→0~1のみ順に表示
と切り替わるようにしたいのと

平成で且つ年の2桁目が0か1か2になっていて1桁目が(仮に)5の時
2桁目をタップして3にした時に1桁目が0
の表示に切り替わるようにしたいです。
例:15年←1を2度タップして3になった時1桁目が0になって30年になる。

現状にif文をネストすれば良いような気がしますが具体的にどうすればいいのか
悩んでいます。分かる方お手数ですが教えて下さい。

環境)
PC: mac
Unity2018.2
言語:C#

ChristianScript.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ChristianScript : MonoBehaviour
{
private int MEIJI_START = 1868;
private int TAISYO_START = 1912;
private int SHOWA_START = 1926;
private int HEISEI_START = 1989;
private int REIWA_START = 2019;

public const int test1_Meiji = 0;
public const int test1_Taisho = 1;
public const int test1_Showa = 2;
public const int test1_Heisei = 3;
public const int test1_Reiwa = 4;

    [SerializeField]Text ChristianText;

    public GameObject test1Input;
    public string[] test1Text = new string[5];
    private int test1Num = new int();
    private int uplimit;

    public const int zero = 0;
    public const int one = 1;
    public const int two = 2;
    public const int three = 3;
    public const int four = 4;
    public const int five = 5;
    public const int six = 6;
    public const int seven = 7;
    public const int eight = 8;
    public const int nine = 9;

public GameObject[] test2Input = new GameObject[2]; //数値を入れるobject(容器)
    public string[] test2Text = new string[10]; //実際に入れる数値パターン
    private int[] test2Num = new int[2]; //int型の数値を納めるエリア

    // Start is called before the first frame update
    void Start()
    {
        //最初の設定
        test1Num = test1_Reiwa;
        test2Num[0] = zero;
        test2Num[1] = one;   
    }
    // Update is called once per frame
    void Update()
    {

    }
   public void PushChristianChanged(){
        test1Num++;
        if(test1Num > test1_Reiwa){
             test1Num = test1_Meiji;
        }
         test1Input.GetComponent<Text>().text = test1Text[test1Num];
         CalculateChristian();

    }

    public void Pushtest2NumChanged1(){
        switch(test1Num){
            case test1_Meiji:
               uplimit = 4;
            break;
            case test1_Taisho:
               uplimit = 1;
            break;
            case test1_Showa:
               uplimit = 6;
            break;
            case test1_Heisei:
               uplimit = 3;
            break;
            case test1_Reiwa:
               uplimit = 1;
            break;
        }
        ChangeButtontest2Search(0, uplimit);
    }
    public void Pushtest2NumChanged2(){
        ChangeButtontest2Search(1, nine);
    }
    void ChangeButtontest2Search(int buttonNo, int uplimit){
        test2Num[buttonNo]++;
        if(test2Num[buttonNo] > uplimit){
            test2Num[buttonNo] = zero;
        }
        test2Input[buttonNo].GetComponent<Text>().text = test2Text[test2Num[buttonNo]];
         CalculateChristian();
    }
    void CalculateChristian(){
        switch(test1Num){
            case test1_Meiji:
               ChristianText.GetComponent<Text>().text = (MEIJI_START - 1 + test2Num[0] * 10 + test2Num[1]).ToString();
            break;
            case test1_Taisho:
               ChristianText.GetComponent<Text>().text = (TAISYO_START - 1 + test2Num[0] * 10 + test2Num[1]).ToString();
            break;
            case test1_Showa:
               ChristianText.GetComponent<Text>().text = (SHOWA_START - 1 + test2Num[0] * 10 + test2Num[1]).ToString();
            break;
            case test1_Heisei:
               ChristianText.GetComponent<Text>().text = (HEISEI_START - 1 + test2Num[0] * 10 + test2Num[1]).ToString();
            break;
            case test1_Reiwa:
               ChristianText.GetComponent<Text>().text = (REIWA_START - 1 + test2Num[0] * 10 + test2Num[1]).ToString();
            break;
        }
    }

}


イメージ図
イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

やってみたら思ったより難しくて楽しくなってきてしまい、
かなり書き進めてしまいました・・・。
ご参考までに。

適当なゲームオブジェクトに張り付けて、Aキー、Sキーを押すと
数値がカウントアップされます。(コンソールにでます)

元号をクラス化しておくとやりやすいかなと思いました。

考え方としては、
通常は0~9までのカウントアップをして、
カウントアップの結果が元号の最大値(平成なら31)を超える場合は、
変えようとしていた桁を0に戻します。

ほとんど答え書いてしまったので、
じっくり見て参考にして頂ければと思います。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class YearCounter : MonoBehaviour
{
    List<Gengo> GengoList = new List<Gengo>()
    {
        new Gengo("Meiji", 1868, 1912),
        new Gengo("Taisyo",1912, 1926),
        new Gengo("Showa", 1926, 1989),
        new Gengo("Heisei", 1989, 2019),
        new Gengo("Reiwa", 2019, 2019),
    };

    int currentDigit = 1;
    Gengo currentGengo;

    private void Start()
    {
        //西暦を指定して最初の元号を決める
        currentGengo = GetGengoForSeireki(1999);
    }

    private void Update()
    {
        //元号カウントアップ
        if (Input.GetKeyDown(KeyCode.A))
        {
            //1桁目の数値をカウントアップする
            CountUp(1);
        }

        //元号カウントアップ
        if (Input.GetKeyDown(KeyCode.S))
        {
            //2桁目の数値をカウントアップする
            CountUp(2);
        }
    }

    //特定の桁数をカウントアップする
    void CountUp(int ketaIndex)
    {
        var ketaList = Gengo.KetaSplit(currentDigit);

        ketaList[ketaIndex-1] = currentGengo.GetNextKetaDigit(ketaList , ketaIndex);

        currentDigit = Gengo.GetYearGengoForKetaList(ketaList);

        //元号は0年にはならない元年(1年)から始まる
        if (currentDigit == 0) currentDigit = 1;

        Debug.Log(currentDigit);
    }


    //西暦から、元号を取得する
    public Gengo GetGengoForSeireki(int seireki)
    {
        Gengo gengo = null;

        //元号を一つずつ見ていき、元号開始年が指定した西暦より早く(または同じ)で、より後の元号を取得
        GengoList.ForEach(x => 
        {
           if( x.StartYearAD <= seireki)
            {
                gengo = x;
            }
        });

        return gengo;
    }

    public class Gengo
    {
        public string Name { get; private set; }
        public int StartYearAD { get; private set; }
        public int EndYearAD { get; private set; }
        public int EndYearGengo { get; private set; }
        List<int> LimitNumbers;

        public Gengo(string Name, int StartYear, int EndYear)
        {
            this.Name = Name;
            this.StartYearAD = StartYear;
            this.EndYearAD = EndYear;

            //西暦から、元号の最大値を計算(平成ならなら31)
            EndYearGengo = EndYearAD - StartYearAD + 1;

            //桁ごとの最大値をリストに入れる(平成なら3と1)
            LimitNumbers = KetaSplit(EndYearGengo);
        }

        //数値を桁ごとに分割したリストを返す
        public static List<int> KetaSplit(int num)
        {
            var list = new List<int>();
            int ketaLimit;
            while (num != 0)
            {
                // 平成なら、31のあまりで1
                ketaLimit = num % 10;
                // 1を格納
                list.Add(ketaLimit);
                // 31割る10で3
                num = num / 10;

                //繰り返しで1と3が入る
            }

            while(list.Count < 3)
            {
                list.Add(0);
            }

            return list;
        }

        //桁ごとのリストから、元号年を取得する
        public static int GetYearGengoForKetaList(List<int> ketaList)
        {
            int yearGengo = 0;
            for (int i = 0; i < ketaList.Count; i++)
            {
                if (i == 0)
                {
                    yearGengo += ketaList[i];
                }
                else
                {
                    //2桁目以降は10のi乗をかけて足す
                    yearGengo += (int)(ketaList[i] * Mathf.Pow(10, i));
                }
            }

            return yearGengo;
        }

        //桁リストと、カウントアップする桁数を指定すると、正しい数値を返してくれる
        public int GetNextKetaDigit( List<int> ketaList, int ketaIndex)
        {
            //指定桁カウントアップ
            ketaList[ketaIndex - 1]++;

            //桁の数値が9を超えたら0に戻す(繰り上がりさせる場合は、この行をコメントアウトすると、GetYearGengoForKetaListの中で勝手に足してくれる)
            if (ketaList[ketaIndex - 1] > 9) ketaList[ketaIndex - 1] = 0;

            //最大値チェック
            int year = GetYearGengoForKetaList(ketaList);
            if (year > EndYearGengo)
            {
                //超えていたらその桁はゼロに
                ketaList[ketaIndex - 1] = 0;
            }

            return ketaList[ketaIndex - 1];
        }

        //元号から西暦を取得する
        public int GetSeireki(int YearGengo)
        {
            return StartYearAD + YearGengo - 1;
        }
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/12 16:38

    >カウントアップの結果が元号の最大値(平成なら31)を超える場合は、
    >変えようとしていた桁を0に戻します。

    考え方理解しました。またコードにて具体的な例ありがとうございます。こちら参考に何とかなりそうです。ありがとうございました。これからもよろしくお願いします。

    キャンセル

0

現状にif文をネストすれば良いような気がしますが具体的にどうすればいいのか
悩んでいます。

もし、複数の条件を指定したい場合は、以下のようにすればよいです。

  • if文をネストするパターン
    if (条件式1) {
        if (条件式2) {
            // 行いたい処理
        }
    }
  • &&(…かつ~)を使うパターン
    if (条件式1 && 条件式2) {
        // 行いたい処理
    }

なお、switch文の中にif文を記載することも可能です。


それと、別件ですが、1にone(1)と名前を付ける意味が分からないので、単純に数値を使うべきです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.65%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る