Unity - 奇怪的错误,构建与构建和运行

Posted

技术标签:

【中文标题】Unity - 奇怪的错误,构建与构建和运行【英文标题】:Unity - Weird Bug , Build vs Build and Run 【发布时间】:2021-04-13 13:51:45 【问题描述】:

我正在开发一个统一项目,我在 sphere game object 上应用 texture。我从 .jpg 文件 中获得了纹理。指定.jpg文件不放在ResourcesAssets文件夹中,而是放在项目内的文件夹中,项目的.exe也将在此文件夹中,构建后它 。所以 .jpg 的路径是 /project-name/Build/texture.jpg 。为了访问 .jpg,我使用了 UnityWebRequestTexture 类,该类被修改用于访问磁盘上的文件,也使用相对路径,正如您在我的代码中看到的那样。

// For accessing the .jpg and using it as file we use the UnityWebRequestTexture.GetTexture (see uinty docs)
// The path is a URL , but we modify it to work for local computer with relative path


    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.Networking;
    
    public class LoadTexture : MonoBehaviour
    
    
        Texture2D texture;
        Texture2D texture2;
    
        public GameObject sph;
    
        bool on = false;
       
        public Renderer sphRenderer;
    
        void Start()
        
    
            sphRenderer = sph.GetComponent<Renderer>();
    
            StartCoroutine(GetText());
    
                IEnumerator GetText()
                
                    using (UnityWebRequest uwr = UnityWebRequestTexture.GetTexture("file://" + "/../Build/texture-sphere.jpg")) // Relative path
                    
                        yield return uwr.SendWebRequest();
    
                        if (uwr.isNetworkError || uwr.isHttpError)
                        
                            // Display error
                            Debug.Log(uwr.error);
                        
                        else
                        
                            // Get downloaded asset bundle
                            texture = DownloadHandlerTexture.GetContent(uwr);
    
    
                        
                    
                
        
    
    
        void Update()
        
    
            // Implemenation of toggle by pressing T key
    
    
            // Press T
            if (Input.GetKeyDown(KeyCode.T))
                on = !on;
    
    
            if (on)
            
                
                // Change to white color first
                 sphRenderer.material.color = Color.white;
    
    
                //Resources.Load("texture", typeof(Texture2D));
                // Set the Texture to the SPH Renderer
                sphRenderer.material.mainTexture = texture as Texture2D;
                                     
            
    
            else if (!on)
            
                //set texture to null
                sphRenderer.material.mainTexture = null;
    
                // change color to red
                sphRenderer.material.color = Color.red;
    
            
    
        
                
    

基本上我所做的是切换 shpere的外观在红色和应用在其上的纹理之间,按T key。我遇到了一个非常奇怪的错误:

如果我构建并运行我的项目,纹理会在切换时根据需要应用,但如果我点击 .exe 文件( 来自同一个版本)并再次运行它,它没有,只是保持白色(因为你可以在我的代码中看到,我首先将球体设为白色,然后应用纹理)。我还尝试了所有可能的 build and runbuild 通过更改位置等组合,但问题仍然存在。另外,当我点击 play 时,在 unity editorGame window 中它会按预期运行。只有点击.exe时才会出现问题。

我猜,通过 Build and Run ,unity 仍然使用编辑器的Assets 吗?也许魔鬼就在 dllResources 文件夹中?

我还发布了我上面所说的状态的图像。

构建并运行

当我点击 .exe 时:

顺便说一下,颜色显示不同,导致Random.Range代码运行。

【问题讨论】:

我怀疑这是一个“工作目录”问题。当你“构建”然后运行时,“工作目录”就是exe所在的目录,jpg的路径应该是./texture.jpg。我的猜测是“构建并运行”运行 exe,但将工作目录设置为项目目录。 【参考方案1】:

这就是StreamingAssets 文件夹的用途。将运行时加载图形放入其中并使用Application.streamingAssetsPath 变量访问它们。

请参阅the manual 了解更多信息。

【讨论】:

以上是关于Unity - 奇怪的错误,构建与构建和运行的主要内容,如果未能解决你的问题,请参考以下文章

奇怪的构建错误 .Net Core 项目

cmake mingw-w64:尝试构建时出现奇怪的错误

使用 cx-freeze 构建 PySide 程序 osx 的奇怪错误

构建和运行应用程序时出现奇怪的噪音

Android studio,构建kotlin时出现奇怪错误:生成错误代码

使用 conda 在 Windows 上构建 Python 包时出现奇怪的“拒绝访问”错误