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

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

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

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

Unity

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

Q&A

解決済

2回答

1095閲覧

string型の等価比較がうまくいかない原因について

ATEBO

総合スコア2

C#

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

Unity

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

0グッド

0クリップ

投稿2023/03/29 01:12

編集2023/03/29 05:02

デバッガで変数textにstring型の"hoge"が入っているが、falseになっている様子
イメージ説明

  • string型の変数の等価条件がTrueにならない理由が知りたい

前提

UnityでinputFieldに入力した値が意図した値になっておらず、等価比較をするとFalseになっておりました。Falseになってしまう理由を教えていただきたいです。
inputFieldには"hoge"を入力しております。

該当のソースコード

csharp

1using TMPro; 2using UnityEngine; 3 4namespace InputField 5{ 6 public class Text : MonoBehaviour 7 { 8 [SerializeField] private GameObject inputFieldGameObject; 9 private TextMeshProUGUI inputField; 10 11 private void Start() 12 { 13 // コード内でのinputFieldの設定 14 inputField = inputFieldGameObject.GetComponent<TextMeshProUGUI>(); 15 } 16 17 public void OnClick() 18 { 19 string text = inputField.text.Trim(); 20 21 if (text == "hoge") 22 { 23 Debug.Log("おなじ"); 24 } 25 else 26 { 27 Debug.Log("ちがう"); 28 } 29 30 if (text.Equals("hoge")) 31 { 32 Debug.Log("おなじ"); 33 } 34 else 35 { 36 Debug.Log("だからちがうんだって!"); 37 } 38 } 39 } 40}

試したこと

余計な空白、改行は無いことを確認しております。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2023/03/29 01:24 編集

このコメントは回答欄に移しました
guest

回答2

0

ベストアンサー

c#

1using TMPro; 2using UnityEngine; 3 4 5public class Test : MonoBehaviour 6{ 7 [SerializeField] private GameObject inputFieldGameObject; 8 private TextMeshProUGUI inputField; 9 10 [SerializeField] 11 private TMP_InputField inp; 12 13 private void Start() 14 { 15 // コード内でのinputFieldの設定 16 inputField = inputFieldGameObject.GetComponent<TextMeshProUGUI>(); 17 18 } 19 20 public void OnClick() 21 { 22 string text = inp.text.Trim(); 23 24 if (text == "hoge") 25 { 26 Debug.Log("おなじ"); 27 } 28 else 29 { 30 Debug.Log("ちがう"); 31 } 32 33 if (text.Equals("hoge")) 34 { 35 Debug.Log("おなじ"); 36 } 37 else 38 { 39 Debug.Log("だからちがうんだって!"); 40 } 41 } 42} 43

試しにTMP_InputField でやってみてください、多分TextMeshProUGUIを直で取ると勝手に空白が入ります 動作確認済み

投稿2023/03/29 06:05

UnitySoldier

総合スコア204

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

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

UnitySoldier

2023/03/29 06:10

ATEBOさんの言ってる現象もこちらで再現確認が取れてます、忙しいから後でもうちょっと調べてみるつもり
UnitySoldier

2023/03/29 06:21

問題のコードで試しにデバッグしてUTF8コードを確認したらU+68U+6FU+67U+65U+E2808Bが検出されました E2808Bはゼロ幅spaceですね、これは文字コード見ないとわからないやつだ
ATEBO

2023/03/29 06:21

>UnitySoldier様 コメントありがとうございます。 同じ現象であるとのこと、承知しました。 やはりUnity側の問題ですかね... 私も調査しておりますが、原因がわかりましたら共有いただけると幸いです。
UnitySoldier

2023/03/29 06:24

あっ同時コメになってて草 まあ原因はTextMeshPro Inputfieldの使い方が間違ってることですね UnityのInputfieldの値はInputfieldから参照するようにするのが筋です でもゼロ幅space含めるのは酷い仕様だと思います。
ATEBO

2023/03/29 06:42

めちゃめちゃ納得しました! 素人質問で恐縮ですが、私はUnity2021を使っておりまして、InputFieldは"Input Field - TextMeshPro"がデフォルトのようです。 これではなく、プレーン?な"Input Field"を使ったほうが良いと解釈して良いですか?
UnitySoldier

2023/03/29 06:48

あーそんなことはないです、どちらも作りが一緒なので勝手に略してしまいましたごめんなさい。 TMP_InputFieldを使うのが今のベストプラクティスです。
ATEBO

2023/03/29 06:52

承知しました! 共有いただいたサンプルを試し、私でも解決できていることを確認しました! 大変助かりました!
guest

0

デバッガは使えますよね。であれば、

string text = inputField.text.Trim();

にブレークポイントを設定し、止まったらステップ実行で一行進めて変数 text に何が代入されているか、その後さらステップ実行していってどうなるか調べてみてはいかがですか?


【追記】

下のコメント欄の 2023/03/29 13:28 の私のコメントで、

Visual Studio 2022 のデバッガでどう見えるかを回答欄に追記しておきます。Windows Forms アプリの場合ですので、質問者さんの Unity アプリの場合とは違うかもしれませんが。

・・・と書いた件です。

(1) アプリをVisual Studio 2022 でデバッグ実行し、テキストボックスに hoge (hoge の前後に 3 文字空白)と入力してブレークポイントで止める。

TextBox の Text プロパティは入力した通りの文字列となっている:

イメージ説明

変数 text はこの時点ではまだ null:

イメージ説明

(2) ステップ実行で一行進める。変数 text は期待通り "hoge" となる:

イメージ説明

(3) ステップ実行でさらに進める。if 文の条件の text == "hoge" は true になるので、以下の行に進む:

イメージ説明

質問者さんはここで else の方に進んだと言ってますか? それは C# の文法的にあり得ないです。

投稿2023/03/29 01:24

編集2023/03/29 04:52
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ATEBO

2023/03/29 02:09

ご回答ありがとうございます。 textには"hoge"が入力されており、型もstring型でした。 ですが、分岐はすべてFalseになってしまいます...
ATEBO

2023/03/29 02:15

申し訳ありません、textには、nullが代入されおりました。 今のところ原因がわかりませんが、調べてみます。
ATEBO

2023/03/29 02:32

textに"hoge"が代入されるようにしましたが、やはりFalseになってしまいます。 他に考えられる原因があれば、よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2023/03/29 02:37 編集

string text = inputField.text.Trim(); に代えて、 string text = "hoge"; としてデバッガでステップ実行しても text == "hoge" が false になりますか?
ATEBO

2023/03/29 02:48

その場合はtrueになりました。 文字列を直接代入するとtrueになり、inputFieldを経由するとfalseになります。 よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2023/03/29 02:55

ということは、上の質問者さんのコメント > textに"hoge"が代入されるようにしましたが、 ・・・が何かの勘違いで text には "hoge" は代入されてないということしかあり得ません。タイミングの問題で、 OnClick メソッドが動くときには、まだ inputField.text.Trim() でユーザー入力が取得できないということではなかろうかと思います。
ATEBO

2023/03/29 03:12

最初はそう思ったのですが、間違いなくtextに”hoge”が代入されております。。。
ATEBO

2023/03/29 03:14

inputFieldにTextMeshProコンポーネントを使用しているのですが、何か関係は考えられるでしょうか?
YAmaGNZ

2023/03/29 03:36

>間違いなくtextに”hoge”が代入されております どうやって確認されているのでしょうか?
退会済みユーザー

退会済みユーザー

2023/03/29 03:49 編集

> 間違いなくtextに”hoge”が代入されております C# の文法を超えてUnity 特別の何かがある(「間違いなくtextに”hoge”が代入されて」いるのに text == "hoge" が false になる)ということでしょうか。そうだとすると自分には分かりません。お役に立てずすみませんが、他の方の回答をお待ちください。
ATEBO

2023/03/29 04:01

デバッガでも確認できましたが、以下のようにコンソールを出して確認できています。 ``` string text = inputField.text.Trim(); Debug.Log(text); string text2 = "hoge"; Debug.Log(text2); ``` どちらもstring型の"hoge"が出力されております。 よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2023/03/29 04:18

> デバッガでも確認できましたが、以下のようにコンソールを出して確認できています。 Visual Studio のデバッガならマウスのカーソルを当てれば変数が確認できると思います。質問者さんの使っているデバッガでそれができるのか分かりませんが、可能であれば、その方が簡単かつ確実に分かるはずなので、そうしてみては?
ATEBO

2023/03/29 04:24

おそらくSurferOnWww様のおっしゃっている、Visual Studioデバッガを使用していると思います。 textの変数にカーソルを当てれば、"hoge"が代入されていることを確認しております。 画像が添付出来ず、申し訳ないです。
ATEBO

2023/03/29 04:27

デバッガの画像を添付できました。 恐れ入りますが、ご確認いただけると幸いです。
退会済みユーザー

退会済みユーザー

2023/03/29 04:28

Visual Studio 2022 のデバッガでどう見えるかを回答欄に追記しておきます。Windows Forms アプリの場合ですので、質問者さんの Unity アプリの場合とは違うかもしれませんが。
ATEBO

2023/03/29 04:34

重ねながらデバッガの画像を添付しましたので、ご確認をよろしくお願いいたします。
ozwk

2023/03/29 04:48

Debug.Log("ちがう"); の方にブレークポイントを設定して そのときのtextを見てみてください。
ATEBO

2023/03/29 05:04

>SurferOnWww様 手順の説明、ありがとうございます。 SurferOnWww様はTrueになっていますね... ますます私がfalseになっていしまう原因が分からなくなってしまいました。 >ozwk様 ご指摘の通り、ブレークポイントの場所を変更して、textを見てみました。 添付画像にあるとおり、”hoge”が代入されているのにも関わらず、Falseになってしまいます。
退会済みユーザー

退会済みユーザー

2023/03/29 05:49

私が回答に追記した通りにブレークポイントを設定して変数を調べてステップ実行していっても同じ結果(text == "hoge" は false)なのでしょうか? とすると、上にも書きましたけど、Unity 特別の何かがある(「間違いなくtextに”hoge”が代入されて」いるのに text == "hoge" が false になる)ということなんでしょうかね・・・ 
ATEBO

2023/03/29 06:00

>SurferOnWww様 おっしゃる通り、デバッガでは同じ結果になります。 Unityの仕様なのかもしれません。 例えば参照元が異なる、キャッシュが悪さをしている等、いくつか考えられますが、対処方法が分からずです。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問