Unity打包资源,进行后台加载

Unity打包资源,进行后台加载

需要项目优化的pa you,这边走:Unity项目优化——Web版

一、前言

因为在下载Three.js,所以趁着这个时间写一下资源打包加载吧

小黑在刚开始学习Unity的时候,一是通过教课老师上课讲的知识,二是在网上看一些教程,但里面总会提到,打成AB包。刚开始很好奇,这个AB包到底是什么东东!!!
直到我上班之后,才明白了解了,原来AB包又称为AssetBundle包,就是把一些资源放到后台去加载,但是具体流程是什么呢?这就是小黑今天要带给大家的知识咯。

二、正篇

如何打AB包,分为以下几步

一:把我们的模型拿到

在Unity的Porject中选择你所要打AB包的模型,在Inspector最下面会有模型视图小窗口,当模型还没被动手脚的时候是这样子:
Unity打包资源,进行后台加载_第1张图片
动手后它变为下图所示:
Unity打包资源,进行后台加载_第2张图片

二:模型部分已准备就绪了,接下来就是去打成AB包

1:在Unity中创建特殊文件夹:StreamingAssets
2:导入我们的脚本:PackagingAssetBundle.cs到Editor中
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using System.IO;

public class PackagingAssetBundle : MonoBehaviour
{
	[MenuItem("AssetBundle/Packaging")]
  	private static void PackageBuddle()
 	 {
   	      Debug.Log("Please wait while packing the asset package.....");
  	      string packagePath = Application.dataPath+ "/StreamingAssets";
  	      if (packagePath.Length <= 0 || !Directory.Exists(packagePath))
   	         return;
  	      Debug.Log("Output Path: " + packagePath);
   	      BuildPipeline.BuildAssetBundles(packagePath,BuildAssetBundleOptions.None,BuildTarget.WebGL);
    	      AssetDatabase.Refresh();
   	 }
    }
3:在编辑器上边点击AssetBundle\Packaging

1:打AB包
2:点击之后会出现打包中
3:看下图,粉色框是打包时的提示,红色框是打包完成后的路径提示;
Unity打包资源,进行后台加载_第3张图片
4:看StreamingAssets文件夹下:有两个文件
StreamingAssets文件
到现在,我们的AB包就算打出来了。可它怎么用呢,别着急,接下来就是去使用了;

三、动态加载

1:打开StreamingAssets文件夹

Unity打包资源,进行后台加载_第4张图片

2:我们看到下图,把最大的这个 .unity3d文件给到公司后台,让他和你对接口,给你文档。Unity打包资源,进行后台加载_第5张图片
3:编写我们自己接收文件的的代码
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
using LitJson;
using UnityEngine.Networking;			//这个一定不能忘记

public class CS_Test : MonoBehaviour
{
    void Start(){}
    ///  用来存放模型在后台的路径 
    public static List<string> LuJing = new List<string>();   
    
    /// 
    /// 与PHP后台做交互,取想到的模型,图片或者其他
    /// 
    /// 获取访问模型路径,的一个路径
    /// 字典,key为:所要加载东西的标签或者什么的;value为:后台分辨的结果
    /// 回调函数,可以为null
    /// 
    public static IEnumerator OnGetInfo(string URL ,Dictionary<string, string> requestDic,Action<string> callBack)    
    {
        //表单
        WWWForm form = new WWWForm();
        WWW www;
               
        if (requestDic != null)
        {
            foreach (var item in requestDic)
                form.AddField(item.Key, item.Value);
        }
        else
            form.AddField("测试是否接通","1");
                    www = new WWW(URL, form); 
        yield return www;
        if (www.error != null)
            Debug.LogError("php请求错误,请检查出你的错误:" + www.error);
        else
        {
            if (www.isDone && callBack != null)   
                callBack(www.text);              
        }
    }

    public static IEnumerator ABsCreatGameObject() 
    {
        foreach (var item in LuJing)
        {
            WWW w = new WWW(item);
            yield return w;
            if (w.isDone)
            {
                GameObject[] objs = w.assetBundle.LoadAllAssets<GameObject>();
                foreach (var isitem in objs)
                {
                    GameObject go = Instantiate(isitem);
                }
            }
        }
    }
}

到这里,我们与后台交互的代码基本写完了。接下来我们需要去调用它。

4:调用我们的交互代码与后台要模型
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;

public class CreateModel_ : MonoBehaviour {
    private Dictionary<string, string> dic_CreateModel = new Dictionary<string, string>();   
    void Start ()
    {
        dic_CreateModel.Add("code或者和你们后台对接口", "给后台去对接口");
    }
    private bool isCreateBool = true;   
    
    void OnEnable()
    {
        if (isCreateBool)
        {
            StartCoroutine(CS_Test.OnGetInfo(ToPHPData.DownURL,dic_CreateModel, (string s) => 
            {
                JsonData data = JsonMapper.ToObject(s);
                CS_Test.LuJing.Clear();

                for (int i = 0; i < 5; i++)
                    CS_Test.LuJing.Add(ToPHPData.DownURL + data["data"][i]["model"].ToString());

                if (CS_Test.LuJing.Count != 0)
                    StartCoroutine(CS_Test.ABsCreatGameObject());
            }));
        }
    }
}

/*
 * ok,当我们的该脚本每被激活一次,就会向后台要一次模型并且加载出来,可根据你需要的改写
 */
5:看结果去咯~

1:我们刚运行程序,所以我们的小无人机还没有出现,等1s不到~Unity打包资源,进行后台加载_第6张图片
2:1s不到的时间,我们的无人机出现了,并且出现在我们的层级面板
Unity打包资源,进行后台加载_第7张图片层面面板显示
不过有一点大家要注意,就是我们的模型通过后台加载进来之后,名字后方都有 (Clone) 的字样,在使用模型的时候,肯定要查找,不能把这个忘了

于是乎,我们与后台交互拿模型,数据什么的就大功告成啦!

我们与后台交互拿模型,数据什么的就大功告成啦!

大功告成啦!

成啦!

记得点赞哟!也可以转发给需要的伙伴们

程序的道路上学习永不停止,探索随时进行。
Let’s go. Just do it. We can.

你可能感兴趣的:(Unity)