首页 > Unity3D频道 > 【Unity杂文】 > Unity3D研究院之手游开发中所有特殊的文件夹
2014
09-26

Unity3D研究院之手游开发中所有特殊的文件夹

这里列举出手游开发中用到了所有特殊文件夹。

Unity3D研究院之手游开发中所有特殊的文件夹 - 雨松MOMO程序研究院 - 1

1.Editor

Editor文件夹可以在根目录下,也可以在子目录里,只要名子叫Editor就可以。比如目录:/xxx/xxx/Editor  和 /Editor 是一样的,无论多少个叫Editor的文件夹都可以。Editor下面放的所有资源文件或者脚本文件都不会被打进发布包中,并且脚本也只能在编辑时使用。一般呢会把一些工具类的脚本放在这里,或者是一些编辑时用的DLL。 比如我们现在要做类似技能编辑器,那么编辑器的代码放在这里是再好不过了,因为实际运行时我们只需要编辑器生成的文件,而不需要编辑器的核心代码。

2.Editor Default Resources

Editor Default Resources注意中间是有空格的,它必须放在Project视图的根目录下,如果你想放在/xxx/xxx/Editor Default Resources 这样是不行的。你可以把编辑器用到的一些资源放在这里,比如图片、文本文件、等等。它和Editor文件夹一样都不会被打到最终发布包里,仅仅用于开发时使用。你可以直接通过EditorGUIUtility.Load去读取该文件夹下的资源。

3.Gizmos

我觉得这个文件夹其实没什么用处,如下代码所示它可以在Scene视图里给某个坐标绘制一个icon。它的好处是可以传一个Vecotor3 作为图片显示的位置。 参数2就是图片的名子,当然这个图片必须放在Gizmos文件夹下面。

如果只想挂在某个游戏对象身上,那么在Inspecotr里面就可以直接设置。。

Unity3D研究院之手游开发中所有特殊的文件夹 - 雨松MOMO程序研究院 - 2
这里还是要说说OnDrawGizmos()方法,只要脚本继承了MonoBehaviour后,并且在编辑模式下就会每一帧都执行它。发布的游戏肯定就不会执行了,它只能用于在scene视图中绘制一些小物件。比如要做摄像机轨迹,那么肯定是要在Scene视图中做一个预览的线,那么用Gizmos.DrawLine 和Gizmos.DrawFrustum就再好不过了。

4.Plugins

如果做手机游戏开发一般 andoird 或者 ios 要接一些sdk 可以把sdk依赖的库文件 放在这里,比如 .so .jar .a 文件。这样打完包以后就会自动把这些文件打在你的包中。

5.Resources

可以在根目录下,也可以在子目录里,只要名子叫Resources就可以。比如目录:/xxx/xxx/Resources  和 /Resources 是一样的,无论多少个叫Resources的文件夹都可以。Resources文件夹下的资源不管你用还是不用都会被打包进.apk或者.ipa

Resource.Load :编辑时和运行时都可以通过Resource.Load来直接读取。

Resources.LoadAssetAtPath() :它可以读取Assets目录下的任意文件夹下的资源,它可以在编辑时或者编辑器运行时用,它但是它不能在真机上用,它的路径是”Assets/xx/xx.xxx” 必须是这种路径,并且要带文件的后缀名。

AssetDatabase.LoadAssetAtPath():它可以读取Assets目录下的任意文件夹下的资源,它只能在编辑时用。它的路径是”Assets/xx/xx.xxx” 必须是这种路径,并且要带文件的后缀名。

我觉得在电脑上开发的时候尽量来用Resource.Load() 或者 Resources.LoadAssetAtPath() ,假如手机上选择一部分资源要打assetbundle,一部分资源Resource.Load().那么在做.apk或者.ipa的时候 现在都是用脚本来自动化打包,在打包之前 可以用AssetDatabase.MoveAsset()把已经打包成assetbundle的原始文件从Resources文件夹下移动出去在打包,这样打出来的运行包就不会包行多余的文件了。打完包以后再把移动出去的文件夹移动回来。

6. StreamingAssets

这个文件夹下的资源也会全都打包在.apk或者.ipa 它和Resources的区别是,Resources会压缩文件,但是它不会压缩原封不动的打包进去。并且它是一个只读的文件夹,就是程序运行时只能读 不能写。它在各个平台下的路径是不同的,不过你可以用Application.streamingAssetsPath 它会根据当前的平台选择对应的路径。

有些游戏为了让所有的资源全部使用assetbundle,会把一些初始的assetbundle放在StreamingAssets目录下,运行程序的时候在把这些assetbundle拷贝在Application.persistentDataPath目录下,如果这些assetbundle有更新的话,那么下载到新的assetbundle在把Application.persistentDataPath目录下原有的覆盖掉。

因为Application.persistentDataPath目录是应用程序的沙盒目录,所以打包之前是没有这个目录的,直到应用程序在手机上安装完毕才有这个目录。

StreamingAssets目录下的资源都是不压缩的,所以它比较大会占空间,比如你的应用装在手机上会占用100M的容量,那么你又在StreamingAssets放了一个100M的assetbundle,那么此时在装在手机上就会在200M的容量。

今天就到这里了,如果有问题欢迎大家与@雨松MOMO一起讨论。嘿嘿。

 

雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!

--

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。

  1. 关于StreamAssets文件夹和persistentDataPath文件夹下会出现2份资源的情况(当然可能版本不同所以资源有所区别,但是原理还是第一次安装好游戏后登陆游戏,将StreamAssets里的资源拷贝到persistentDataPath目录下,然后以后根据版本来判断是否要下载新资源至persistentDataPath目录。),那是不是可以在游戏打包的时候,只在StreamAssets里放一些必要的资源比如加载进度条的界面资源。这样不管是第一次安装游戏后运行还是之后的运行,都去判断persistentDataPath目录。如果里面没东西说明是第一次安装第一次运行,那就直接下载资源包。从而代替打包时讲资源放入StreamAssets?

  2. 大神,你好。我想问一下生成安卓安装包,安装在安卓上后streamingassets下的文件在哪?我在这个文件夹下放了个html文件,但是通过localhost = “jar:file://” + Application.dataPath + “!/assets/CommandPoint.html”;WWW www = new WWW(path);显示的是jar:file///data/app/com.air.ProductName-1.apk!/assets/CommandPoint.html,但是我查看文件并没有这个路径,这是怎么回事?

  3. momo,编辑时或者编辑器运行 两者有啥分别么?只不过AssetDatabase.LoadAssetAtPath要引用UnityEditor命名空间 直接打包会报错,其他也没什么分别啊 Unity3D研究院之手游开发中所有特殊的文件夹 - 雨松MOMO程序研究院 - 1

  4. 雨大神,你好。请问WWW能好像不能指定到下载到本地目录吧?是不是用WWW下载读出来,然后以文件的形式写到 Application.persistentDataPath?

  5. 松哥,我是不是可以这样理解:游戏中的两种资源一种是内部资源(放到resources直接打包到程序),一种是外部资源assetbundle。assetbundle加载进来再拷贝到presistentDataPath。当资源需要更新的时候在把presistentDataPath下的资源覆盖掉。这样其实根本就不用streamingAsset目录?

    • 建议你把 自带的一部分资源放在resources下。 加载资源的逻辑是先判断assetbundle里有这个资源没,如果没有就从resources里读,如果有就从assetbundle里读, 完全可以抛弃streamingAsset。

    • 研究了一下,原来不是反射不了,而是UnityEdtior没有UnityEditor.ObjectBrowser类,只找到一个相近的UnityEditor.ProjectBrowser,但还是想知道插件实现的效果。

  6. 雨松问你下,一般游戏目录都像本文最初的那张图吗?我在想游戏内的prefab文件夹还是model之类的是放在resource底下还是放在asset底下。我要用resource.load,然后就把所有prefab移动到了resource下,因为我不确定哪些用哪些不用,我的小伙伴不同意,他觉得我是强制让文件继承了resource属性。我的做法对吗?还是外部asset/resource/prefabs下面只放个A,然后外面的asset/prefabs下面再放个ABC?求推荐合理的做法或者大众的做法

  7. 大神,我在StreamingAssets文件夹下写了个xml文件,我在程序中更新,在编辑器仲可以正常执行,在iOS真机就报错了,程序不能正常执行,这个问题怎么处理呢?

  8. StreamingAssets目录下的资源都是不压缩的,所以它比较大会占空间,比如你的应用装在手机上会占用100M的容量,那么你又在StreamingAssets放了一个100M的assetbundle,那么此时在装在手机上就会在200M的容量。这个意思是放在StreamingAssets里面的文件会占用2倍体积吗?包里面占一份,目录里面占一份?

    • 比如把assetbundle放在StreamingAssets 然后用 http://www.DownLoadOrCache 去读取资源 ,那么资源就变成两份了 一份在 StreamingAssets 另一份在 是解压过的放在了cache里面。。 或者不用www.DownLoadOrCache 读取 可以资源一旦需要更新, 那么下载的新的assetbundle 就要保存在Application.persistentDataPath 然而之前打包的时候保存在StreamingAssets的老资源 又不能删除。。所以资源就两份了。。。

      • 哦,不用DownLoadOrCache读取就行了如果有更新的话无论放在Resource还是StreamingAssets都会两份吧。。。

  9. 看了assetbundle那里很有帮助,起先还以为是这样的:进入游戏了联网判断一下资源的版本,如果资源没有更新,用StreamingAssets目录下的assetbundle,如果有更新,就用persistentDataPath下面的assetbundle。