前回に続いてUnifty Community から Unity Tips を紹介する:
http://wiki.unity3d.com/index.php/Tip_of_the_day
Mar 2013
Unity Tips #57 Resource.Load/LoadAll Gotchas
Resource.Load/LoadAll での良くある間違い
最近、テキスト リソース アセットのおかしな動作に遭遇した。
具体的には Resources.LoadAll メソッドが Path.DirectorySeparatorChar をパスで受付しないのである。実際のところ Path.AltDirectorySeapratorChar 文字列しか受付しない。この動作は標準の .NET ファイル/フォルダ メソッドでは Path.AltDirectorySeapratorChar と Path.DirectorySeparatorChar いずれも受付するという状況であるのに、異なっている。
これはつまり、 Path.Combine を使用して パスをビルドして Resources.LoadAll メソッドに受け渡しすることは出来ず、最初にPath.Directory SeparatorChar 文字列を Path.AltDirectgorySepartorChar 文字列で置き換える必要がある、ということだ。
using System.IO; using UnityEditor; using UnityEngine; /// <summary> /// Settings 登録のハンドリングを行う /// </summary> [InitializeOnLoad] public class EditorInitialization { /// <summary> /// RunCallbacks メソッドが一回でもすでにコールされたかを示す値を保持する /// </summary> private static bool ranOnce; /// <summary> /// <see cref="EditorInitialization"> クラスの static メンバを初期化する。 /// </summary> static EditorInitialization() { EditorApplication.update += RunCallbacks; } private static void RunCallbacks() { if (!ranOnce) { // リソースのロードを試みる var path = Path.Combine("Test/SubFolder", "testfile"); // 結果は Test/SubFolder\testfile // var data = Resources.LoadAll("Test/SubFolder/testfile", typeof(TextAsset)); // この行を正しく処理 var data = Resources.LoadAll(path, typeof(TextAsset)); // この行は失敗 if (data != null && data.Length != 0) { Debug.Log("みつかりました"); } else { Debug.Log("みつかりませんでした!" + path); } ranOnce = true; return; } // 処理を追加 } }次のリンク先に提出したバグレポートがある。
--------------
Tipsで少しづつでも知識を積み上げていこうぜ!
0 件のコメント:
コメントを投稿