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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

2回答

2866閲覧

[C#][Unity] C#スクリプト内の複数の文字検索でコードを見やすくしたい

Yuki_Unity

総合スコア129

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2018/03/08 07:41

編集2018/03/08 08:20

###実現したいこと
UnityでInputFieldを用いて、そこに書かれた文字を「ScrollView/Viewport/Content」内の項目のオブジェクトの兄弟間の上下関係を移動させ、表示順を変えています。
とりあえずコードを書いてみたものの、これから項目を増やそうとすると大変で、一つの項目を作るのに5分くらいかかってしまいます。

###コード

c#

1 //Contentオブジェクト内のゲームオブジェクト(=項目) 2 public GameObject Object001, Object002, Object003, Object004, Object005; 3 4 //InputField自体 5 public InputField InputField; 6 7 //InputFieldに書かれた文字 8 public Text InputFieldText; 9 10 private string searchString; 11 12 //InputFieldを書き終えたときに実行 13 public void InputFieldWrote() 14 { 15 searchString = InputFieldText.text; 16 17 //Object001の検索対象は"こんにちは" 18 bool koumoku00101 = searchString.Contains("こ"); 19 if(koumoku00101==true) 20 { 21 Object001.transform.SetSiblingIndex(0); 22 } 23 bool koumoku00102 = searchString.Contains("ん"); 24 if(koumoku00102==true) 25 { 26 Object001.transform.SetSiblingIndex(0); 27 } 28 bool koumoku00103 = searchString.Contains("に"); 29 if(koumoku00103==true) 30 { 31 Object001.transform.SetSiblingIndex(0); 32 } 33 bool koumoku00103 = searchString.Contains("ち"); 34 if(koumoku00103==true) 35 { 36 Object001.transform.SetSiblingIndex(0); 37 } 38 bool koumoku00103 = searchString.Contains("は"); 39 if(koumoku00103==true) 40 { 41 Object001.transform.SetSiblingIndex(0); 42 } 43 44 45 //Object002の検索対象は"こんばんは" 46 bool koumoku00201 = searchString.Contains("こ"); 47 if(koumoku00201==true) 48 { 49 Object002.transform.SetSiblingIndex(0); 50 } 51 bool koumoku00202 = searchString.Contains("ん"); 52 if(koumoku00102==true) 53 { 54 Object002.transform.SetSiblingIndex(0); 55 } 56 bool koumoku00203 = searchString.Contains("ば"); 57 if(koumoku00103==true) 58 { 59 Object002.transform.SetSiblingIndex(0); 60 } 61 bool koumoku00204 = searchString.Contains("ん"); 62 if(koumoku00104==true) 63 { 64 Object002.transform.SetSiblingIndex(0); 65 } 66 bool koumoku00205 = searchString.Contains("は"); 67 if(koumoku00105==true) 68 { 69 Object002.transform.SetSiblingIndex(0); 70 } 71 } 72 73

InputField内に書かれた文字をstring型のsearchStringに代入しています。
例えば、InputFieldに"ば"と入力すると"こんばんは"(=Object002)を最も上に表示させます。
"こん"と入力すれば"こんにちは"(=Object001)と"こんばんは"(=Object002)が最も上に表示されます。

###質問
しかし、上のやり方ですと、これから項目を作っていくときにとても面倒です。
このような物を作りたいのですが、もっとコンパクトにできないでしょうか...
また、このやり方ですとInputFieldに"こんばんは"と検索してもObject001Object002が移動してしまいます。"こ" と "ん" と "は" が対象になってしまい、関係のないオブジェクトが検索結果の対象になってしまいます。それを対象とせず、うまい具合(検索された文字を検索結果とする)にしたいのですが、そのやり方も教えてください。

どなたか回答お願いします。

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

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

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

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

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

Zuishin

2018/03/08 08:05

Object00101 Object0010 Object001 はすべて同じものなんでしょうか? 質問を見直して正確に書き直してください。
Yuki_Unity

2018/03/08 08:09

すみません。間違えてました。ご指摘ありがとうございます。
Zuishin

2018/03/08 08:12

このソースだと例えば「はんばこ」や「こんにちはばん」で Object002 が移動しますがそれも意図したものですか?
Yuki_Unity

2018/03/08 08:21

そのような検索で移動するのは意図していません。
guest

回答2

0

質問してから随分経ちますが、文字列の取得はContainsを使ったほうがいいです。

C#

1if ("こんにちは".Contains(searchString)) 2{ 3 Object001.transform.SetSiblingIndex(0); 4}

上コードでStartsWithContainsに変更しました。

StartsWithは文字列のはじめの一文字だけを取得するのに対し、
Containsは文字列全体でその文字が入ってるか取得します。
一文字でも邪魔がはいると実行されません(例は下)。

C#

1if ("こんにちは".Contains("こんにちは!!\(^o^)/")) 2{ 3 //実行されない 4}

Zuishinさん、あの頃は助かりました。
ありがとうございました!

投稿2018/09/24 07:44

編集2018/09/24 07:45
Yuki_Unity

総合スコア129

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

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

0

ベストアンサー

多分こういうことですかね。

C#

1if ("こんにちは".StartsWith(searchString)) 2{ 3 Object001.transform.SetSiblingIndex(0); 4}

ざっくりとした条件しか書いてないので合ってるかどうかは知りません。

###追記
Dictionary とループを使った方法

C#

1var dictionary = new Dictionary<string, GameObject> 2{ 3 { "こんにちは", Object001 }, 4 { "こんばんは", Object002 } 5}; 6var query = dictionary 7 .Where(a => a.Key.StartsWith(searchString)) 8 .Select(a => a.Value); 9foreach (var item in query) 10{ 11 item.transform.SetSiblingIndex(0); 12}

投稿2018/03/08 08:21

編集2018/03/08 08:59
Zuishin

総合スコア28656

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

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

Zuishin

2018/03/08 08:23

もしこれでいいなら私なら Dictionary<string, GameObject> を作って回します。
Yuki_Unity

2018/03/08 08:37

なるほど! StartsWith()なんてのがあるんですね! 有難うございます!
Yuki_Unity

2018/03/08 08:51

すみません。。 回す、と言うのは具体的にはどういうことなのでしょうか
Zuishin

2018/03/08 08:59

ループを使うという意味で書きました。 具体的な方法を追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問