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

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

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

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

Unity

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

Q&A

解決済

5回答

2006閲覧

Unity : switch文の1部分だけ条件があっているのにdefaultに向かってしまう

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity

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

0グッド

0クリップ

投稿2018/10/11 02:40

前提

現在Unityにて2Dノベルアクションゲームを作成中の初学者です。
外部から読み込んだテキストファイルからList<string>型の配列に1行ずつ格納し、行頭に記載したフラグを用いてタップ待ちや画像の切り替え、テキストの表示などを制御したいと思っております。

今回switch文を使ったフラグの判定の際に、1ヵ所だけcaseを通り越してdefaultに向かってしまい、デバッグを遂行することができなかったため、皆さんの知恵をお借りしたいと思い質問させていただきます。

問題の箇所

その他機能実装していますが、問題が起こっている箇所は以下のコードです。

csharp

1using UnityEngine; 2using System.Collections.Generic; 3using System.Linq; 4 5public class TalkBase : MonoBehaviour 6{ 7 // アタッチしているテキストアセットは後述します 8 [SerializeField] private TextAsset textAsset; 9 private List<string> textList; 10 11 private void Start() 12 { 13 textList = LoadText(); 14 15 foreach(string text in textList) 16 { 17 JudgeText(text); 18 } 19 } 20 21 private List<string> LoadText() 22 { 23 List<string> textList = textAsset.text.Split('\n').ToList(); 24 return textList; 25 } 26 27 private void JudgeText(string text) 28 { 29 switch(text.Split('-')[0]) 30 { 31 case "tk": // キャラクターのセリフ 32 // 処理 33 break; 34 35 case "ds": // 説明等平文 36 // 処理 37 break; 38 39 case "bg": // 背景の変更 40 // 処理 41 break; 42 43 case "bd": // キャラクターの身体画像変更 44 // 処理 45 break; 46 47 case "fc": // キャラクターの表情画像変更 48 // 処理 49 break; 50 51 case "se": // SEの挿入 52 // 処理 53 break; 54 55 case "tp": // タップ待ち 56 // 処理 57 break; 58 59 case "end": // メッセージモード終了 60 // 処理 61 break; 62 63 default: 64 Debug.Log(string.Format("記載方法エラー : {0}", text)); 65 break; 66 } 67 } 68}

アタッチしたテキストアセットは以下のものです。

PlaneText

1tk-chara1-hogehoge 2tp 3se-kasakasa 4ds-(カサカサ) 5tp 6bg-shinbunshi 7ds-hugahuga 8ds-hogehuga 9tp 10end

上記の2つを動かすことで、UnityのDebug.Logに以下の出力がされます。

PlaneText

1記載方法エラー : tp 2UnityEngine.Debug:Log(Object) 3TalkBase:JudgeText(String) (at Assets/Scripts/TalkBase.cs:63) 4TalkBase:Start() (at Assets/Scripts/TalkBase.cs:16) 5 6記載方法エラー : tp 7UnityEngine.Debug:Log(Object) 8TalkBase:JudgeText(String) (at Assets/Scripts/TalkBase.cs:63) 9TalkBase:Start() (at Assets/Scripts/TalkBase.cs:16) 10 11記載方法エラー : tp 12UnityEngine.Debug:Log(Object) 13TalkBase:JudgeText(String) (at Assets/Scripts/TalkBase.cs:63) 14TalkBase:Start() (at Assets/Scripts/TalkBase.cs:16)

試したこと

Splitでハイフンを指定しているので、ハイフンが含まれていない「tp」と「end」が正常な処理を行っていないのではないかと思ったのですが、「tp」はダメですが「end」は通るのが不明でした。

Splitの処理の再認識のために以下のコードを実行しております。

csharp

1Debug.Log("tp".Split('-')[0]); 2Debug.Log("end".Split('-')[0]);

こちらは正常にDebug.Logに出力されているので、Splitの挙動は誤っていないです。

また、Switch文の「// 処理」の部分に全て以下のコードを実行しました。

charp

1Debug.Log(text.Split('-')[0]);

こちらを実行したところ、tp以外の全てのケースは出力されたのですが、tpのみdefaultに記載したDebug.Logが実行されてしまうことからswitch文の中身にそもそも通ってないことがわかりました。

アタッチしたテキストアセットに不備があると思いendとtpの後ろにスペースがついていないかなども確認しましたが、スペースなどの問題はなかったです。

自分の考えうるケースが八方塞がりになってしまったため、こちらにて質問させていただきます。
どうかよろしくお願い致します。

環境

  • Windows 10 64bit
  • Unity 2018.2.11f1 Personal

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

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

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

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

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

fuzzball

2018/10/11 02:54

text.Split('-')[0]の文字列長を調べて下さい。あと、"tp-"だとどうなるか、"hoge"だとどうなるか。
sakura_hana

2018/10/11 02:56

「Debug.Log(text.Split('-')[0].Length);」を試してみてください。文字数が出て来ますので2より大きかったら見えない文字(例えば改行コード「\r」)が付いてます。
guest

回答5

0

ベストアンサー

提示された症状から想像すると、恐らく PlaneText というテキストファイルの改行コードが CR+LF なのではないかと推察します。
プログラムで "\n"(LF) で分離しているので

・「tk-chara1-hogehoge(CR)(LF)」な行は「tk-chara1-hogehoge(CR)」としてListに入っている
・「tp(CR)(LF)」な行は「tp(CR)」としてListに入っている
・(以下略)

となっており、'-'で分割した1番目を上の例で考えると

・「tk-chara1-hogehoge(CR)」の1番目は「tk」なので"tk"のSwitchに合致する
・「tp(CR)」の1番目は「tp(CR)」なので"tp"のSwitchには合致しない

という事ではないでしょうか。
なので1度テキストファイルの改行コードを確認される事をお勧めします。

[対策案]
1.テキストファイルの改行コードをCR+LFではなくLFに変更する
2.もしくはプログラムでtrimを使う等して余分な空白や改行をカットした後に比較する

投稿2018/10/11 03:15

HiroshiWatanabe

総合スコア2160

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

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

退会済みユーザー

退会済みユーザー

2018/10/11 03:29

皆さんに指摘されている通り、改行コードが問題でした。 テキストファイルの読み込みを「textAsset.text.Split('\n').ToList()」から del = {"\r\n"} textAsset.text.Split(del, StringSplitOptions.None).ToList() に変更することで無事解決致しました。 多くの方にその他の方法も指摘されているので、そちらも順次試してみたいと思います。 とてもわかりやすく改行コードについてご教授いただけたので、ベストアンサーとさせていただきます。 皆さんご回答ありがとうございました!
guest

0

改行が付いているとかは大丈夫でしょうか?

投稿2018/10/11 02:50

otn

総合スコア84555

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

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

退会済みユーザー

退会済みユーザー

2018/10/11 03:06

回答ありがとうございます。 用意したテキストファイルは、endの行だけ改行が含まれていないので、その可能性は高いかと思われます。 改行コードに関して今色々と調べておりますので、確認が取れ次第ご報告させていただきます!
guest

0

C#

1List<string> textList = textAsset.text.Split('\n').ToList();

で\nで分割してますが、テキストファイルの改行を\r\nでやっており、\rが残ったりしてませんか?

投稿2018/10/11 02:49

rururu3

総合スコア5545

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

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

退会済みユーザー

退会済みユーザー

2018/10/11 03:07

回答ありがとうございます。 用意したテキストファイルは、endの行だけ改行が含まれていないので、その可能性は高いかと思われます。 改行コードに関して今色々と調べておりますので、確認が取れ次第ご報告させていただきます!
guest

0

C#

1 private void test() 2 { 3 string textAsset = "tk-chara1-hogehoge\ntp\nse-kasakasa\nds-(カサカサ)\ntp\nbg-shinbunshi\nds-hugahuga\nds-hogehuga\ntp\nend\n"; 4 List<string> textList = textAsset.Split('\n').ToList(); 5 6 foreach (string text in textList) 7 { 8 Debug.WriteLine(string.Format("test : {0}", text.Split('-')[0])); 9 switch (text.Split('-')[0]) 10 { 11 case "tk": // キャラクターのセリフ 12 // 処理 13 break; 14 15 case "ds": // 説明等平文 16 // 処理 17 break; 18 19 case "bg": // 背景の変更 20 // 処理 21 break; 22 23 case "bd": // キャラクターの身体画像変更 24 // 処理 25 break; 26 27 case "fc": // キャラクターの表情画像変更 28 // 処理 29 break; 30 31 case "se": // SEの挿入 32 // 処理 33 break; 34 35 case "tp": // タップ待ち 36 // 処理 37 break; 38 39 case "end": // メッセージモード終了 40 // 処理 41 break; 42 43 default: 44 Debug.WriteLine(string.Format("記載方法エラー : {0}", text)); 45 break; 46 } 47 } 48 }
test : tk test : tp test : se test : ds test : tp test : bg test : ds test : ds test : tp test : end test : 記載方法エラー : ←こちらは無視してください

一応、提供されてるテキストでは無事通っていました。
あまり役に立たない返答になりますが、念のためtrimとか掛けてみたらどうでしょうか?

投稿2018/10/11 03:02

yeondev

総合スコア198

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

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

退会済みユーザー

退会済みユーザー

2018/10/11 03:08 編集

回答ありがとうございます。 trimは使ったことがないので、確認して試してみてからご報告したいと思います!
guest

0

Debug.Log(string.Format("記載方法エラー : <{0}>", text.Split('-')[0]));
としてみよう。後ろにスペース入ってたり

投稿2018/10/11 02:49

y_waiwai

総合スコア87774

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

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

退会済みユーザー

退会済みユーザー

2018/10/11 02:58

Debug.Logを書き換えてみましたが、出力結果に変化はありませんでした。 本文にも記載があるように、後ろのスペースは確認していますが見つかりませんでした。
y_waiwai

2018/10/11 03:02

記載方法エラー : <tp> となってますか?
退会済みユーザー

退会済みユーザー

2018/10/11 03:15

申し訳ありません、大なり小なりで囲まれていたのに気付きませんでした…。 Debug.Logの出力結果は以下のものになりました。 記載方法エラー : <tp> UnityEngine.Debug:Log(Object) TalkTest:JudgeText(String) (at Assets/Scripts/TalkTest.cs:64) TalkTest:Start() (at Assets/Scripts/TalkTest.cs:17) ただUnity上ではこちらの表記にはなるのですが、ブラウザ上のテキストボックスに貼り付けた際には 記載方法エラー : <tp > UnityEngine.Debug:Log(Object) TalkTest:JudgeText(String) (at Assets/Scripts/TalkTest.cs:64) TalkTest:Start() (at Assets/Scripts/TalkTest.cs:17) 上記のように大なりが1つ下にずれてしまいます。
y_waiwai

2018/10/11 03:18

改行コードが含まれてますやん
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問