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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

1093閲覧

<Unity> 敵データの情報をCSVファイルで記述しているが、よりよい方法を知りたい。

Sashimi_ShowYu

総合スコア61

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2019/08/15 04:00

編集2019/08/15 05:21

●困っていること
スクロールアクションゲームを作ってます。敵の出現順、ステータス、配置などをCSVファイルに記述し、それをプログラムで読みこむことで、敵を出しています。
しかし、このCSVファイルが非常に扱いにくい。

>なぜ扱いにくいか
そのCSVファイルを、excelなどのCSV編集アプリで編集した時、その編集アプリを開いている状態で、Unityを動かすとUnityでエラーが出てしまう。
これは編集アプリがそのCSVファイルを排他ロックしてるのに、Unityで読み込もうとするからのようです(このサイトで教えていただきました)。
とは言っても、毎回編集アプリを終了させるのはとても大変なので、排他ロックを行わないアプリが欲しかった。

そこで排他ロックを行わない、Cassavaというアプリを使うと、うまく行きました(このアプリも、このサイトで教えていただきました)。
しかし、このCassavaというアプリ、はあまりに古いソフトなため、コピーアンドペーストができない、など非常に使いにくく、扱う情報が増えてきた現在、非常に使うのがきつくなってきました。

※ちなみに、CSVファイルに記述しようとしたのは、CSVだとエクセルのようなアプリを使って、マス目上にデータを入力できるのが極めて便利だったからです。
以下のような、ただ数字が並ぶ状態で編集するのはキツいのです。
52,3,666
0,708888,8

ちなみに、他に、試したけど、使いにくい、排他ロックがかかるなどの理由で駄目だったアプリは以下です。
エクセル、VSコード、LibroOffice、EMEditor

●実現したいこと
マス目上で編集できるCSV編集アプリで、かつ編集したCSVファイルを、「セーブし、かつ、その編集アプリを起動したまま」、Unityを作動させてもエラーが出ないアプリを知りたい。

>上記が無理な場合
CSV以外の方法でやるべきなのか?
もしくは、根本的に、他に、うまい敵のデータ管理方法がないか
のアドバイスがほしいです。

●その他補足
扱いたいのは、敵の種類、ステータス、出現順などです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ファイルの読み込みをロックが掛かっていたとしても読み込めるようにすればいいと思います

using (FileStream fs = new FileStream(@"test.csv", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (var s = new StreamReader(fs)) { while (!s.EndOfStream) { Debug.Log(s.ReadLine()); } } }

追記
フォルダの同期ソフトを使い、\work\test.csvを更新したら、Asset\Resource\ と同期させて、
編集しているファイルとUnityで読み込むファイルを分けるという方法もあります

ただ、具体的などういうソフトがいいのかは私は知らないので、
自分で探すか、まとめて別の質問で書き込めば誰かが答えてくれるかもしれません

投稿2019/08/15 05:54

編集2019/08/15 09:20
izmktr

総合スコア2856

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

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

Sashimi_ShowYu

2019/08/15 08:22 編集

回答ありがとうございます。 >ファイルの読み込みをロックが掛かっていたとしても読み込めるようにすればいいと思います なんと、逆にUnity側でそんなことをすることができるのですか。 ただ、書いて頂いたソースコードが、もう私のレベルではあまりに分からなすぎて、どう使えばまるで見当もつきません。 かなり丸投げになってしまうのですが、これを自分のソースのどこに書けばいいのか教えてもらえないでしょうか? 試したこと ①書いてくれたソースは using だから、スクリプトの最初のusingのとこに書けばいいんじゃ? →コンパイルすらできないエラー ② ごく普通に、Start関数内にある、CSVファイルを読み込む処理の直前に入れてみた(以下) →コンパイルは通るけれど、このスクリプト内の全く無関係なところでエラーが出る。その部分をコメントアウトしても、別の部分でまたエラーがでる。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ using (FileStream fs = new FileStream(@"testCSV.csv", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (var s = new StreamReader(fs)) { while (!s.EndOfStream) { Debug.Log(s.ReadLine()); } } } csvIre1 = Resources.Load("testCSV") as TextAsset; // ←自分の作った部分。Resoucesフォルダ下のCSV読み込み ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ どのように書けばよいでしょうか?
izmktr

2019/08/15 08:39 編集

エラーが出るのなら、エラーメッセージとそれが出る状況を書きましょう SteamReaderはC#でファイルを読むとき、かなり一般的な方法だと思うので、 そちらでググって使い方を調べてください ここで使っているusingは、あなたの知っているusingと単語は同じですが使い方は全く違います 詳しくは「using IDisposable」でググってください
YAmaGNZ

2019/08/16 03:50 編集

前の質問を読むと、CSVの読み込みにResources.Loadを使用しているようです。 この場合、SteamReaderは使えないのではないでしょうか? 追記 fiveHundredさんのご指摘でエディタ上で読み込めるとのことですので、上記は正確な情報ではありませんでした。
izmktr

2019/08/15 09:11

どちらかというと、使えないのはResources.Load の方ですよね? 最終的にはResources.Load を使うにしろ、開発中はSteamReader を使うべきかと思います
YAmaGNZ

2019/08/15 09:30

Unityを詳しく知らないので検索した範囲ですが、StreamReaderではResourceフォルダへのアクセスが出来ないのではないかと心配した次第です。 開発中のみ使用するというのであれば、質問者さんへのアドバイスとして、別フォルダにCSVを用意しなくてはいけない旨をしたほうがいいのではないかと思います。
Sashimi_ShowYu

2019/08/15 09:33

補足ありがとうございます。 指摘されたことの理解はすぐにはできそうにないですので、じっくり考えます。 単語をググって現時点でちょっと分かったことと、YAmaGNZさんのコメントを読むと、だいたいの推測ですが、つまりは上記のコードは、ロックの解除だけでなく、ロック解除したcsvから中身を読み取って、出力までやる一連の流れをやってるみたいですね。 アホみたいに単純に付け足すだけでは、やはり駄目っぽいですね。 あと、こうなっては意味はないと思うので、特に目を通してくれなくてもよいのですが、エラーが出たのは以下のコードで yarareF = PlayerT.GetComponent<JikiController>().yarare; エラーコードは以下でした。 The variable PlayerT of backGra has not been assigned. You probably need to assign the PlayerT variable of the backGra script in the inspector. UnityEngine.GameObject.GetComponent[T] () (at C:/buildslave/unity/build/Runtime/Export/GameObject.bindings.cs:28) backGra.FixedUpdate () (at Assets/backGra.cs:138)
Sashimi_ShowYu

2019/08/15 09:41

>フォルダの同期ソフトを使い、\work\test.csvを更新したら、Asset\Resource\ と同期させて、 >編集しているファイルとUnityで読み込むファイルを分けるという方法もあります なるほど・・・ 最初のやり方とどちらが楽かわかりませんが、こちらは該当のプログラムに関する知識がなくても、ソフトを扱う知識があれば(それが私にあるかはわかりませんが)、何とかなりそうなやり方で、ちょっとやってみたくなりますね。 そちらも検討します。
YAmaGNZ

2019/08/15 10:08

#if UNITY_EDITOR   using (FileStream fs = new FileStream(@"C:\test\testCSV.csv", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) //読み込む続き #else   csvIre1 = Resources.Load("testCSV") as TextAsset; // ←自分の作った部分。Resoucesフォルダ下のCSV読み込み #endif みたいにすれば、エディタから起動した場合はC:\test\testCSV.csvをStreamReaderで読み込み、実際の実行ではResourceフォルダのCSVを読み込むという形になるかと思います。 テスト時はC:\test\testCSV.csvをエクセル等で編集しながら実行し、リリース時にそのCSVをResourceフォルダに置いてやるというやり方ができるかと思います。 CSVの読み込み部分自体は前の質問を見る限り、1行づつ読み込んで処理しているみたいですから、izmktrさんが提示されている方法でもほとんど変わらないと思います。
izmktr

2019/08/15 10:22

気になったのでResouceの下のファイルをStreamReaderで読み込みましたけど、普通に読めますね 具体的にどのことを指しているのかわからないので、情報ソース等を出せませんか?
fiveHundred

2019/08/15 10:30

通りすがりなので、状況が分かっていませんが、 > 気になったのでResouceの下のファイルをStreamReaderで読み込みましたけど、普通に読めますね エディタ上で読み込むことは出来ますが、アプリとしてビルドしたとき際に読み込めなくなります。 (全てのプラットフォームで試したわけではないので、可能なものもあるかもしれませんが) ResourcesディレクトリはResources.Loadのみで使うべきであり、StreamReaderを使う場合はそのファイルはStreamingAssetsディレクトリに格納すべきです。
izmktr

2019/08/16 03:01

趣旨がずれているようですが、問題解決するのが第一の目的です 今回の話は開発用の付け焼き刃対応でいい話ですから、 リリース時に問題が発生しますという指摘はやや的外れではありませんか? (深堀りしたのは、付け焼き刃対応でも問題があるかの確認です)
YAmaGNZ

2019/08/16 03:48

私のコメントは開発時に読めて、リリース時に読めないということを知らず常にResourceフォルダへのアクセスはできないのではないかという指摘でしたので、これは誤りだと思いますのでコメントを修正させていただこうと思います。 ただ、「CSVの読み込み部分をこうすればロックがかかっていても読み込めます」という情報があった場合、その実装を情報通りに「変更」してしまうと思います。(ResourceフォルダにあるCSVには触れていないのでそのまま配置になるかと) そこにデバッグ時はStreamReaderでも読めますが、リリース時は読めませんという情報は非常に有用な情報なのではないでしょうか
Sashimi_ShowYu

2019/08/16 09:42

皆さん、ありがとうございます。 YAmaGNZさんに至ってはわざわざ、前回の質問もみてくれているようで、頭が下がるばかりです。 で、それなりに、頂いた回答を理解、実行できた上で返事しようと思ったのですが、かなり難解で、ちょっとやそっとではできなさそうな感じです。 なので、取り急ぎの返信で。まだ解決はしていないのですが、ありがとうございました。
Sashimi_ShowYu

2019/08/21 14:30

私の解決方法についてまとめておきます。 izmktrさんから頂いた解決方法は、最初の分(コード記載)と、追記の分の2つがあります。 最初のぶんは私にはなかなか理解が進められず、実装にはいたりませんでした。しかし、こちらのやり方は成功すれば今後の実作業の手間は減ると思います。のちのちはこちらでもできるよう目指したいです。 追記の方に関しては、全くもって「そんな方法があったのか」という驚きの解決法で、確かにファイルを同期などでコピーするだけで、ファイルロックの問題は解決するなのですね。このやり方は、Unityやプログラムの知識は一切不要で、超初心者レベルのwindowsの知識があれば誰でもできます。 最終的にはこちらでやることでうまくいきました。ファイルをセーブ→自動でコピー とやってくれる同期ソフトが見つかっていないので、現状、手動同期してますが、それでもさほど面倒はないです。 おかげ様で解決しました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問