unity hybird热更新实战学习 小白(一)

本文详细介绍了如何在Unity中新建项目,配置C++开发环境,集成HybridCLR插件并实现热更新功能。步骤包括设置、脚本编写和打包过程,以及如何实现实时代码更新。
摘要由CSDN通过智能技术生成

1.新建一个空白项目

2.为编辑器添加IL2CPP

3.为vs2019+添加c++开发环境

4.unity更改设置

5.获取hybirdcrl插件,打开packagemanager,输入url:

https://gitee.com/focus-creative-games/hybridclr_unity.git

6.创建热更新文件夹,创建dll文件,在插件设置中放入

7.加载

8.代码实现:(注意代码逻辑)

(1)在asstes建立StreamingAsstes文件夹,后面用于存放热更的加载文件

最终目录如图

其中HybridCLRGenerate是installer自动生成的

(2)进入代码,在AOT目录中建立Con**.cs和LoadDll.cs

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

public class ConsoleToScreen : MonoBehaviour
{
    const int maxLines = 50;
    const int maxLineLength = 120;
    private string _logStr = "";

    private readonly List<string> _lines = new List<string>();

    public int fontSize = 15;

    void OnEnable() { Application.logMessageReceived += Log; }
    void OnDisable() { Application.logMessageReceived -= Log; }

    public void Log(string logString, string stackTrace, LogType type)
    {
        foreach (var line in logString.Split('\n'))
        {
            if (line.Length <= maxLineLength)
            {
                _lines.Add(line);
                continue;
            }
            var lineCount = line.Length / maxLineLength + 1;
            for (int i = 0; i < lineCount; i++)
            {
                if ((i + 1) * maxLineLength <= line.Length)
                {
                    _lines.Add(line.Substring(i * maxLineLength, maxLineLength));
                }
                else
                {
                    _lines.Add(line.Substring(i * maxLineLength, line.Length - i * maxLineLength));
                }
            }
        }
        if (_lines.Count > maxLines)
        {
            _lines.RemoveRange(0, _lines.Count - maxLines);
        }
        _logStr = string.Join("\n", _lines);
    }

    void OnGUI()
    {
        GUI.matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity,
           new Vector3(Screen.width / 1200.0f, Screen.height / 800.0f, 1.0f));
        GUI.Label(new Rect(10, 10, 800, 370), _logStr, new GUIStyle() { fontSize = Math.Max(10, fontSize) });
    }
}
*****************************************

using HybridCLR;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;

public class LoadDll : MonoBehaviour
{

    void Start()
    {
        // Editor环境下,HotUpdate.dll.bytes已经被自动加载,不需要加载,重复加载反而会出问题。
#if !UNITY_EDITOR
        Assembly hotUpdateAss = Assembly.Load(File.ReadAllBytes($"{Application.streamingAssetsPath}/HotUpdate.dll.bytes"));
#else
        // Editor下无需加载,直接查找获得HotUpdate程序集
        Assembly hotUpdateAss = System.AppDomain.CurrentDomain.GetAssemblies().First(a => a.GetName().Name == "HotUpdate");
#endif


        Type type = hotUpdateAss.GetType("Begin");
        type.GetMethod("Startit").Invoke(null, null);
    }
}

(3)分别在场景中挂载两个脚本

(4)在HotUpdate目录下写脚本

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

public class Begin
{
    public static void Startit()
    {
        Debug.Log("Hello, HybridCLR");
    }
}
 

(泛型与单例模式,泛型不需要定义量的具体类型,先构建方法,在使用的时候声明其类型,单例模式下一个类只能存在唯一的一个实体,方便其他代码访问,地位相当于中央银行)

(5)生成打包一下 点击All

10.unity打包游戏,完成后进行文件替换,将编辑文件下的D:\unity\hytest\HybridCLRData\HotUpdateDlls\StandaloneWindows64/HotUpdate.dll,重命名为HotUpdate.dll.bytes,放到游戏生成后的目录C:\Users\creator\Desktop\hy\hytest_Data\StreamingAssets下

11.当对 Begin脚本内容进行修改时,点击ActiveBuildTarget然后再次重复操作10即可

12.手动热更新begin的delog后,运行游戏后打印信息会更新发生变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值