在Native插件中加载资源(Unity)

时间:2012-05-30 00:44:24

标签: resources mono unity3d

如何从本机插件中加载资源(文本文件,纹理等)?我正在尝试实现Resources.Load()的单调调用,但我不确定如何处理将从此操作返回的Object(假设它成功)。任何帮助将不胜感激:)。

2 个答案:

答案 0 :(得分:7)

Unity支持的插件直接从本机文件系统加载资源的方法是将这些资源放入项目中名为“StreamingAssets”的文件夹中。安装基于Unity的应用程序后,此文件夹的内容将复制到本机文件系统(Android除外,请参见下文)。原生端上此文件夹的路径因平台而异。

在Unity v4.x及更高版本中,此路径以Application.streamingAssetsPath;

的形式提供

请注意,在Android上,放置在StreamingAssets中的文件会打包成.jar文件,但可以通过解压缩.jar文件来访问它们。

在Unity v3.x中,您必须自己手动构建路径,如下所示:

  • 除iOS和Android以外的所有平台:Application.dataPath + "/StreamingAssets"
  • iOS: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 MB),因此您需要将其作为边缘情况处理。

参考文献:http://unity3d.com/support/documentation/Manual/StreamingAssets.html,加http://answers.unity3d.com/questions/126578/how-do-i-get-into-my-streamingassets-folder-from-t.htmlhttp://answers.unity3d.com/questions/176129/accessing-game-files-in-xcode-project.html

答案 1 :(得分:3)

我希望就这个问题提供与本机相关的答案。

<强>的iOS

真的很简单 - 你可以像这样进入原生方面的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端,您可以像这样访问它的资源ID:

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

由你决定如何处理其他所有事情!希望这会有所帮助:)