最近在做数字孪生,为了方便拓展以后热更新功能进入了华佗热更新,华佗热更是使用IL2cpp模式,打包后会发现UMP插件在这个模式下报错一堆,下面完整记录了我的解决方法。
- 第一个报错最简单无法打包把这个脚本下关于Linux的方法全部删除注释,然后把引用全部注释掉,我这里只是截图了示例,需要自己找一下别的引用。


- 在上述解决后打包使用报错

这个报错解决起来比较复杂第一步找到下图所示脚本,并加入适合IL2cpp的代码
首先创建静态方法,解决日志回调报错
csharp
[DllImport(UMPSettings.ASSET_NAME)]
private static extern void UMPNativeSetUnityLogMessageCallback(UnityLogCallback callback);
// 日志回调
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void UnityLogCallback(string msg);
public void NativeSetUnityLogMessageCallback(UnityLogCallback callback)
{
UMPNativeSetUnityLogMessageCallback(callback);
}
[AOT.MonoPInvokeCallback(typeof(UnityLogCallback))]
private static void OnUnityLogStatic(string msg)
{
UnityEngine.Debug.LogError($"UMP: {msg}");
}

在日志回调报错下面,在初始化中也有相同的问题,解决方法如下
csharp
[DllImport(UMPSettings.ASSET_NAME)]
private static extern void UMPNativeSetBufferSizeCallback(int index, BufferSizeCallback callback);

在下方实现引用
csharp
public void NativeSetBufferSizeCallback(BufferSizeCallback callback)
{
UMPNativeSetBufferSizeCallback(_nativeIndex, callback);
}

接下来调用这个方法,舍弃原本的方法,找到下方如图所示脚本

新增加入代码如下图所示

csharp
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void BufferSizeCallback(int width, int height);
private static Dictionary<int, MediaPlayerStandalone> _instances = new Dictionary<int, MediaPlayerStandalone>();
public int InstanceCount;
// 静态回调方法
[MonoPInvokeCallback(typeof(BufferSizeCallback))]
private static void InitBufferSizeStatic(int width, int height)
{
foreach (var item in _instances)
{
item.Value.InitBufferSize(width, height); // 调回实例方法
}
}
接着使用新增代码,第一步先把新增的播放设置添加

并在播放初始化 MediaPlayerInit 方法中调用
这里原本代码已经注释掉采用自己的静态方法。
