前回に続いて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 件のコメント:
コメントを投稿