2

我正在 Unity 中开发一些 webGL 项目,该项目必须从目录加载一些外部图像,它在编辑器中运行良好,但是当我构建它时,它会在 web 控制台中引发 Directory Not Found 异常。我将图像放在 Assets/StreamingAssets 文件夹中,它将成为构建项目中的 StreamingAssets 文件夹(在根目录下,与 index.html 相同)。图像位于那里,但浏览器仍然抱怨无法找到该目录。(我在我自己的电脑上打开它,没有运行网络服务器)

我想我遗漏了一些非常明显的东西,但似乎我可以使用一些帮助,我一周前刚开始学习统一,而且我对 C# 或 JavaScript 不是很好(我正在努力变得更好...)这是否与某些 javascript 安全问题有关?

有人可以指出我正确的方向,我应该如何在 Unity WebGL 中阅读图像(无需编写)?

string appPath = Application.dataPath;
string[] filePaths = Directory.GetFiles(appPath, "*.jpg");

根据 webGL 中的 unity3d.com 构建除了线程和反射之外的所有内容,所以 IO 应该可以工作 - 或者我认为:S

我正在解决一些问题,现在我正在尝试加载一个包含图像路径的文本文件(由';'分隔):

    TextAsset ta = Resources.Load<TextAsset>("texManifest");
    string[] lines = ta.text.Split(';');

然后我将所有行转换为正确的路径,并将它们添加到列表中:

    string temp = Application.streamingAssetsPath + "/textures/" + s;
    filePaths.Add(temp);

Debug.Log 告诉我它看起来像这样:

file://////Downloads/FurnitureDresser/build/StreamingAssets/textures/79.jpg

所以这似乎没问题,除了所有那些斜线(这对我来说有点奇怪)

最后创建纹理:

    WWW www = new WWW("file://" + filePaths[i]);
    yield return www;
    Texture2D new_texture = new Texture2D(120, 80);
    www.LoadImageIntoTexture(new_texture);

围绕最后一部分(不确定:webgl 项目似乎不容易调试)它告诉我: NS_ERROR_DOM_BAD_URI: Access to restricted URI denied

有人可以告诉我发生了什么吗?最重要的是,创建一个可以在运行时加载图像的目录的解决方案是什么?

4

2 回答 2

3

我意识到这个问题现在已经有几年了,但是,由于这似乎仍然是常见的问题,所以这里有一个解决方案(对不起,代码是 C#,但我猜 javascript 实现是相似的)。基本上,您需要使用 UnityWebRequest 和 Coroutines 来访问 StreamingAssets 文件夹中的文件。

1)创建一个新的加载场景(除了查询文件什么都不做;你可以让它显示一些状态文本或进度条让用户知道发生了什么)。

2)在Loading场景中的Main Camera中添加一个名为Loader的脚本。

3)在Loader脚本中,添加一个变量来表示资产是否被读取成功:

private bool isAssetRead;

4) 在加载脚本的 Start() 方法中:

void Start ()
{
  // if webGL, this will be something like "http://..."
  string assetPath = Application.streamingAssetsPath;

  bool isWebGl = assetPath.Contains("://") || 
                   assetPath.Contains(":///");

  try
  {
    if (isWebGl)
    {
      StartCoroutine(
        SendRequest(
          Path.Combine(
            assetPath, "myAsset")));
    }
    else // desktop app
    {
      // do whatever you need is app is not WebGL
    }
  }
  catch
  {
    // handle failure
  }
}

5) 在加载脚本的 Update() 方法中:

void Update ()
{
  // check to see if asset has been successfully read yet
  if (isAssetRead)
  {
    // once asset is successfully read, 
    // load the next screen (e.g. main menu or gameplay)
    SceneManager.LoadScene("NextScene");
  }

  // need to consider what happens if 
  // asset fails to be read for some reason
}

6)在Loading脚本的SendRequest()方法中:

private IEnumerator SendRequest(string url)
{
  using (UnityWebRequest request = UnityWebRequest.Get(url))
  {
    yield return request.SendWebRequest();

    if (request.isNetworkError || request.isHttpError)
    {
      // handle failure
    }
    else
    {
      try
      {
        // entire file is returned via downloadHandler
        //string fileContents = request.downloadHandler.text;
        // or
        //byte[] fileContents = request.downloadHandler.data;

        // do whatever you need to do with the file contents
        if (loadAsset(fileContents))
          isAssetRead = true;
      }
      catch (Exception x)
      {
        // handle failure
      }
    }
  }
}
于 2018-10-01T12:13:54.027 回答
-1

将您的图像放入Resources文件夹并使用Resources.Load打开文件并使用它。

例如:

Texture2D texture = Resources.Load("images/Texture") as Texture2D;
if (texture != null) 
{
    GetComponent<Renderer>().material.mainTexture = texture;
}

目录列表和文件 API 在 webgl 构建中不可用。

基本上不支持低级 IO 操作。

于 2016-04-10T14:41:51.820 回答