admin 管理员组

文章数量: 887007

Unity3D中项目在Unity编辑器下正常运行打包成功exe后无法正常运行

一、遇到的情况描述:

  • 项目中涉及到了文件读取的相关操作

  • 项目在Unity下能够正常获取到文件信息并且不报错

  • 项目能够成功打包并且不报错

  • 项目打包成exe后或者apk安装成功后项目无法正常运行。

二、可能出现的原因:

  • 项目运行逻辑有问题(首要考虑)

解决方法:首先在Unity编辑模式下,先运行游戏,测试游戏的整体情况,是否逻辑上本上就有问题。

  • 项目无法获取到配置信息

原因:通过查阅相关资料了解到的是这个跟Unity自己本身打包后,文件的管理有关系。

Application.dataPathApplication.streamingAssetsPathApplication.persistentDataPathApplication.temporaryCachePath
IOSApplication/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/DataApplication/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data/RawApplication/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/DocumentsApplication/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Library/Caches
Android/data/app/xxx.xxx.xxx.apkjar:file:///data/app/xxx.xxx.xxx.apk/!/assets/data/data/xxx.xxx.xxx/files/data/data/xxx.xxx.xxx/cache
Windows/Assets/Assets/StreamingAssetsC:/Users/xxxx/AppData/LocalLow/CompanyName/ProductNameC:/Users/xxxx/AppData/Local/Temp/CompanyName/ProductName
Mac/Assets/Assets/StreamingAssets/Users/xxxx/Library/Caches/CompanyName/Product Name/var/folders/57/6b4_9w8113x2fsmzx_yhrhvh0000gn/T/CompanyName/Product Name
Windows WebPlayerfile:///D:/MyGame/WebPlayer (即导包后保存的文件夹,html文件所在文件夹)
//原来代码
 document.Load(Application.dataPath + "/Data/xxxx.xml"); 

解决方法:

根据文件的类型,选择对应的加载和路径:

我的解决方法是:在Assets目录下创建StreamingAssets,将Data目录放置进去及解决问题

将代码改为:

 document.Load(Application.streamingAssetsPath + "/Data/xxxx.xml"); 

三、反思:

平常自己在学习代码的过程中,没有遇到过这种类似的问题,今天也是在打包一个手机项目的时候才偶然发现,不过受益匪浅。

四、补充:
这段时间自己做的那个游戏打包成了Apk后,我的发现:

  • 首先是通常编辑模式下的运行结果不代表最终测试结果

  • 其次是做单机本地数据存储的游戏,打包成了exe并且成功运行,不代表在apk状态下就能够成功运行,这就跟Unity的打包机制有关了,在exe程序下的文件读取和Android状态下的文件读取是不一样的,详情就如下链接可知。

  • Android环境下的streamingAssetsPath读取的文件,但是其中出现的问题也比较多,当博主将txt文档与xml文档放置到一个文件夹下后又变得无法进行信息读取,博主就很纳闷了。莫非是因为txt文档内容无法转成二进制数据吗?懂行的大佬看到这可以给点建议吗?毕竟这几天为了这个问题一直在纠结。虽然效果实现了,但是为何两种格式的文件在一起时却又无法进行读取了这是什么原理

  • 针对于xml文件的读取,博主又了解到一种新的方式,可以直接通过Resources.Load加载文件,但是有一个缺点就是Resources会封装死这个文件,从而导致无法对xml文件进行热更(没错,就是更新,所以该种方式仅仅针对于单机游戏而言可以一试)

代码:(亲测,有效)

XmlDocument xmlDoc=new XmlDocument();
TextAsset textAsset = (TextAsset)Resources.Load("xml文件名称但不包含拓展名",typeof(TextAsset));

xmlDoc.LoadXml(textAsset.text);
  • 针对于需要进行热更的可以选择通过这种方式:使用Application.persistentDataPath来操作文件
    该文件存在手机沙盒中,因此不能直接存放文件,
    1. 通过服务器直接下载保存到该位置,也可以通过md5码比对下载更新新的资源
    2. 没有服务器的,只有间接通过文件流的方式从本地读取并写入Application.persistentDataPath文件下,然后再通过Application.persistentDataPath来读取操作。
      注:在Windows / Mac电脑 以及Android、iPad、iPhone都可对文件进行任意操作,另外在iOS上该目录下的东西可以被iCloud自动备份。

详细参考的链接有如下:

https://blog.csdn/keneyr/article/details/99437149

https://blog.csdn/linxinfa/article/details/51679528

https://blog.csdn/itsxwz/article/details/80594334

https://wwwblogs/coolbear/p/9262101.html

https://wwwblogs/bw1219/p/9555863.html

https://blog.csdn/u010377179/article/details/52922727

https://blog.csdn/gameboy_ai/article/details/79713742

https://gameinstitute.qq/community/detail/117646

https://blog.csdn/BillCYJ/article/details/99712313

公众号:平平无奇代码猴
也可以搜索:Jackiie_wang 公众号,欢迎大家关注!欢迎催更!留言!

本文标签: 正常运行 编辑器 项目 Unity3D exe