zoukankan      html  css  js  c++  java
  • 《搬砖日记》AssetsBundle实现资源更新及通过反射添加脚本

    该随笔分两部分,第一部分 AssetsBundle实现游戏物体和代码的打包,第二部分游戏物体和代码的加载及通过反射添加脚本

    一. AssetsBundle打包

    1.在Assets中新建文件夹Editor,并在Editor中新建C#脚本,编写以下内容,

    using UnityEditor;
    using System.IO;
    
    public class CreatAssetsBundle
    {
        [MenuItem("AssetsBundle/Build AssetBundles")]
        static void BuildAllAssetBundles()//进行打包
        {
            string dir = "AssetBundles";
            //判断该目录是否存在
            if (Directory.Exists(dir) == false)
            {
                Directory.CreateDirectory(dir);//在工程下创建AssetBundles目录
            }
            //参数一为打包到哪个路径,参数二压缩选项  参数三 平台的目标
            BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
        }
    }

    此时Unity菜单栏中会多出

    2.打开VS新建类库(我使用的是VS2015),注意使用 .NEt Framework3.5 高版本的Unity不支持

    在项目中新建CubeTest.CS文件,将测试脚本内容编写进去

     

      此时会发现有报错,是因为我们没有添加Unity类库的引用,右键引用为工程添加UnityEngine.dll引用,UnityEngine.dll引用在安装目录下的  /Unity/Editor/Data/Manager/UnityEngine.dll

     

    然后生成解决方案,在输出栏中可以看到生成的解决方案的所在路径

    我们将生成的.dll文件后缀名改为.bytes并将文件放入Unity项目中

    3.项目中新建Cube并将Cube变成预制体,通过New 修改红框中的内容

    修改ABTest.bytes,注意要和Cube预制体的一样

    4.点击菜单栏中AssetsBundle/Build AssetBundles,这时会在 AssetBundles 文件夹中生成我们自己定义的assetbundle文件,其中 cubeab.ab是我们的资源文件, cubeab.ab.manifest文件是我们的配置文件,用记事本打开cubeab.ab .manifest文件,可以看到我们打包的预制体

    到此为止预制体和代码的打包就完成了

    二. AssetsBundle加载及通过反射添加脚本

    1.将步骤一生成的 cubeab.ab和cubeab.ab.manifest文件放入本地服务器

    2.新建Unity工程在空物体上添加 LoadAssetbundles.cs 脚本

    using UnityEngine;
    using System.Collections;
    using UnityEngine.Networking;
    using System.Reflection;
    using System;
    using System.IO;
    using System.Net;
    
    public class LoadAssetbundles : MonoBehaviour
    {
        IEnumerator Start()
        {
            //本地服务器assetbundle文件存放路径
            string path = "http://localhost/AssetBundle/cubeab.ab";
            //通过WWW加载assetbundle文件,1代表版本号
            WWW www = WWW.LoadFromCacheOrDownload(path, 1);
            yield return www;
            //取得www中的assetBundle
            AssetBundle ab = www.assetBundle;
            //将.bytes文件转化为TextAsset
            TextAsset text = ab.LoadAsset("ABTest.bytes", typeof(TextAsset)) as TextAsset;
            //转化为byte数组
            byte[] by = text.bytes;
            //通过反射获取CubeTest类
            Assembly am = Assembly.Load(by);
            Type type = am.GetType("CubeTest");
            //将assetBundle中的物体加载出来放入数组中
            GameObject[] obj = ab.LoadAllAssets<GameObject>();
            //在场景中生成assetBundle中的物体
            foreach (GameObject o in obj)
            {
                Instantiate(o);
            }
            //给生成的游戏物体添加 CubeTest脚本
            GameObject.Find("Cube(Clone)").AddComponent(type);
        }
       
    
    }

    3.运行Unity

  • 相关阅读:
    大三学习进度55
    大三学习进度56
    深入理解Java:注解(Annotation)自定义注解入门
    Django2实战示例 第三章 扩展博客功能
    Django2实战示例 第二章 增强博客功能
    12月07日总结观影数据集之大数据分析数据清洗
    12月06日总结
    12月04日阅读笔记
    12月03日总结
    12月05日总结
  • 原文地址:https://www.cnblogs.com/YorkZhao/p/10064163.html
Copyright © 2011-2022 走看看