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后,运行游戏后打印信息会更新发生变化。