HybridCLR(华佗热更)

工具类

using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using UnityEngine;

public class ABManager 
{
    public static Dictionary<string, byte[]> assetDatas = new Dictionary<string, byte[]>();
    public static byte[] GetAssetData(string dllName)
    {
        return assetDatas[dllName];
    }
    public static AssetBundle LoadAB(string dllName)
    {
        return AssetBundle.LoadFromMemory(GetAssetData(dllName));
    }
    public static T Load<T>(string abName,string assetName) where T : UnityEngine.Object
    {
        AssetBundle ab = LoadAB(abName);
        return ab.LoadAsset<T>(assetName);
    }
    public static Type LoadScript(string abName,string assetName)
    {
        Assembly ass = Assembly.Load(GetAssetData(abName));
        return ass.GetType(assetName);
    }
}

主脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using System;
using System.Reflection;
using System.IO;
public class LoadDll : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(this.DownLoadAssets(() =>
        {
            gameObject.AddComponent(ABManager.LoadScript("CreateCube.dll.bytes", "CreateCube"));
        }));
    }

    IEnumerator  DownLoadAssets(Action action)
    {
        DirectoryInfo direction = new DirectoryInfo(Application.streamingAssetsPath);
        FileInfo[] files = direction.GetFiles("*", SearchOption.AllDirectories);
        foreach (var item in files)
        {
            if (item.Name.EndsWith(".bytes"))
            {
                string dllPath = item.FullName.Replace("\\", "/");
                UnityWebRequest www = UnityWebRequest.Get(dllPath);
                yield return www.SendWebRequest();
                if (www.result != UnityWebRequest.Result.Success)
                {
                    Debug.Log(www.error);
                }
                else
                {
                    byte[] data = www.downloadHandler.data;
                    ABManager.assetDatas.Add(item.Name, data);
                    Debug.Log(item.Name);
                }
            }
        }
        action();
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

编辑器(AB包的生成)

using System.Collections.Generic;
using System.IO;
using System.Linq;
using HybridCLR.Editor;
using UnityEditor;
using UnityEngine;

namespace DefaultNamespace
{
    public class ABTool : Editor
    {
        static string dllpath = Application.dataPath + "/../" + HybridCLRSettings.Instance.hotUpdateDllCompileOutputRootDir;

        [MenuItem("ABTool/生成AB包/Android")]
        public static void CreatAB_Android()
        {
            var target = BuildTarget.Android;
            CreatAB(target);
        }

        [MenuItem("ABTool/生成AB包/Windows64")]
        public static void CreateAB_win64()
        {
            var target = BuildTarget.StandaloneWindows64;
            CreatAB(target);
        }

        public static void CreatAB(BuildTarget target)
        {
            //找到对应目录
            DirectoryInfo direction = new DirectoryInfo(dllpath + "/" + target);
            //获取目录下所以文件
            FileInfo[] files = direction.GetFiles("*", SearchOption.AllDirectories);
            //把所有dll文件拷贝到目录下
            foreach (var item in files)
            {
                if (item.Name.EndsWith(".dll"))
                {
                    string dllpath = $"{ABTool.dllpath + "/" + target}/{item.Name}";
                    string dllBytesPath = $"{Application.streamingAssetsPath}/{item.Name}.bytes";
                    File.Copy(dllpath, dllBytesPath, true);
                    Debug.Log($"hotfix dll {dllpath} -> {dllBytesPath}");
                }
            }
            //预制体
            List<AssetBundleBuild> abs = new List<AssetBundleBuild>();
            //找到预制体目录下的所有目录
            string path = $"{Application.dataPath}/Prefabs/";
            DirectoryInfo directoryInfo = new DirectoryInfo(path);
            DirectoryInfo[] directions = directoryInfo.GetDirectories();
            //每个目录打一个AB包
            for (int i = 0; i < directions.Length; i++)
            {
                List<string> prefabAbssets = new List<string>();
                Debug.Log("打包文件夹:" + directions[i].Name);
                FileInfo[] fileinfos = directions[i].GetFiles("*", SearchOption.AllDirectories);
                Debug.Log("目录下文件个数:" + files.Length);
                foreach (var item in fileinfos)
                {
                    if (item.Name.EndsWith(".meta"))
                    {
                        continue;
                    }
                    Debug.Log("打包文件:" + item.Name);
                    prefabAbssets.Add(item.FullName.Replace("\\", "/"));
                    AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
                }

                AssetBundleBuild PrefabsAb = new AssetBundleBuild
                {
                    assetBundleName = directions[i].Name,
                    assetNames = prefabAbssets.Select(s => ToReleateAssetPath(s)).ToArray(),
                };
                abs.Add(PrefabsAb);
            }
            //构建AB包放到S目录下
            BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath, abs.ToArray(),
            BuildAssetBundleOptions.None, target);

            AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
        }

        public static string ToReleateAssetPath(string s)
        {
            string path = s.Substring(s.IndexOf("Assets/"));
            Debug.Log(path);
            return path;
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity华佗新是指利用Unity游戏引擎提供的华佗技术实现的新功能。新是指在游戏发布后,通过网络下载新的资源文件或者代码来新游戏内容,而无需重新下载整个游戏。 Unity华佗新的优点是可以快速修复游戏中的bug,增加新的功能和内容,提升游戏的体验,而无需用户重新下载和安装整个游戏。这样可以大大减少用户的等待时间和网络流量的消耗。另外,Unity华佗新还能够提升游戏的可持续性,降低开发和发布新版本的成本。 Unity华佗新的实现原理是游戏客户端通过连接服务器,检查版本新信息。如果有新版本可用,游戏客户端会下载新的资源文件或者代码,并进行新操作。新完成后,游戏客户端可以重新加载新的资源文件或者代码,使得游戏立即生效。 使用Unity华佗新需要注意安全性问题,防止恶意篡改游戏资源或者代码。为了保证安全,可以利用数字签名和加密等方式来验证资源的完整性和真实性。另外,还可以在游戏客户端内置一些反作弊的机制,防止使用非法资源或者代码。 总之,Unity华佗新是一种非常方便和高效的游戏新方式。它能够快速修复游戏中的问题,提升游戏的体验,并降低开发和发布新版本的成本。但是在使用时需要注意安全性问题,确保游戏资源和代码的完整性和真实性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值