少年修仙传客户端代码仓库
hch
2025-06-12 204ef05a831c9484e2abc561d27ecbff7c797453
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
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
using System;
using System.Collections.Generic;
using System.Reflection;
using UnityEngine;
 
 
/// <summary>
/// 热更工程使用monovehavior的基础代理类
/// </summary>
public class ILBehaviourProxy : WidgetBehavior
{
    [SerializeField]
    [Tooltip("Logic工程的代码,例:命名空间.类名")]
    List<string> classNames;
    Dictionary<string, ILBehaviourHolder> ilBehaviourHolders = new Dictionary<string, ILBehaviourHolder>();
    public object prefabScript;
    private void Init()
    {
        InitWidgts();
        ilBehaviourHolders.Clear();
        //var baseType = appDomain.LoadedTypes["ILBehaviour"];
        foreach (var name in classNames)
        {
            if (ilBehaviourHolders.ContainsKey(name))
            {
                DebugEx.LogErrorFormat("ILBehaviour 脚本代码有重复项:{0}", name);
                continue;
            }
 
            var obj = GetTypeFromAllAssemblies(name);
            if (obj == null)
            {
                DebugEx.LogErrorFormat("ILBehaviour 脚本代码不存在:{0}", name);
                continue;
            }
            ILBehaviour.SetProxy(this);
            prefabScript = Activator.CreateInstance(obj);
            if (prefabScript == null)
                continue;
 
            var holder = new ILBehaviourHolder(prefabScript);
 
            //此处用type获取的方法,子类不定义是不会执行Logic工程父类的方法
            var type = prefabScript.GetType();
            //MethodInfo awakeMethod = myType.GetMethod("Awake", BindingFlags.NonPublic | BindingFlags.Instance);
            holder.awake = type.GetMethod("Awake", BindingFlags.NonPublic | BindingFlags.Instance);
            holder.start = type.GetMethod("Start", BindingFlags.NonPublic | BindingFlags.Instance);
            holder.onEnable = type.GetMethod("OnEnable", BindingFlags.NonPublic | BindingFlags.Instance);
            holder.onDisable = type.GetMethod("OnDisable", BindingFlags.NonPublic | BindingFlags.Instance);
            holder.update = type.GetMethod("Update", BindingFlags.NonPublic | BindingFlags.Instance);
            holder.fixedUpdate = type.GetMethod("FixedUpdate", BindingFlags.NonPublic | BindingFlags.Instance);
            holder.lateUpdate = type.GetMethod("LateUpdate", BindingFlags.NonPublic | BindingFlags.Instance);
            holder.onDestroy = type.GetMethod("OnDestroy", BindingFlags.NonPublic | BindingFlags.Instance);
            holder.dipose = type.GetMethod("Dipose", BindingFlags.NonPublic | BindingFlags.Instance);
            ilBehaviourHolders.Add(name, holder);
        }
    }
 
    //获取IL热更工程的脚本实例,供热更工程调用,不要在主工程使用
    public object GetILBehaviour(string name)
    {
        ILBehaviourHolder holder;
        if (ilBehaviourHolders.TryGetValue(name, out holder))
            return holder.instance;
        else
            return null;
    }
 
    void Awake()
    {
        Init();
        foreach (var name in classNames)
        {
            ILBehaviourHolder holder;
            if (ilBehaviourHolders.TryGetValue(name, out holder))
            {
                if (holder.awake == null)
                    return;
                holder.awake.Invoke(holder.instance, null);
            }
        }
    }
 
    void Start()
    {
        foreach (var name in classNames)
        {
            ILBehaviourHolder holder;
            if (ilBehaviourHolders.TryGetValue(name, out holder))
            {
                if (holder.start == null)
                    return;
                holder.start.Invoke(holder.instance, null);
            }
        }
    }
 
    void OnEnable()
    {
        foreach (var name in classNames)
        {
            ILBehaviourHolder holder;
            if (ilBehaviourHolders.TryGetValue(name, out holder))
            {
                if (holder.onEnable == null)
                    return;
                holder.onEnable.Invoke(holder.instance, null);
            }
        }
    }
 
    void OnDisable()
    {
        foreach (var name in classNames)
        {
            ILBehaviourHolder holder;
            if (ilBehaviourHolders.TryGetValue(name, out holder))
            {
                if (holder.onDisable == null)
                    return;
                holder.onDisable.Invoke(holder.instance, null);
            }
        }
    }
 
    void Update()
    {
        foreach (var name in classNames)
        {
            ILBehaviourHolder holder;
            if (ilBehaviourHolders.TryGetValue(name, out holder))
            {
                if (holder.update == null)
                    return;
                holder.update.Invoke(holder.instance, null);
            }
        }
    }
 
    void FixedUpdate()
    {
        foreach (var name in classNames)
        {
            ILBehaviourHolder holder;
            if (ilBehaviourHolders.TryGetValue(name, out holder))
            {
                if (holder.fixedUpdate == null)
                    return;
                holder.fixedUpdate.Invoke(holder.instance, null);
            }
        }
    }
 
    void LateUpdate()
    {
        foreach (var name in classNames)
        {
            ILBehaviourHolder holder;
            if (ilBehaviourHolders.TryGetValue(name, out holder))
            {
                if (holder.lateUpdate == null)
                    return;
                holder.lateUpdate.Invoke(holder.instance, null);
            }
        }
    }
 
    void OnDestroy()
    {
 
        foreach (var name in classNames)
        {
            ILBehaviourHolder holder;
            if (ilBehaviourHolders.TryGetValue(name, out holder))
            {
                if (holder.onDestroy == null)
                    return;
                holder.onDestroy.Invoke(holder.instance, null);
 
                if (holder.dipose == null)
                    return;
                holder.dipose.Invoke(holder.instance, null);
            }
        }
        ilBehaviourHolders.Clear();
    }
 
    private class ILBehaviourHolder
    {
        public object instance;
        public MethodInfo awake, start, onEnable, onDisable, update, fixedUpdate, lateUpdate, onDestroy;
        public MethodInfo dipose;
 
        public ILBehaviourHolder(object instance)
        {
            this.instance = instance;
        }
    }
 
    Type GetTypeFromAllAssemblies(string typeName)
    {
        foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
        {
            var type = assembly.GetType(typeName);
            if (type != null)
                return type;
        }
        return null;
    }
 
}