一、基础

(一)、资源导入

Unity导入资源时:
1.Unity为资源分配唯一ID
2.创建.meta文件
3.对资源进行处理
.meta文件中包含了资源的唯一ID,且与资源文件在同一文件夹下。
如果在unity的窗口之外移动或命名资源,但没更新.meta文件,则对该资源的任何引用都会中断,并且生成新的.meta文件

(二)、Editor文件夹

不管在哪里出现当Unity 编辑的时候都会运行这个文件夹下的内容(也不管有几个)
该文件夹下的代码要加 using UnityEditor;

二、AssetBundle

(一)、什么是AssetBundle

资源打包的形式,将预制体、music、材质等打包成一个文件。

(二)、AssetBundle的使用流程

  • 设置打包对象
  • 生成AssetBundle(需要编码)
  • 上传服务器
  • 下载AssetBundle
  • .加载对象
  • 使用对象
    设置打包对象要将其由None修改为其他需要的
    这样打包出来的文件名为
    zhengfangxing.u3d
    如果多个资源都选择同一个命名方式,则表示这些资源打包成一个AssetBundle
    打包好的每一个文件都会配备一个manifest文件(即资源清单,里面描述了一共有哪些资源)

(三)、打包方法

string path="AB";//打包的相对路劲,和Assets同级
BuildPipeline.BuildAssetBunles(path,BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64);
//第一个参数是打包的路径,第二个参数是打包的方式,第三个参数是打包的目标格式

(四)、打包参数的介绍

BuildAssetBundleOptions下有多个打包方式,主要以下三大类:

None

构建AssetBundle没有任何特殊选项

UncompressedAssetBundle

对ab不进行数据压缩。输入的ab包会很大,不过输入和加载速度快

ChunkBasedCompression

使用lz4的格式压缩ab,ab在加载资源的时候进行解压。默认的压缩格式是lzma,它会在ab下载后立即解压

(有多个预制体用同一个材质时,不对材质进行打包,只打包预制体时,每个预制体打包的时候都会加上材质——增加了包的大小。如果选择材质一起打包,会有单独的材质文件——减少包的大小)

(五)、读取AssetBundle

1.从内存读取

void Start(){
StartCoroutine(fromMemery());
//调用fromMemery方法
}


————————————————————————————————————

IEnumerator fromMemery(){
string path=@"D:\demo\box.u3d";
//获取需要读入内存的预制体路径
string path=@"D:\demo\matertial.u3d";
//获取需要读入内存的材质路径
byte []bytes=File.ReadAllBytes(path);
//将路径下的预制体读取成二进制形式放入内存中
byte []matbytes=File.ReadAllBytes(path);
//将路径下的材质读取成二进制的形式放入内存中
AssetBundle assetBundle=AssetBundle.LoadFromMemory(bytes);
//通过LoadFromMemory方法将内存中的二进制转化为AssetBundle对象
AssetBundle matAssetBundle=AssetBundle.LoadFromMemory(matbytes);
//将材质转化为AssetBundle对象。只要使用到此材质的物体被加载,自动使用该材质
GameObject prefabGo=assetBundle.LoadAsset("Cube") as GameObject;
//通过LoadAsset方法将assetBundle其中的cube游戏物体对象加载
GameObject go =GameObject.Instantiate(prefabGo);
yield return null;
}

2.从文件中读取AssetBundle

void Start(){
StartCoroutine(fromFileOne());
}
_______________________________
Ienumerator fromFileOne(){
string path=@"D:\demo\box.u3d";
//设置要读取的AssetBundle文件路径
AssetBundle asset=AssetBundle.LoadFromFile(path);
prefabGo=assetBundle.LoadAsset("Cube") as GameObject;
GameObject go =GameObject.Instantiate(prefabGo);
}

上面两个方法都是单个资源打包的情况
3.读取多个资源

IEnumerator allFromFile(){
string path=@"D:\demo\allobject.u3d";
AssetBundle asset =AssetBundle.LoadFromFile(path);
//将打包好的资源转化为AssetBundle对象
object[]lists=asset.LoadAllAssets();
//将所有包含的资源都读取出来,放在lists对象数组中
foreach(var go in lists){
GameObject.Instantiate((GameObject)go);
//数组是对象数组,要强转为游戏对象
}
//将数组中的所有对象都创建出来
yield return null;
}

4.WWW无缓存机制
WWW机制可以接受本地的和http的AssetBundle

IEnumerator fromWWW1(){
string path=@"file:///D:\demo\allobject.u3d";
//和之前的不同需要在前面加上file:///
WWW www=new WWW(path);
yield return www;
//加载path下的打包文件
if(!string.IsNullOrEmpty(www.error)){
   
     Delob.log(www.error);
     yield break;
}
//如果没有文件则报错
AssetBundle asset =www.assetBundle;
GameObject prefabGO=asset.LoadAsset("Cube") as GameObject;
GameObject go=GameObject.Instantiate(prefabGo);
yield return null;
}

5.WWW的缓存机制

string path=@"file:///D:\demo\allobject.u3d";
WWW www=WWW.LoadFromCacheOrDownload(path,1);
//先查看缓存中是否有版本号为1的目标资源,若没有则从path路径下载该资源
yield return null;

6.unityWebRequest(官方常用)

要导入命名空间 UnityEngine.Networking;

Ienumerator from UnityWebRequest(){
  string path=@"file:///D:\demo\allobject.u3d";
  UnityWebRequest unityWebRequest;
  unity WeRequest=UnityWebRequestAssetBundle.GetAssetBundle(path);
  //获取路径下的打包文件
  yield return UnityWebRequest.SendWebRequest();
  //发送以获得的打包文件
  AssetBundle assetBundle=DownloadHandlerAssetBundle.GetContent(unityWebRequest);
  //接受打包文件
  GameObject prefabGO=asset.LoadAsset("Cube") as GameObject;
GameObject go=GameObject.Instantiate(prefabGo);
yield return null;
}