🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

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

Unity

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

Q&A

解決済

1回答

1391閲覧

Unity(C#):ある回数分スイッチが押されたときに反応するようにしたい

TeRa_130

総合スコア61

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

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

Unity

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

0グッド

0クリップ

投稿2021/02/16 04:20

前提・実現したいこと

Unity(C#)を使用しています。
実現したい内容 …
JキーとFキーが押された場合で異なる処理をしたいと考えています。

  •  Jキーの場合:csvファイルで読み込んだ値とJキーが押された回数が一致した場合、"Jキー"というログを表示したいです。csvファイルは[3, 3, 5, 5, 10, 10, 15]のようになっています。具体的には、Jキーを3回押したらログが表示、Jキーを3回押したらログが表示、Jキーを5回押したらログが表示...のようにしたいです。

Jキーが押されると1ずつ増えるJCounterを用意して、csvファイルで読み込んだ値の回数分Jキーが押されるとJCounterが0になるようにして、csvファイルで読み込んだ値をfor文で繰り返すことで、Jキーを3回押したらログが表示、Jキーを3回押したらログが表示、Jキーを5回押したらログが表示...となるようにしました。」

  •  Fキーが押された場合:範囲を設定したランダムな値とFキーが押された回数が一致した場合、"Fキー"というログを表示したいです。

 Fキーが押されると1ずつ増えるFCounterを用意して、範囲を設定したランダムな値の回数分Fキーが押されるとFCounterが0になるようにして、Fキーをランダム回数押したらログが表示するようにしました。」

使用しているcsvファイルの詳細は下図のとおりです。
イメージ説明イメージ説明

実行したコードとその結果

実行したコード

このようなコードを実行しました。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System.IO; 5 6public class Botton_Script : MonoBehaviour 7{ 8 // Jキーが押された場合 9 private List<string> CsvRandom = new List<string>(); 10 int i; 11 int JCounter = 0; 12 13 // Fキーが押された場合 14 int min = 2; 15 int max = 5; 16 int Ramdom; 17 int FCounter = 0; 18 19 20 void Start() 21 { 22 TextAsset csv = Resources.Load("RandomTimes") as TextAsset; 23 StringReader reader = new StringReader(csv.text); 24 while (reader.Peek() > -1) 25 { 26 string line = reader.ReadLine(); 27 string[] values = line.Split(','); 28 29 for (i = 0; i < values.Length; i++) 30 { 31 CsvRandom.Add(values[i]); 32 } 33 } 34 } 35 36 37 private void Update() 38 { 39 // Jキーが押された場合 40 if (Input.GetKeyDown(KeyCode.J)) 41 { 42 JCounter += 1; 43 Debug.Log(JCounter); 44 45 for (i = 0; i < CsvRandom.Count; i++) 46 { 47 if (Counter == int.Parse(CsvRandom[i])) 48 { 49 Debug.Log("Jキー"); 50 JCounter = 0; 51 } 52 53 } 54 } 55 56 // Fキーが押された場合 57 Random = Random.Range(min, max); 58 if (Input.GetKeyDown(KeyCode.F)) 59 { 60 FCounter += 1; 61 Debug.Log(FCounter); 62 63 if (Counter == Random) 64 { 65 Debug.Log("Fキー"); 66 FCounter = 0; 67 } 68 69 } 70 } 71}

実行した結果

上記のコードを実行した結果、
以下のようになりました。
「Jキーの場合:for文を使って[3, 3, 5, 5, 10, 10, 15]が順番に来るようにしたのですが、最初の[3]だけしか抽出できていません。」
「Fキーの場合:何回かはFキーをランダム回数押したらログが表示され、FCounterが0になるのですが、途中からFCounterが0になりません。」

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

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

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

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

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

guest

回答1

0

ベストアンサー

Jキーの判断について
JCounterがJキーが押された回数なのは分かると思います。
何回押されたらログを出すか判断する為の数字のCsvRandomの添え字はJキーが押された回数と同じになったらログを出力し、添え字を進めるべきです。
ループで判断するものではありません。

Fキーの判断について
Updateのたびに押さなくてはならない回数がランダムで選択されてしまっています。
なので以下のようなことになっているのではないでしょうか。

1回目、Random = 2、Fキー=1
2回目、Random = 5、Fキー=2
3回目、Random = 1、Fキー=3

という感じです。押すべき回数をいつ求めるかについては、ご自身で仕様を考えてください。

また、Randomという名前の変数はやめたほうがいいかと思います。
乱数を求めるRandomクラスのことなのか、乱数を入れるためのintの変数なのかがぱっと見区別がつきませんのでバグを作りこみやすくなります。

投稿2021/02/16 04:34

YAmaGNZ

総合スコア10469

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

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

TeRa_130

2021/02/16 06:08

ご回答ありがとうございます。 ・Jキー Jキーが押された場合のif分岐を下記のようにしました。それにより、csvファイルで読み込んだ値が順番に呼び出されるようになりました。 ```C# if (JCounter == int.Parse(CsvRandom[CsvCounter])) { Debug.Log("Jキー"); JCounter = 0; CsvCounter += 1; } ``` ・Fキー 「RandomTimes = Random.Range(min, max);」をStart()で確定させてから、Fキーが押された場合のif分岐を作成しました。それにより、途中からFCounterが0にならないという不具合が解消しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問