Resources.Loadを使ってテキストファイルを読み込もうとしたとき、NullReferenceExceptionエラー(NullReferenceException: Object reference not set to an instance of an object)にしばらく嵌ってしまいました。
そこで本ページでは、Resources.LoadでNullReferenceExceptionエラーとなった場合にチェックすべきポイントと解決方法についてメモしておきたいと思います。
ロードするファイルのパスを確認する
まずは、ロードしようとするファイルのパスを確認します。
当然ながら、対象となるファイルのパスがきちんと通ってないと、そのファイルを読み込むことができません。
ファイルパスは、Unityプロジェクト内のフォルダ “Assets/Resources/” を起点として記入する必要があります(Resourcesフォルダが無い場合は作成)。
ここで特に注意しておきたいのは、Resources.Loadでファイルパスを指定する際は、ファイルの拡張子は省略しなければならないという点です。
拡張子を含めたファイルパスを記入すると、NullReferenceExceptionエラーとなってしまいます。
例えばロードしたいテキストファイル(test.txt)が “Assets/Resources/test.txt” にある場合、Resources.Loadでは次のようにファイルパスを記述します。
1 2 3 |
Resources.Load("test"); // Resources.Load("test.txt"); // NullReferenceExceptionエラー // Resources.Load("Assets/Resources/test.txt"); // NullReferenceExceptionエラー |
ファイルの存在を確認するSystem.IO.File.Exists
なお、ファイルパスがきちんと通っているか(ファイルが存在するか)を確認する方法としてSystem.IO.File.Existsがあります。
ただ、Resources.Loadとはファイルパスの記述方法が異なり、こちらはUnityプロジェクトのルートディレクトリを起点としたパスを記入し、ファイルの拡張子も記述する必要があります。
System.IO.File.Existsはその結果(ファイルの有無)をtrue/falseで返しますが、例えば前述のテキストファイル(Assets/Resources/test.txt)の存在を確認したい場合、次のようにファイルパスを記述します。
1 2 3 |
System.IO.File.Exists("Assets/Resources/test.txt"); // true System.IO.File.Exists("Assets/Resources/test"); // false System.IO.File.Exists("test.txt"); // false |
Resources.Loadの場合のようにファイルの拡張子を省略したり、”Assets/Resources/” を起点としたパスを記述するとfalseが返ってきてしまいます。
テキストファイルをロードしたら文字化けする場合
前項のようにファイルパスを記述することで、Resources.LoadでのNullReferenceExceptionエラーは出なくなると思います。
しかし、ロードしたテキストファイルのエンコードがUTF-8以外だと、ロードしたテキストデータは文字化けしてしまうのでこちらも注意が必要です。
例えば前述のテキストファイル(Assets/Resources/test.txt)のエンコードがANSI(Shift-JIS)だった場合、次のコードでファイルをロードすると、テキストデータが文字化けして表示されます。
1 2 3 4 |
Debug.Log(System.IO.File.Exists("Assets/Resources/test.txt")); // ファイルの存在確認 TextAsset textFile = Resources.Load("test") as TextAsset; StringReader reader = new StringReader(textFile); Debug.Log(textFile.text); |
次に、同じテキストファイルをUTF-8エンコードで保存し上記コードを実行すると、今度はテキストデータがきちんと表示されています。
コメント