三国卡牌客户端基础资源仓库
hch
2025-06-20 4841e82bd5e399c4fc39313bbc93c6fc1bb12b2a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
using HybridCLR.Editor.UnityBinFileReader;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEditor;
using UnityEditor.Android;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
using UnityEditor.UnityLinker;
using UnityEngine;
using UnityFS;
#if !UNITY_2023_1_OR_NEWER
using UnityEditor.Il2Cpp;
#endif
 
namespace HybridCLR.Editor.BuildProcessors
{
    public class PatchScriptingAssemblyList :
#if UNITY_ANDROID
        IPostGenerateGradleAndroidProject,
#elif UNITY_OPENHARMONY
        UnityEditor.OpenHarmony.IPostGenerateOpenHarmonyProject,
#endif
        IPostprocessBuildWithReport
#if !UNITY_2021_1_OR_NEWER && UNITY_WEBGL
        , IIl2CppProcessor
#endif
 
#if UNITY_PS5
        , IUnityLinkerProcessor
#endif
 
    {
        public int callbackOrder => 0;
 
        public void OnPostGenerateGradleAndroidProject(string path)
        {
            // 如果直接打包apk,没有机会在PostprocessBuild中修改ScriptingAssemblies.json。
            // 因此需要在这个时机处理
            // Unity有bug,偶然情况下会传入apk的路径,导致替换失败
            if (Directory.Exists(path))
            {
                PathScriptingAssembilesFile(path);
            }
            else
            {
                PathScriptingAssembilesFile($"{SettingsUtil.ProjectDir}/Library");
            }
        }
 
#if UNITY_OPENHARMONY
 
        public void OnPostGenerateOpenHarmonyProject(string path)
        {
            OnPostGenerateGradleAndroidProject(path);
        }
 
#endif
 
        public void OnPostprocessBuild(BuildReport report)
        {
            // 如果target为Android,由于已经在OnPostGenerateGradelAndroidProject中处理过,
            // 这里不再重复处理
#if !UNITY_ANDROID && !UNITY_WEBGL && !UNITY_OPENHARMONY
            PathScriptingAssembilesFile(report.summary.outputPath);
#endif
        }
 
#if UNITY_PS5
        /// <summary>
        /// 打包模式如果是 Package 需要在这个阶段提前处理 .json , PC Hosted 和 GP5 模式不受影响
        /// </summary>
 
        public string GenerateAdditionalLinkXmlFile(UnityEditor.Build.Reporting.BuildReport report, UnityEditor.UnityLinker.UnityLinkerBuildPipelineData data)
        {
            string path = $"{SettingsUtil.ProjectDir}/Library/PlayerDataCache/PS5/Data"; 
            PathScriptingAssembilesFile(path);
            return null;
        }
#endif
        public void PathScriptingAssembilesFile(string path)
        {
            if (!SettingsUtil.Enable)
            {
                Debug.Log($"[PatchScriptingAssemblyList] disabled");
                return;
            }
            Debug.Log($"[PatchScriptingAssemblyList]. path:{path}");
            if (!Directory.Exists(path))
            {
                path = Path.GetDirectoryName(path);
                Debug.Log($"[PatchScriptingAssemblyList] get path parent:{path}");
            }
#if UNITY_2020_1_OR_NEWER
            AddHotFixAssembliesToScriptingAssembliesJson(path);
#else
            AddHotFixAssembliesToBinFile(path);
#endif
        }
 
        private void AddHotFixAssembliesToScriptingAssembliesJson(string path)
        {
            Debug.Log($"[PatchScriptingAssemblyList]. path:{path}");
            /*
             * ScriptingAssemblies.json 文件中记录了所有的dll名称,此列表在游戏启动时自动加载,
             * 不在此列表中的dll在资源反序列化时无法被找到其类型
             * 因此 OnFilterAssemblies 中移除的条目需要再加回来
             */
            string[] jsonFiles = Directory.GetFiles(path, SettingsUtil.ScriptingAssembliesJsonFile, SearchOption.AllDirectories);
 
            if (jsonFiles.Length == 0)
            {
                Debug.LogWarning($"can not find file {SettingsUtil.ScriptingAssembliesJsonFile}");
                return;
            }
 
            foreach (string file in jsonFiles)
            {
                var patcher = new ScriptingAssembliesJsonPatcher();
                patcher.Load(file);
                patcher.AddScriptingAssemblies(SettingsUtil.HotUpdateAssemblyFilesIncludePreserved);
                patcher.Save(file);
            }
        }
        private void AddHotFixAssembliesToBinFile(string path)
        {
#if UNITY_STANDALONE_OSX
            path = Path.GetDirectoryName(path);
#endif
            if (AddHotFixAssembliesToGlobalgamemanagers(path))
            {
                return;
            }
            if (AddHotFixAssembliesTodataunity3d(path))
            {
                return;
            }
            Debug.LogError($"[PatchScriptingAssemblyList] can not find file '{SettingsUtil.GlobalgamemanagersBinFile}' or '{SettingsUtil.Dataunity3dBinFile}' in '{path}'");
        }
 
        private bool AddHotFixAssembliesToGlobalgamemanagers(string path)
        {
            string[] binFiles = Directory.GetFiles(path, SettingsUtil.GlobalgamemanagersBinFile, SearchOption.AllDirectories);
 
            if (binFiles.Length == 0)
            {
                return false;
            }
 
            foreach (string binPath in binFiles)
            {
                var binFile = new UnityBinFile();
                binFile.Load(binPath);
                binFile.AddScriptingAssemblies(SettingsUtil.HotUpdateAssemblyFilesIncludePreserved);
                binFile.Save(binPath);
                Debug.Log($"[PatchScriptingAssemblyList] patch {binPath}");
            }
            return true;
        }
 
        private bool AddHotFixAssembliesTodataunity3d(string path)
        {
            string[] binFiles = Directory.GetFiles(path, SettingsUtil.Dataunity3dBinFile, SearchOption.AllDirectories);
 
            if (binFiles.Length == 0)
            {
                return false;
            }
 
            foreach (string binPath in binFiles)
            {
                var patcher = new Dataunity3dPatcher();
                patcher.ApplyPatch(binPath, SettingsUtil.HotUpdateAssemblyFilesIncludePreserved);
                Debug.Log($"[PatchScriptingAssemblyList] patch {binPath}");
            }
            return true;
        }
 
#if UNITY_WEBGL && !UNITY_2022_3_OR_NEWER
        public void OnBeforeConvertRun(BuildReport report, Il2CppBuildPipelineData data)
        {
            PathScriptingAssembilesFile($"{SettingsUtil.ProjectDir}/Temp/StagingArea/Data");
        }
#endif
    }
}