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

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

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

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

Unity

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

Q&A

解決済

1回答

4795閲覧

Unityでフォルダを監視しファイルが作成されたら、シーン遷移を行いたい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity

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

0グッド

0クリップ

投稿2017/12/06 13:24

編集2017/12/06 13:26

###前提・実現したいこと
Unity(C#)で、フォルダを監視し、フォルダに新しくファイルが作成されたのをトリガーにして、
ゲームシーンに遷移したいです。
以下のエラーで解決策がわかりません。どなたかご教授願います。よろしくお願いいたします。

###発生している問題・エラーメッセージ
LoadSceneAsyncNameIndexInternal can only be called from the main thread.
Constructors and field initializers will be executed from the loading thread when loading a scene.
上記のエラーメッセージが下記のコード時に表示されます。

###該当のソースコード
public class Director : MonoBehaviour
{
FileSystemWatcher fsw = new FileSystemWatcher();
public void Start ()
{
//監視対象のフォルダの設定
fsw.Path = フォルダパス;
//監視する種類の設定
fsw.NotifyFilter =
(NotifyFilters.Attributes
| NotifyFilters.LastAccess
| NotifyFilters.LastWrite
| NotifyFilters.FileName
| NotifyFilters.DirectoryName);
//サブディレクトリも監視
fsw.IncludeSubdirectories = true;

//すべてのファイルを監視 fsw.Filter = ""; //イベント設定 fsw.Created += fsw_Created; //監視を開始 fsw.EnableRaisingEvents = true; } public void fsw_Created(object sender, FileSystemEventArgs e) { Debug.Log("Created"); SceneManager.LoadScene("GameScene"); } void Update () { }

}

###試したこと

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

「LoadSceneAsyncNameIndexInternalはメインスレッドでしか使えません」というエラーです。
fsw.Created += fsw_Created;
この部分で別スレッドに登録されているので動作しません。

詳しくはこちらが参考になります。
Event使用時のエラー"... can only be called from the main thread" - Unityな日々(Unity Geek)


質問を記入する際、ソースコードは「```」で囲んでください。
(入力欄上の「</>」ボタンを押すとテンプレートが表示されます)
また、エラーが発生した時はエラーコードを読み、その後そのまま検索しましょう。
(上記サイトはエラーコードでググって最初に出てきたものです)


2017/12/07 13:40 コメントを受けて追記
あまりスマートな書き方ではないですが、簡単にやるとこんな感じです。
要は「完了フラグがオンになるまでループ処理しながら待つ」というやり方です。
今回はUpdateでやりましたが負荷が気になるならコルーチンにして1秒毎にチェックとかでもいいと思います。

C#

1public class Director : MonoBehaviour 2{ 3FileSystemWatcher fsw = new FileSystemWatcher(); 4 5private bool isCreated; //追加:完了フラグ 6 7public void Start () 8{ 9//監視対象のフォルダの設定 10fsw.Path = フォルダパス; 11//監視する種類の設定 12fsw.NotifyFilter = 13(NotifyFilters.Attributes 14| NotifyFilters.LastAccess 15| NotifyFilters.LastWrite 16| NotifyFilters.FileName 17| NotifyFilters.DirectoryName); 18//サブディレクトリも監視 19fsw.IncludeSubdirectories = true; 20 21//すべてのファイルを監視 22fsw.Filter = ""; 23//イベント設定 24fsw.Created += fsw_Created; 25//監視を開始 26fsw.EnableRaisingEvents = true; 27} 28public void fsw_Created(object sender, FileSystemEventArgs e) 29{ 30Debug.Log("Created"); 31isCreated = true; //変更:フラグをオンにするだけ 32} 33 34void Update () 35{ 36 if (isCreated) { //追加:フラグがオンになったらシーン遷移実行 37 isCreated = false; 38 SceneManager.LoadScene("GameScene"); 39 } 40} 41}

投稿2017/12/06 14:29

編集2017/12/07 04:45
sakura_hana

総合スコア11425

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

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

退会済みユーザー

退会済みユーザー

2017/12/06 17:20

エラーの内容はわかりました。イベントハンドラ内にシーン遷移の処理を書けないとしたら、では具体的にどうすればいいのでしょうか?指定フォルダ内にファイルが作成されたことをどうやって検知すればいいのでしょうか?そこが知りたいのです。
退会済みユーザー

退会済みユーザー

2017/12/07 05:15

書いて頂いたコードにてうまくシーン遷移できました。本当にありがとうございます。 フラグはこういう風に使うのですね。まだc#を勉強して1ヶ月ちょっとなのでとても勉強になりました。 いろいろ試してみて全くうまく行かなかったので、できたときは感動しました。 重ねて感謝申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問