1.首先,你得理解Unity中各个目录的意思?

我这里说的是移动平台(安卓举例),读,写。所谓读,就是你出大版本的包之后,这个只读的话,就一辈子就这些东西了,不会改变了,不会有其他资源来覆盖或者增加啦。

可写,就是可以加东西进去呗。可能是自己太笨,一开始没怎么注意这意思。竟然往StreamingAssets去实现资源更新(天啦撸)。

Application.StreamingAssetsPath,

StreamingAssets目录必须在Assets根目录下,该目录下所有资源也会被打包到游戏里,不同于Resources目录,该目录下的资源不会进行压缩,同样是只读不可写的。
这里的只可读,不可写,就是除了出大版本的包(重新下载),这里面的东西永远不会变。

  各平台StreamingAssets路径打印: 
  Win:E:/myProj/Assets/StreamingAssets 
  Mac : /myProj/Assets/StreamingAssets 
  Andorid:jar:file:///data/app/com.myCompany.myProj-1/base.apk!/assets 
  iOS: /var/containers/Application/E5543D66-83F3-476D-8A8F-49D5332B3763/myProj.app/Data/Raw

Application.PersistentDataPath

   应用程序安装后才会出现。该目录独特之处在于是可读,可写的,所以我们一般将下载的AssetBundle存放于此。
  各平台PersistentDataPath路径打印: 
  Win:C:/Users/lodypig/Appdata/LocalLow/myCompany/myProj 
  Mac : /Users/lodypig/Library/Application Support/myCompany/myProj 
  Andorid:/data/data/com.myCompany.myProj/files 
  iOS: /var/mobile/Containers/Data/Appliction/A112252D-6B0E-459Z-9D49-CD3EAC6D47D/Documents

Application.DataPath

  应用程序目录,即Assets目录。使用Appliction.dataPath访问。只读不可写。
  各平台DataPath路径: 
  Win:E:/myProj/Assets 
  Mac : /myProj/Assets/ 
  Andorid:/data/app/com.myCompany.myProj-1/base.apk! 
  iOS: /var/containers/Application/E5543D66-83F3-476D-8A8F-49D5332B3763/myProj.app/Data

综上,也就是说,要实现资源更新,你只有把资源下载到Application.PersistentDataPath目录下才可实现资源更新(增加或者替换),其他目录不可能实现。

2.理解上面三种目录的关系,Unity游戏加载的资源是如何分配的?(彼此的关系)

首先你得有一个资源服务器(FTP为例),因为StreamingAssets目录是只读的,我们想要实现热更新,StreamingAssets

目录里面的东西一旦第一个版本打出APK的包之后,这里的东西将永远不会变(只读)。由于PersistentDataPath目录是可读可写的,

所以游戏下载资源都会下载到这里面。这样就实现了资源的热更新。

注解:绿色的代表流动,可以不断可以改变的资源。红色线代表,读取persistent目录没有的情况下,读StreamingAssets目录,所以,是永远不变的资源。(除非你去重新下载一个apk的包,就不是热更了)

3.如何加载本地的资源?

首先优先判断PersistentDataPath目录下的资源是否存在,因为服务器上的资源都是下载到这里的,最新的资源通过下载到这里并且覆盖,这里的资源

能保持跟服务器一致。(雨松之前讲的UnityAssetBundle例子就是通过加载服务器上的,那个只是一个小案例,不能每次用哪下载到哪,每次都要下载,

这种方式是很不好用的,就第一次用的时候如果资源与服务器不一致,就下载到本地中,即PersistentDataPath目录。)

因为每个游戏一开始出大版本的时候,都会附带大量资源,就是放在StreamingAssets目录,所以,这里存放大量资源。这样减少下载的次数。

其实,换一种说法,PersistentDataPath完全是给StreamingAssets的补丁目录,我是这样理解的。当然,在项目运用中,都需要优先最先资源判断。

4.遇到的那些神神神.....坑?

(1) 不要以为在PC端可以加载的路径,安卓也可以用。

  我这边因为涉及到WWW加载,贴出我的。

  这里主要是通过www 如何加载PersistentDataPath和StreamingAssets这两个目录。

  Application.PersistentDataPath:

    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/// <summary>
   /// 天呐,一个Per目录,还两种方法加载。这真的是最后我找出来最完美的,可以加载的,之前还有N种版本,就不提了,网上有,我是经过实测,Unity5.3.4版本
   /// 加载PC上安卓平台,加载PC上Standalone,加载安卓真机(APK包),这三个,都是可以加载的(WWW加载),
   /// </summary>
   public static string PERSISTENT_PATH_DATABASE //= LGameConfig.LOCAL_URL_PREFIX + Application.persistentDataPath + "/DataBase/";
   {
       get
       {
           #if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN
                   return   "file:///"+ Application.persistentDataPath + "/Test/";
           #else
                         return   "file://"+ Application.persistentDataPath + "/Test/";
           #endif
       }
   }

  Application.StreamingAssets:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static string STREAMING_PATH_DATABASE
    {
        //这样写,因为安卓Unity平台是Application.isMobilePlatform==false, 而宏定义中又  ==UNITY_ANDROID。
         //因为我们项目中是需要同时在PC下安卓平台和PC下 Standard平台,哈哈
        get
        {
            if (!Application.isMobilePlatform)
            {
                return "file://" + Application.dataPath + "/StreamingAssets" "/DataBase/";
            }
            else
            {
                return
#if UNITY_ANDROID
        Application.streamingAssetsPath+  "/DataBase/";
#else
      "file://" + Application.dataPath + "/StreamingAssets" "/DataBase/";
#endif
            }
        }

  这个加载地址,真的是精华,可能自己太笨,就是搞这个WWW加载安卓StreamingAssets目录,花了大把时间,因为网上,加载方式真的是尼玛一万种,要喷一下,这些人,不实际打到APK测一下,我MDGB呀,坑的我好惨。

 (2)不要以为在PC端可以用的方法,在安卓也可以用。

   

      安卓上跟其他平台不一样,安装后,这些文件实际上是在一个Jar压缩包里,所以不能直接用读取文件的函数去读,而要用WWW方式
      读取的代码(假设名为"文件.txt")

 (3) 安卓资源路径加载,下载问题,真的是这次做AssetBundle最大的障碍。

(4)通过FTP和CDN下载资源的时候对应的 后缀是不同的。

FTP下载 后面用   "/"  ,即可。

CDN下载 后面用  "//" ,即可。

(5)不同的加载方式,加载的路径也是不同的。

具体我就不说了。

(6)记得加 加载文件的后缀名

安卓上跟其他平台不一样,安装后,这些文件实际上是在一个Jar压缩包里,所以不能直接用读取文件的函数去读,而要用WWW方式
1.读取的代码(假设名为"文件.txt")

(7)加载方式,First In PersistentDataPath,Then StreamingAssets

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
IEnumerator LoadAnouncementText()
    {
        string strUrl = GetTxtPerststentUrl(anouncementText);
        WWW www = new WWW(strUrl);
        yield return www;
        if (www.error == null)
        {
            mAnoucementText = ConvertByteToString(www.bytes);
        }
        else if (www.isDone)
        {
            string strPerUrl = GetTxtStreamUrl(anouncementText);
            www = new WWW(strPerUrl);
            yield return www;
            if (www.error == null)
            {
                mAnoucementText = ConvertByteToString(www.bytes);
            }
            else if (www.isDone)
            {
                Debug.LogError("下载当前表出错"  + www.error.ToString());
            }
        }
    }
string GetTxtStreamUrl(string name)
    {
        return STREAMING_PATH_DATABASE + name + ".txt";
    }
    string GetTxtPerststentUrl(string name)
    {
        return PERSISTENT_PATH_DATABASE + name + ".txt";
    }!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!补充!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!补充:对于上面的路径问题大家可能有些困惑。贴出最详细全面的路径问题,经过测试,完全没问题(安卓,PC都可以用,实际项目中使用)

 string GetScenePath(string fileName){string path =DataUrl.GetFilePersistentUrl(fileName)+".unity3d";// string path= DataUrl.LOCAL_URL_PREFIX + Application.dataPath + "/StreamingAssets/" + "Scene_Main" + ".unity3d";//读取Per目录的时候不需要加prefix,但是读取Streaming目录时候需加上prefixbool isPersistentDataPath = System.IO.File.Exists(path);if (!isPersistentDataPath){path =  DataUrl.GetFileStreamingUrl(fileName)+ ".unity3d";if (!System.IO.File.Exists(path)){Debug.LogError("Per,Stream目录 scene bundle都不存在");return null;}}return DataUrl.LOCAL_URL_PREFIX+ path;}DataUrl.cs
public static string GetFilePersistentUrl(string path){return Application.persistentDataPath+"/" + path;}public static string GetFileStreamingUrl(string path){return Application.streamingAssetsPath+"/" + path;}
#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WINpublic static readonly string LOCAL_URL_PREFIX = "file:///";
#elsepublic static readonly string LOCAL_URL_PREFIX="file://";
#endif

unity3d 各个目录的意思相关推荐

  1. Unity3D与VS2008结合,加快Unity3D C#开发!

    Unity3D中所使用的编程语言有三种:C#,JS和BOO.同时自带了免费的编辑器,然而在windows下,编辑器还是VS最强大,所以本文就探讨如何配合Unity3D使用VS2008.1.创建一个Un ...

  2. Unity3D调用Android提供的接口

    需求:Android提供相关的接口,android只提供接口,没有相关的界面,android接口打包以jar包的形式供Unity3D调用 1.编写相关的android接口 在studio中新建工程,并 ...

  3. Unity3D使用腾讯广点通广告

    目前,游戏开发平台有很多,今天咱们主要介绍Unity3d开发的Android游戏加广点通广告. 1. 下载广点通SDK 广点通网址:http://e.qq.com/dev/index.html 在 流 ...

  4. Unity3d AndroidJNI两篇应用示例。羽化的文章。

    http://blog.csdn.net/libeifs/article/details/7110371 Unity Android平台AdMob应用 开发环境 Window7 Unity3D  3. ...

  5. 反编译Unity3d 中的dll文件

    一.步骤实现 1.下载反编译工具,目前,我使用的是ILSpy,打开工具,得到如下界面 2.点击File后得到如下界面 3.单击 "打开" 按钮,选择Unity3d 安装目录下的dl ...

  6. Unity3d中使用3dwarehouse模型

    1.在3dwarehouse中下载模型skp. 2.下载完成后用sketchup打开模型,选择模板时选择"米"为单位. 3.选择菜单[文件][导出][三维模型],打开导出对话框.选 ...

  7. unity android 启动,Android启动Unity

    例如在一个android项目中,点击一个按钮,启动unity for android. 1.首先在Unity 引擎中将Unity3D项目build一下,需要在build settings--> ...

  8. IOS设备兼容Ipv5/ipv6访问Ipv4服务器

    本文转载自:http://www.manew.com/thread-90569-1-1.html 这几天接到运营的一个苹果版 强制性需求,也就是 客户端 网络环境在 ipv4/ipv6 的情况下都能访 ...

  9. Unity-Android常见的那些骚操作

    老规矩,先安装unity,再安装安卓平台,安装AndroidStudio ,安装JDK,安装SDK 配置JDK 环境,在Unity里面引用SDK 和 JDK Unity中的Android Build ...

最新文章

  1. AI领域「听风者」:声纹识别5大核心知识点!
  2. 无需Grouping,中科大和微软亚研院提出Group-Free的三维物体检测方法,性能远超之前最好方法。...
  3. Redis 主从复制(replication)
  4. deeplearning4j – 分布式DL开源项目
  5. Windows Mobile Widget Emulator
  6. mysql常见数据库设计_常见数据库设计
  7. 使用代理_工具的使用|MSF搭建socks代理
  8. 淘宝技术发展(分布式时代:服务化)
  9. c语言中空格字符怎么表示_C语言中常用的字符串操作函数
  10. PThread 学习笔记
  11. 一个按键控制数码管的开和关_单片机是否能用一个按键控制数码管的显示图?...
  12. bootstarp怎么使盒子到最右边_江湖救急!盒子显示“很抱歉Launchercust 已停止运行” ?...
  13. Android自定义View研究(六)--View中的原点坐标相关问题
  14. 局部特征提取-LBP算法
  15. matlab不显示x,y,z轴
  16. 关于MUI一个很实用的前端框架
  17. 技术岗的职业规划_银行信息技术岗职业规划范文
  18. (转)移动端自适应方案
  19. 【python】身份证识别
  20. 蓝桥杯 填空题 水题 等差素数列 C++ 简单暴力枚举

热门文章

  1. putty连虚拟机中Linux出现Access Denied
  2. 对qps、tps、pv、uv的理解
  3. leetcode 106. 从中序与后序遍历序列构造二叉树 105. 从前序与中序遍历序列构造二叉树思考分析
  4. TensorFlow的可训练变量和自动求导机制
  5. Python中的append()和extend()
  6. strictmath_Java StrictMath log1p()方法与示例
  7. 操作系统 系统开销比率_操作系统中的最高响应比率下一个(HRRN)调度
  8. No module named ‘skimage.metrics‘在Anaconda3中的解决方法
  9. javaEE的开发模式
  10. ffmpeg进行混音,将两路音频pcm数据合成一路输出