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

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

新規登録して質問してみよう
ただいま回答率
85.35%
String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

Unity3D

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

button

HTMLで用いる<button>タグです。

Unity

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1927閲覧

コルーチン内でstring配列から一文字ずつ取り出し、順番に処理したい

torisva

総合スコア23

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

Unity3D

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

button

HTMLで用いる<button>タグです。

Unity

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/03/21 16:24

編集2020/03/22 03:06

文字列から一文字、一文字に同時ではなく順番に処理をしたい

☆前提
ソースコードのコルーチン内、while文の部分が処理になります。
SetTextには仮として"ありがとう"と打ち込んであります(状況により変わります)
unityのUI、Buttonを使用しています(OnClick()はそのためのものです)
このスクリプトはButtonにアタッチしています

☆このスクリプトで望む動作
Debug.Log("あ")
Debug.Log("と")
によりコンソールに、「あ」と「と」が表示され、Debug.Log("ぎ")はスルーされるようにしたい
なおかつ「あ」と「と」が表示される間にはfloat Speedのタイムラグが欲しい

☆このスクリプトの制限
・SetTextの文字列は全部で何文字になるかは不定、変動する
・while内のif文も50音すべてに対応させ、その他、数字なども処理に追加する予定
・「あ」「と」「ぎ」、文字列「ありがとう」の場合、「ぎ」は存在しないため処理しない
・「り、が、う」など処理に存在しない文字の場合、処理をしない、ラグも発生しない(「あ」の処理後speedの間をおいて「と」の処理)

発生している問題・エラーメッセージ

NullReferenceException: Object reference not set to an instance of an object (wrapper stelemref) object:stelemref (object,intptr,object)

該当のソースコード

C#

1 2 [SerializeField] 3 Text SetText; //処理したい文字列 4 [SerializeField] 5 float Speed; //次の処理までのラグ用 6 7 string STR; 8 string[] arr; 9 int i; 10 int n; 11 12 public void OnClick() //ボタンをクリックしたときに処理 13 { 14 n = 0; //リセット処理 15 i = 0; //リセット処理 16 STR = SetText.text; //STRにSetTextの文字列を代入 17 18 //arr[]string配列にSTRstringから一文字ずつ格納したい 19 //格納後コルーチン内で一文字ずつ処理したい 20 21 22 foreach (char c in STR) //テキストに書かれた文章を一文字ずつ分割して配列にする 23 { 24 //arr[i] = STR[i].ToString; //??? 25 arr[i] = STR.Substring(i); //一文字ずつ格納? 26 i ++; 27 } 28 //Debug.Log(arr); 29 StartCoroutine(Cor());//コルーチンスタート 30 } 31 32 private IEnumerator Cor() //コルーチン 33 { 34 int messageCount = 0; //リセット処理 35 while (STR.Length > messageCount) //テキストに書かれた文字数を超えるまでループ 36 { 37 if(arr[n] == "あ") 38 { 39 Debug.Log("あ"); 40 } 41 if (arr[n] == "と") 42 { 43 Debug.Log("と"); 44 } 45 if (arr[n] == "ぎ") 46 { 47 Debug.Log("ぎ"); 48 } 49 n++; 50 messageCount++; //ループ処理用 51 yield return new WaitForSeconds(Speed); //ループ間のラグ 52 } 53 54 } 55

###~~ 試したこと~~

~~```
//途中でコメントアウトしてますが
arr[i] = STR[i] //としてSTRから一文字ずつ取り出せるかな?と思ったのですが、
//charをstringに変換できませんと表示され
arr[i] = STR[i].ToString//としてstringにしようとしましたが、非デリゲート型stringに変換できないと
arr[i] = STR(i) //これも駄目で、string型から指定の文字数の文字を取り出す方法がわかりませんでした
arr[i] = STR.SubString(i)//これもできているのかわかっていません
//Debug.Log(arr)で確認しようとしましたが、コンソールには上記のエラーしか出ません

### 読み飛ばしていただいても構わない部分 それとありがとうございます 質問を閲覧いただきありがとうございます。 私は初めて配列を使ってスクリプトを組んだのですが、よくわからないところが多くて、 どうにもならず、質問させていただきました。 勝手ながらご教授お願いいたします。 配列を使わない方法などがあればそちらでも構いません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

文字列(文字が複数あるもの)がstring,文字(1文字だけ)がcharです。
つまり、str[i] はcharを返します。
ですが、strそのものが配列なので、無理に分割する必要はありません

もしstringに入れ直したいならこう書くといいと思います

arr[i] = STR[i].ToString();

コルーチン部分、あとぎ以外の文字でもウエイトが入っているので、
それ以外の文字では入らないようにしましょう

書き換えるならこんな感じですかね

private IEnumerator Cor(string str, string debug, floot speed ){ foreach (var c in str){ if (debug.Any(n => n == c)){ Debug.Log(c); yield return new WaitForSeconds(speed); } } } StartCoroutine(Cor(SetText.text, "あとぎ", 1.0f));

追記

1.Linqが必要です
2.intはミスです、cはcharです
3.n => n == c はラムダ式というもので、bool anonymous(char n){return n == c;} のような意味です
4.ラムダ式を知らないゆえの勘違いだと思うので、それは調べてください
5.anyは、debugの中にある文字のどれか一つとcが一致するかを返す関数です
例はcが"あとぎ"のどれかの文字ならtrueになります
このソースはただの参考ですから、あなたの都合に合わせて書き換えてください

投稿2020/03/21 19:59

編集2020/03/22 05:19
izmktr

総合スコア2856

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

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

torisva

2020/03/22 02:58

こちらの環境ではそのスクリプトを試すことができないので どういう挙動のスクリプトか予想をしつつ、いろいろ聞きたいのですが ``` ①debug.Any string型にAnyの定義がない。とのことなので調べましたがusing System.Linqを記述してますか? Linqについての知識はないため、推測ですが ②foreach (var c int str){} おそらく(var c in str)だと思いますが、var c は char型ってことでよろしいでしょうか? ③if(debug.Any(n => n == c)){} これはint == charが成立した場合に処理をするということですよね intとcharが同一であるというのはどういう状態なんでしょうか? intが1でcharも1だった場合同一?でもcharに代入されるのはひらがななんですが…わかりませんでした ④省略されたのだと思うのですが if文のあとはn++を記述するんですよね、記述しなくてもいいのでしょうか? でもn++を記述するとcと同一ではなくなるから処理されない?? このnは何のためのnでしょうか? ⑤最後に重要なことで、質問にも書きましたが  処理する文字は「あ」「と」「ぎ」だけではなく50音に対応、その他、数字も対象に処理する予定です StartCoroutine(Cor())のCorの引数に"あとぎ"と書かれていますが これでは対応できないのではないでしょうか? debug.Anyの部分がわからないので、断定はできませんが… ``` 文字ごとに異なる処理をしたいため if(arr[n] == "あ") { Debug.Log("あ"); } if (arr[n] == "と") { Debug.Log("と"); } if (arr[n] == "ぎ") { Debug.Log("ぎ"); } と分けて記述しています なぜ「あ」と「と」と「ぎ」を代表例にしたかというと 「ありがとう」という文の最初の文字「あ」 「ありがとう」の間を飛ばした中間の文字「と」(←「が」でも「う」でもいい) 「ありがとう」に含まれない文字「ぎ」(←なんでもよかった) というデバッグ用に選んだ文字です 「あとぎ」が含まれていたら処理するわけではないのです。 長くなり申し訳ありません。 ToString()については()の記述忘れだと気づけたのでありがたいです そして質問には書きませんでしたが、できればラグをなくしたいというだけで 基本的に処理に対応した文字しか入力されないため 処理に対応していない文字を飛ばす際にラグがあっても大して困らないので その点はあまり気になさらずに回答していただけると助かります (要約、ラグは処理しない文字にもあってもいい) 回答お待ちしております、 そして質問の閲覧、回答ありがとうございます。
torisva

2020/03/22 21:18

追記への返信 しっかり望んだとおり動作しました、ありがとうございます。 ラムダ式についても調べました ラムダ式は短い関数を、関数を作らずに直接書き込むことで省略する機能と解釈しました ここからは本来の質問とは、ずれてしまうので回答してくださらなくても構わない部分ですが n => n == c の記述の n は結局何なんでしょうか? まとめメモ.................................................................................................. private IE...以下略(string str, string debug, float speed){} strにはもともとの文章 debugには"あとぎ" speedは表示速度 コルーチン処理内 foreach(var c in str){} で c には str から一文字ずつ代入されて、foreach内の処理が実行される foreach内の処理 if(debug.Any(n => n == c)){} でdebug内に c が存在した場合、if内の処理が実行される n は int型変数と定義済み。 ............................................................................................................................. Any()が一致するかどうかの判定をするなら debug.Any(c)と記述してもいい気はします(もちろんこれでは動作しないであろうことは予想できますが) なぜn => n == cという記述になるんでしょうか?
izmktr

2020/03/22 22:04

forでiを使うようなもので、伝統的にnを使う事が多いだけです 別にa => a == cでもmoji => moji == c でもいいです Any(c)と書きたくてもそんな関数がなく、ラムダ式しか引数に渡せないのでラムダ式を渡しています
torisva

2020/03/26 21:01

お返事遅れて申し訳ないです これはそういうものとして覚えておくしかないみたいですね ラムダ式について私の理解が足りてないみたいなので、 今はそういうことで理解しておきます ここまでありがとうございました、すごく助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問