Альтернатива AssetDatabase.LoadAssetAtPath для любого пути? - PullRequest
0 голосов
/ 25 мая 2019

В настоящее время я использую следующий фрагмент кода для загрузки текстур из файлов изображений.

Texture my_pic = (Texture) AssetDatabase.LoadAssetAtPath(path, typeof(Texture));

К сожалению, этот метод не работает, если целевой путь не находится в папке Asset/.Мне было интересно, как я могу загрузить изображение, учитывая некоторый абсолютный путь в форме

/Users/Alan/SomeFolder/SomePic.png

(обратите внимание, что в настоящее время я пишу пользовательский плагин для редактора Unity, расширяя EditorWindow, если это имеет значение)

Ответы [ 3 ]

1 голос
/ 25 мая 2019

Вы можете использовать UnityWebRequestTexture

var www = UnityWebRequestTexture.GetTexture("file:///Users/Alan/SomeFolder/SomePic.png");
www.SendWebRequest();
while(!www.isDone)
    continue;
var texture = DownloadHandlerTexture.GetContent(www);
1 голос
/ 25 мая 2019

Вот некоторый код, который откроет диалоговое окно единого файла и загрузит выбранную текстуру в материал присоединенного объекта.

string path = EditorUtility.OpenFilePanel("Load an image", "", "png");

if (string.IsNullOrEmpty(path)) {
  return;
}

// Load the images bytes from file (this is a synchronous call!)
byte[] bytes = null;
try {
    bytes = System.IO.File.ReadAllBytes(path);
} catch (System.Exception e) {
    Debug.LogError(e.Message);
    return;
}

// Load the bytes into a Unity Texture2D
Texture2D _tex = new Texture2D(2,2);
_tex.LoadImage(bytes);

// Apply this texture to the object
Renderer r = (target as Component).gameObject.GetComponent<Renderer>();
if (r != null) {
    r.material.SetTexture("_MainTex", _tex);
}

Последняя часть, только для демонстрации, будет работать только наскрипт, полученный из Editor, потому что он использует target для поиска присоединенного средства визуализации.Вам решать, что делать с текстурой в вашем EditorWindow скрипте.

Кроме того, не забывайте явно вызывать DestroyImmediate для вашей текстуры, когда она вам больше не нужна, так как вы можете в итогеутечка памяти в коде вашего редактора.

1 голос
/ 25 мая 2019

AssetDatabase - это класс только для редактора.

Кроме того, он может читать только ресурсы в каталоге / Assets (вы знаете, те, которые известны базе данных активов).

Если вы хотите прочитать какой-либо файл в файловой системе, вам нужно использовать System.IO классы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...