hybridclr_unity/Editor/3rds/UnityHook/HybridCLRHooks/PatchScriptingAssembliesJso...

77 lines
2.5 KiB
C#
Raw Permalink Normal View History


using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using UnityEngine;
using UnityEditor;
using System.Runtime.CompilerServices;
using MonoHook;
using HybridCLR.Editor.BuildProcessors;
using System.IO;
namespace HybridCLR.MonoHook
{
#if UNITY_2021_1_OR_NEWER && (UNITY_WEBGL || UNITY_WEIXINMINIGAME)
[InitializeOnLoad]
public class PatchScriptingAssembliesJsonHook
{
private static MethodHook _hook;
static PatchScriptingAssembliesJsonHook()
{
if (_hook == null)
{
Type type = typeof(UnityEditor.EditorApplication);
MethodInfo miTarget = type.GetMethod("BuildMainWindowTitle", BindingFlags.Static | BindingFlags.NonPublic);
MethodInfo miReplacement = new Func<string>(BuildMainWindowTitle).Method;
MethodInfo miProxy = new Func<string>(BuildMainWindowTitleProxy).Method;
_hook = new MethodHook(miTarget, miReplacement, miProxy);
_hook.Install();
}
}
private static string BuildMainWindowTitle()
{
var cacheDir = $"{Application.dataPath}/../Library/PlayerDataCache";
if (Directory.Exists(cacheDir))
{
foreach (var tempJsonPath in Directory.GetDirectories(cacheDir, "*", SearchOption.TopDirectoryOnly))
{
string dirName = Path.GetFileName(tempJsonPath);
#if UNITY_WEIXINMINIGAME
Debug.Assert(EditorUserBuildSettings.activeBuildTarget == BuildTarget.WeixinMiniGame);
if (!dirName.Contains("WeixinMiniGame"))
{
continue;
}
#else
Debug.Assert(EditorUserBuildSettings.activeBuildTarget == BuildTarget.WebGL);
if (!dirName.Contains("WebGL"))
{
continue;
}
#endif
var patcher = new PatchScriptingAssemblyList();
patcher.PathScriptingAssembilesFile(tempJsonPath);
}
}
string newTitle = BuildMainWindowTitleProxy();
return newTitle;
}
[MethodImpl(MethodImplOptions.NoOptimization)]
private static string BuildMainWindowTitleProxy()
{
// 为满足MonoHook要求的最小代码长度而特地加入的无用填充代码
UnityEngine.Debug.Log(12345.ToString());
return string.Empty;
}
}
#endif
}