2012-05-30 2 views
1

Как загружать ресурсы (текстовые файлы, текстуры и т. Д.) Из встроенного плагина? Я пытаюсь выполнить mono invoke из Resource.Load(), но я не уверен, как обрабатывать объект, который будет возвращен из этой операции (если он будет успешным). Любая помощь будет принята с благодарностью :).Загрузка ресурсов в собственный плагин (Unity)

+0

Hmh, родной плагин означает платформу, такую ​​как iOS или Android ... Или я неправильно понял? – Kay

+0

Нет, вы читали правильно, но в нем также есть ПК и OSX :) – hatboyzero

ответ

6

Поддерживаемые Unity средства для плагина для загрузки ресурсов непосредственно из собственной файловой системы - это размещение этих ресурсов в папке с именем StreamingAssets внутри вашего проекта. Когда ваше приложение на основе Unity установлено, содержимое этой папки копируется в собственную файловую систему (кроме Android, см. Ниже). Путь к этой папке на родной стороне зависит от каждой платформы.

В Unity V4.x и позже, этот путь доступен как Application.streamingAssetsPath;

Обратите внимание, что на Android файлы, которые вы размещаете в StreamingAssets получить упакованы в файл .jar, хотя они могут быть доступны распаковкой .jar файл.

В Unity v3.x, вам придется вручную построить путь себя следующим образом:

  • Все платформы, кроме IOS и Android: Application.dataPath + "/StreamingAssets"
  • прошивкой: Application.dataPath + "/Raw"
  • Android: путь к .jar является: "jar:file://" + Application.dataPath + "!/assets/"

Вот отрывок я использовал, чтобы справиться с этим:

if (Application.platform == RuntimePlatform.IPhonePlayer) dir = Application.dataPath + "/Raw/"; 
else if (Application.platform == RuntimePlatform.Android) { 
    // On Android, we need to unpack the StreamingAssets from the .jar file in which 
    // they're archived into the native file system. 
    // Set "filesNeeded" to a list of files you want unpacked. 
    dir = Application.temporaryCachePath + "/"; 
    foreach (string basename in filesNeeded) { 
     if (!File.Exists(dir + basename)) { 
      WWW unpackerWWW = new WWW("jar:file://" + Application.dataPath + "!/assets/" + basename); 
      while (!unpackerWWW.isDone) { } // This will block in the webplayer. 
      if (!string.IsNullOrEmpty(unpackerWWW.error)) { 
       Debug.Log("Error unpacking 'jar:file://" + Application.dataPath + "!/assets/" + basename + "'"); 
       dir = ""; 
       break; 
      } 
      File.WriteAllBytes(dir + basename, unpackerWWW.bytes); // 64MB limit on File.WriteAllBytes. 
     } 
    } 
} 
else dir = Application.dataPath + "/StreamingAssets/"; 

Обратите внимание, что на Android, Android 2.2 и более ранних версиях не удается напрямую распаковать большие .jars (обычно более 1 МБ), поэтому вам придется обрабатывать это как кромку.

Ссылки: http://unity3d.com/support/documentation/Manual/StreamingAssets.html, плюс http://answers.unity3d.com/questions/126578/how-do-i-get-into-my-streamingassets-folder-from-t.html и http://answers.unity3d.com/questions/176129/accessing-game-files-in-xcode-project.html

+0

Спасибо - это немного облегчает мне. :) – hatboyzero

+0

Последняя версия Unity может возвращать путь через http://docs.unity3d.com/Documentation/ScriptReference/Application-streamingAssetsPath.html – ftvs

+0

Спасибо, что вы написали замечательную работу, помогли много. –

3

Я хочу предложить ответ на этот вопрос в отношении к родной стороне вещей.

IOS

Это довольно просто really- вы можете получить на пути StreamingAssets на родной стороне, как так:

NSString* bundlePath = [[NSBundle mainBundle] bundlePath]; 
NSString* streamingAssetsPath = [NSString stringWithFormat:@"%@/Data/Raw/", bundlePath]; 

Android

Я не люблю использовать потоковые активы на Android, это грязное решение, копирующее все файлы об IMO. Более чистый способ сделать это - создать структуры каталогов, определенные в docs в вашем каталоге плагинов.

Так, например, изображение может быть расположено как это в Вашем проекте Unity:

Assets/Plugins/Android/res/drawable/image.png 

Затем на Android стороне вы можете получить доступ к идентификатор ресурса это следующим образом:

Context context = (Context)UnityPlayer.currentActivity; 
String packageName = context.getPackageName(); 
int imageResourceId = context.getResources().getIdentifier("image", "drawable", packageName); 

До вас, как справиться со всем остальным!Надеюсь, это поможет :)

Смежные вопросы