为啥C#脚本不能会直接更新?
因为计算机中的CPU只认识二进制码,所以CPU执行的都是一串串的二进制码。对于C#而言,它的编译和执行过程如下:
1.C#通过编译器(CSC)生成程序集(dll/exe),程序集内部是由微软中间语言(MSIL)组成。在这个过程中,CSC会检查错误,看是否符合C#的语言规范。
2.当运行程序集的时候,公共语言运行时(CLR)中的JIT会将程序集中的中间语言(MSIL)转换成本地平台的CPU指令,然后将指令传给CPU执行。
3.CPU运行该指令,程序开始运行。
c#运行时需要编译,经过编译后转化为CIL程序集(通用中间语言(Common Intermediate Language,简称CIL),再通过JIT(即时编译(JIT)是指字节码在CPU执行时被立即转换成机器码)转换为平台可识别的机器码。编译过程移动平台时是无法完成的。
热更新实现方式:
1.使用lua脚本,通过脚本调用C#方法。lua跨平台,无序编译。
2.使用C#Light
3.使用C#反射技术
1.AssetBundle(简称AB包)是一个资源压缩包,包含模型、贴图、预制体、声音、甚至整个场景,可以在游戏运行的时候被加载;
2.AssetBundle自身保存着互相的依赖关系;
3.压缩包可以使用LZMA和LZ4压缩算法,减少包大小,更快的进行网络传输;
4.把一些可以下载内容放在AssetBundle里面,可以减少安装包的大小;
它是一个存在于硬盘上的文件。可以称之为压缩包。这个压缩包可以认为是一个文件夹,里面包含了多个文件。这些文件可以分为两类:serialized file 和 resource files。(序列化文件和源文件)
-
serialized file:资源被打碎放在一个对象中,最后统一被写进一个单独的文件(只有一个)
-
resource files:某些二进制资源(图片、声音)被单独保存,方便快速加载,可以Editor上读取,方便查看它是一个AssetBundle对象,我们可以通过代码从一个特定的压缩包加载出来的对象。这个对象包含了所有我们当初添加到这个压缩包里面的内容,我们可以通过这个对象加载出来使用。
https://blog.csdn.net/qq_35361471/article/details/82854560
https://www.jianshu.com/p/5226659533cd
编辑器扩展代码需要放在Assets/Editor 目录下
[MenuItem("Assets/Build AssetBundles")]
static void BuildAllAssetBundles()
{
string assetBundleDirectory = "Assets/AssetBundles";
if(!Directory.Exists(assetBundleDirectory))
{
Directory.CreateDirectory(assetBundleDirectory);
}
BuildPipeline.BuildAssetBundles(assetBundleDirectory,
BuildAssetBundleOptions.None,
BuildTarget.StandaloneWindows);
}
void Start()
{
AssetBundle bundle = AssetBundle.LoadFromFile("Assets/AssetBundles/a/b");
GameObject obj = bundle.LoadAsset<GameObject>("Cube");
Instantiate(obj);
// Object[] assets = bundle.LoadAllAssets();
// foreach (var obj in assets)
// {
// Debug.Log(obj.name);
// Instantiate(obj);
// }
}
AssetBundle分组策略:
- 经常更新的包放在一个包里,不经常的包分离。
- 需要同时加载的资源放在一个包里面,相互依赖的会打包在一起,重复问题。
- 共享资源放在一起
- 同一资源多个版本,后缀区分。
BuildAssetBundleOptions
- None:使用LZMA算法压缩,压缩包下,但是加载时间长,需要整体解压。一旦解压,可以用LZ4二次压缩到本地,不会整体解压。下载时使用LZMA,下载后在使用LZ4保存到本地。
- UnCompressedAssetBundle:不压缩。
- ChunkBasedCompression:使用LZ4压缩,加载指定资源,不整体解压。
AssetBundles.manifest------对应设置的信息
被压缩物体的路径以及依赖物体的路径。
void Start()
{
//需要把依赖的包也进行加载,否则丢失依赖数据
AssetBundle bundle1 = AssetBundle.LoadFromFile("Assets/AssetBundles/test/res");
AssetBundle bundle = AssetBundle.LoadFromFile("Assets/AssetBundles/profabs/cube2");
GameObject obj = bundle.LoadAsset<GameObject>("Cube2");
Instantiate(obj);
}
load的方式
- AssetBundle.LoadFromMemoryAsync
- AssetBundle.LoadFromFile
- AssetBundle.LoadFromStream
- WWW.LoadFromCacheOrDownLoad(舍弃)
- UnityWebRequest
卸载资源:
-
AssetBundle.UnloadAllAssetBundles() true:卸载所有,false卸载未使用的包
- Resource.UnloadAsset /UnloadUnusedAssets
文件校验 CRC MD5 SHA1
问题:
图集重复。不指定packing tag 默认打包在一起。
搜索工具:Asset Bundle Browser