タグ: CSV

UnityでCSVを読み込む

ソース残していないべ

かなり前、CSVを読んで配列に格納するスクリプトを作成しておりました。

Unity CSVを読み込んでシナリオを書き出す

ので、それ読み込めばすぐ終わるわ(笑)としていたら、削除していましたね。

多分ね。去年というか今年の初めにMacさんの調子がすごぶるよくなくて色々片付けしていた時に、不要だと削除したんだわ。

その時パッケージエクスポートしていないから何も残っていなくてま、再作成。

ついでなので、ここにもソース乗せておく。

パッケージ化したいので、別プロジェクトでサクッと作ります。

事前準備

①テスト用CSV:今回は4行2列のものを準備。

Assetsに「Resources」フォルダを作成、さらにわかりやすくするため、そのフォルダの下位フォルダ「Scenario」の中にCSVをインポートしておきます。

②CSVを読み込むアクションが必要なのでボタンを配置

③CSVを読むスクリプト「CsvReader」をキャンバスUIをつける。

ソース

面倒臭いので、そのまま載せる。なお、c#です。

using UnityEngine;
using System.IO;

public class CsvReader : MonoBehaviour {


	//読み込むCSVファイル
	private TextAsset csvFile;
	//表示用シナリオ(退避用CSV)
	private List<string[]> scenarioList = new List<string[]>();
	//シナリオ行数カウンタ
	private int csvCount = 0;

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}

	public void CsvRead (string scenarioName){

		csvCount = 0;

		csvFile = Resources.Load ("Scenarios/" + scenarioName) as TextAsset;
		StringReader reader = new StringReader (csvFile.text);

		//csvファイルを取得
		while (reader.Peek () > -1) {
			string line = reader.ReadLine ();
			scenarioList.Add (line.Split (','));

			Debug.Log (scenarioList [csvCount] [0] + "," + scenarioList [csvCount] [1]);

			csvCount++;
		}

	}
}

動きはDebug.logで確認するため、入れています。

ま、これでおっけ。その後は、ボタンの「On Click」時の動きを設定してあげる。

シナリオ名前を変えて読み込みたいので、引数で渡しています。

この類の処理に関する詳しい解説を乗せているサイト様は山ほどあるので、これはあくまで私の備忘として説明は割愛。

ボタンを押すと、Debugを吐き出します。

ついでにパッケージエクスポート

パッケージをエクスポートしよう。

ここにある。以上。

いつも思うのだが

Unityで初めてプログラミングを全くやったことない人が、これでプログラミング覚えるのはあまり良くない気がする。

知っている人だからこそのやり方があると思うのだけど、

例えば、Unityはボタンにスクリプトをつけるという前提なので、クラスを作ってNewしようとすると怒る。それ、許さないって怒られる。

別の言語でプログラミングやる方はお分かりでしょうが、クラスNewできないんだふーんってなるじゃん?

逆のバターンで、クラスをNewしようとする発想がない人がやるとちょっとなと思って。いや、偏見と先入観かもしれないけど。

Unity CSVを読み込んでシナリオを書き出す

CSV読むのは簡単だった

いつもながらハマるけど。何にハマったのかというと、今回は宣言。

◆記事:UnityでCSVを読み込むときの軽いメモ
◆サイトリンク:http://qiita.com/tt-coder/items/68e81a64664b769f3755

言われた通りにやればできました。
ソースは全くいじっていない。宣言が必要でしたね。

初っ端にこれを宣言する。

なんでこれがわかったのかというと、エラーが教えてくれました。
エラーの内容でググれば出てきた(外国のサイトが)。

using System.IO;

Unityでアプリ開発の良さって、情報が溢れていることね。

初心者でもちょっとの山(うまくいかないときのあの山)を越えれば、すんなりできると思います。
私ができているからにはできるんじゃないかな。

C#とか、大学以来やるけどなんだかんだいけますね。

今やっているのは、これを読み込んで会話シーンを作ることですが、忘れそうだったのでメモメモ。

iTweenで表現する方法でやっている

昨日の、シナリオ書き出しをCSVからとって表示する方法にしました。

Unity ノベルゲームのようなものを作ってみる

結果はこの通り。上がCSV読み取り。下が素敵なブロガーさんのそのままのソース。

もともソースからの修正箇所はほぼない

CSV読み込みソースも、テキスト表示ソースも-ほぼ-そのまま。

やったといえば、publicでシナリオを書き込むんじゃ無くしただけ。
scenariosの情報をスクリプトで設定するようにしただけ。

[SerializeField] string[] scenarios;	// 会話内容

この部分を、無くした。CSVの配列を設定してやるから。
こうして、Startの部分のCSV読みこむ。

	void Start()
	{
		Debug.Log ("start");

		CSVName = "sample"; 
		CSVNumber = "0"; 
		// Resouces/CSV下のCSV読み込み 
		csvFile = Resources.Load("CSV/" + CSVName + CSVNumber) as TextAsset; 
		StringReader reader = new StringReader(csvFile.text);

		while(reader.Peek() > -1) {
			string line = reader.ReadLine();
			// 配列に格納
			csvDatas.Add(line.Split(',')); 
			// 行数加算
			height++; 
		}
	}

uGUIのところから入れていたシナリオの長さは、CSVの行数を入れればよい。
なので、あとは、表示したいcsvDatasの2列目(このcsvの1列目には人の名前が、2列目にセリフを入れたつもり)をuiTextに表示するシナリオに格納させる。

	/// 初期化
	void Initialize()
	{
		isCompleteLine = false;
		uiText.text = "";

		//currentText = senarios[currentline];
		currentText = csvDatas[currentLine][1];

		textSpeed = TEXT_SPEED + (currentText.Length * TEXT_SPEED_STRING);

		LineUpdate();
	}

	/// 会話シーン更新
	IEnumerator ScenarioCoroutine()
	{
		while(true)
		{
			yield return null;

			// 画面を押した時、次の内容へ
			if(isCompleteLine && Input.GetMouseButton(0))
			{
				yield return new WaitForSeconds(completeLineDelay);

				//if(currentLine > scenarios.Length - 1)
				if(currentLine > height - 1)
				{
					ScenarioEnd();
					yield break;
				} 

				Initialize();
			}

			// 表示中にボタンが押されたら全部表示
			else if(!isCompleteLine && Input.GetMouseButton(0)) 
			{
				iTween.Stop();
				TextUpdate(currentText.Length); // 全部表示
				TextEnd();
				yield return new WaitForSeconds(completeLineDelay);
			}
		}
	}

ということで、 「//currentText = senarios[currentline];」
これを潰して、csvの配列を指定。「currentText = csvDatas[currentLine][1];」

もう一つ、「//if(currentLine > scenarios.Length – 1)」の長さは、「hight」がルノで、それに変更。「if(currentLine > height – 1)」

日本語がおかしい気がする。
今日の私は理解して書いているけど、明日の私がわかるだろうか。

© Copyright 2017 「It Happens」 All rights reserved.