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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

1414閲覧

Unity)表示の制限をしたい

navesanta

総合スコア198

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/04/12 03:11

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

(例えば)平成は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; } } }

イメージ図
イメージ説明

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

適当なゲームオブジェクトに張り付けて、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 06:38

ganta7188

総合スコア434

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

navesanta

2019/04/12 07:38

>カウントアップの結果が元号の最大値(平成なら31)を超える場合は、 >変えようとしていた桁を0に戻します。 考え方理解しました。またコードにて具体的な例ありがとうございます。こちら参考に何とかなりそうです。ありがとうございました。これからもよろしくお願いします。
guest

0

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

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

  • if文をネストするパターン

C#

1 if (条件式1) { 2 if (条件式2) { 3 // 行いたい処理 4 } 5 }
  • &&(…かつ~)を使うパターン

C#

1 if (条件式1 && 条件式2) { 2 // 行いたい処理 3 }

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


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

投稿2019/04/12 04:27

fiveHundred

総合スコア9778

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問