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

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

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

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

Unity

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

Q&A

解決済

3回答

526閲覧

テキストファイルを読み込みデバッグに表示したい

takuson

総合スコア36

C#

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

Unity

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

0グッド

1クリップ

投稿2019/05/14 04:53

編集2019/05/14 06:53

前提・実現したいこと

unityにてクイズゲームを作成しています。その過程において問題文や選択肢などをテキストファイルで用意してそれを読み込もうと考えました。問題の出題順をランダムにしたいなどもあり2次元配列にそれぞれを入れようと調べたところちょうどそれっぽいプログラムを公開しているサイトがあり、それを使おうとしました。
利用したサイト:https://qiita.com/Eureka/items/716f4f52b4106419dbec

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

上記のプログラムを実行したところうまくテキストファイルの読み込みができていないようでした。特にエラーが出るわけでもありません。これを上記のサイトの出力結果にしたいです。

該当のソースコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;

public class QuizManager : MonoBehaviour
{
public string[] textMessage; //テキストの加工前の一行を入れる変数
public string[,] textWords; //テキストの複数列を入れる2次元配列

private int rowLength; //テキスト内の行数を取得する変数 private int columnLength; //テキスト内の列数を取得する変数 private void Start() { TextAsset textasset = Resources.Load("joukyu") as TextAsset; //Resourcesフォルダから対象テキストを取得 string TextLines = textasset.text; //テキスト全体をstring型で入れる変数を用意して入れる //Splitで一行づつを代入した1次配列を作成 textMessage = TextLines.Split('\n'); //行数と列数を取得 rowLength = textMessage.Length; columnLength = textMessage[0].Split(',').Length; //2次配列を定義 textWords = new string[rowLength, columnLength]; for (int i = 0; i < rowLength; i++) { string[] tempWords = textMessage[i].Split(','); //textMessageをカンマごとに分けたものを一時的にtempWordsに代入 for (int j = 0; j < columnLength; j++) { textWords[i, j] = tempWords[j]; //2次配列textWordsにカンマごとに分けたtempWordsを代入していく Debug.Log(textWords[i, j]); } } }

}

・テキスト内容
ID Name Message
1 やすし こんにちは!
2 たけし はい、こんにちは!
3 やすし あなたはピチョンさんですか?
4 たけし いいえ、私はピチョンではありません、たけしです。

※実際のファイルでは空白をTabできっています。

試したこと

デバッグログにて配列の長さを調べたところ、行と列ともに1でした。

補足情報(FW/ツールのバージョンなど)

unityバージョン:2017.4.2f2
Visual Studio 2017

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

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

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

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

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

sakura_hana

2019/05/14 05:19

一応テキストファイルの中身も記載してください。(改行コードの関係で「\n」だと分割出来ない、カンマ以外で区切られていて分割出来ないなどの可能性があります) また、行・列ともに1でもDebug.Log(textWords[i, j]);の表示は可能かと思いますが、これはどう表示されていますか?
takuson

2019/05/14 06:46

テキストの中身を加えました。 Debug.Log(textWords[i, j])はログ自体は表示されるのですが、空白になっています。
sakura_hana

2019/05/14 07:09

Debug.Log(TextLines); を行なって、そもそもちゃんとファイルの中身が取れているのか確認してみてください(別の空っぽのファイル見てたとかないでしょうか)。 (ちなみに区切りがTabだったらSplit(',')では区切れないですね……)
takuson

2019/05/15 03:35

TextLinesを実行した結果は空白でした。また、ファイル名を適当なものに変えたところ「NullReferenceException: Object reference not set to an instance of an object QuizManager.Start () (at Assets/QuizManager.cs:18) 」というエラーが出ました。 Splitの件は修正しました。
sakura_hana

2019/05/15 03:51 編集

空白が返るということは「joukyuというファイルはあるが、その中身が空 または textasset.textに該当するデータが無い(他のデータは存在しているかもしれないがテキストデータが無い)」ということだと思います。(もし「指定の名前のファイルが無い」場合は例示のNullReferenceExceptionエラーが出ます) (k.matsudaさんの回答のスクリプトが動かないということは「該当のファイルがTextAsset扱いになっていない」可能性が高いです) 既存ファイルは削除、もう一度テキストファイルを作り直し、再インポート等を試してみてください。
takuson

2019/05/15 04:15

再インポートしてみましたが結果は同じでした。 因みにテキストファイルを作成する際、秀丸で作成しているのですが関係ありますか?
sakura_hana

2019/05/15 04:22

秀丸で作成したものでも拡張子が合っていれば問題無いと思います。(対応ファイルは以下参照) https://docs.unity3d.com/ja/current/Manual/class-TextAsset.html (もし文字コードが合わない場合でも、文字化けして出て来る筈なので空白ってことはないかと) 該当ファイルをプロジェクトタブ上で選択した時、インスペクターの状態は上記リンク先ページ内の画像のようになっていますか?(インスペクターから中身が見えますか?) あと、あまり関係無いかもですが Debug.Log(TextLines.Length); とすると何が返りますか?(多分「0」だとは思いますが)
guest

回答3

0

ベストアンサー

割と単純な理由で、日本語文字列などを扱いたい場合は
テキストファイルの文字コードをUTF-8にしてください。(メモ帳とかでもできます)

テキストファイルの文字コードを変えるだけで動くと思います。

#追記
ざっくりいうと、文字コードが違うので文字化けを起こす感じのイメージで良いかと思います。

Unity側はUTF-8で日本語文字を扱っているところに対して、ANSIなど違う形式の文字コードで日本語をぶちこむと文字コードの違いによって文字化けを起こしてうまく読み込めなくなるということらしいです。

なので、日本語を使わなければ文字コードがANSI(メモ帳のデフォルト)とかの文字コードでもちゃんと動きます。これをUTF-8以外のANSIとかの文字コードで保存して試してみると普通に読み込めるはずです。

cs

11 Yasushi Hello 22 Takeshi Hello, Yasushi. 33 Yasushi Are you PICHON? 44 Takeshi No, I'm Takeshi.

スクリプト側でエンコードをかけて文字コードを修正するという手もあります。
スクリプトファイルのutf-8変換

投稿2019/05/15 04:13

編集2019/05/15 04:37
hogefugapiyo

総合スコア3302

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

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

takuson

2019/05/15 04:21

できました。 ありがとうございます。 あと、今後のために理由をご存知でしたら教えてください。
hogefugapiyo

2019/05/15 04:38

追記しました。文字コードの差がおそらくの原因かと思います。
guest

0

Qiitaのコードをそのまま丸写しでよかったんでは?

c#

1textasset = Resources.Load("Test", typeof(TextAsset) )as TextAsset; //Resourcesフォルダから対象テキストを取得

投稿2019/05/14 07:15

編集2019/05/14 07:53
k.matsuda

総合スコア293

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

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

takuson

2019/05/15 03:37

そのままのプログラムを実行した結果できなかったのでちょっとだけいじったプログラムが載せているコードです。
guest

0

TAB を使用しているのであれば

x textMessage[i].Split(','); O textMessage[i].Split('\t');

です。

投稿2019/05/14 07:14

kamikaze.cappa

総合スコア558

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

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

takuson

2019/05/15 03:38

その件については修正しましたができませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問