少年修仙传客户端基础资源
dabaoji
2023-11-13 0a23e1b83f8fda8ab9f9e32fe71c26c431faf63a
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
using System.Collections.Generic;
using ILRuntime.CLR.Method;
using ILRuntime.Runtime.Enviorment;
using ILRuntime.Runtime.Intepreter;
using UnityEngine;
 
 
/// <summary>
/// 热更工程使用monovehavior的基础代理类
/// </summary>
public class ILBehaviourProxy : WidgetBehavior
{
    [SerializeField]
    [Tooltip("Logic工程的代码,例:命名空间.类名")]
    List<string> classNames;
    Dictionary<string, ILBehaviourHolder> ilBehaviourHolders = new Dictionary<string, ILBehaviourHolder>();
    AppDomain appDomain {
        get { return ILLauncherProxy.Instance.appdomain; }
    }
 
    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 = appDomain.Instantiate(name);
            if (obj == null)
            {
                DebugEx.LogErrorFormat("ILBehaviour 脚本代码不存在:{0}", name);
                continue;
            }
            var setProxy = baseType.GetMethod("SetProxy", 1);
            appDomain.Invoke(setProxy, obj, this);//将当前代理对象传过去
 
            var holder = new ILBehaviourHolder(obj);
 
            //此处用type获取的方法,子类不定义是不会执行Logic工程父类的方法
            var type = obj.Type;
 
            holder.awake = type.GetMethod("Awake");
            holder.start = type.GetMethod("Start");
            holder.onEnable = type.GetMethod("OnEnable");
            holder.onDisable = type.GetMethod("OnDisable");
            holder.update = type.GetMethod("Update");
            holder.fixedUpdate = type.GetMethod("FixedUpdate");
            holder.lateUpdate = type.GetMethod("LateUpdate");
            holder.onDestroy = type.GetMethod("OnDestroy", 0);
 
            //baseType 获取的方法,才会执行父类Logic工程的父类方法,但同时也不会调用子类重写的方法
            holder.dipose = baseType.GetMethod("Dipose", 0);
 
            ilBehaviourHolders.Add(name, holder);
        }
    }
 
    //获取IL热更工程的脚本实例,供热更工程调用,不要在主工程使用
    public object GetILBehaviour(string name)
    {
        ILBehaviourHolder holder;
        if (ilBehaviourHolders.TryGetValue(name, out holder))
            return holder.instance;
        else
            return null;
    }
 
    private void Awake()
    {
        Init();
        foreach (var name in classNames)
        {
            ILBehaviourHolder holder;
            if (ilBehaviourHolders.TryGetValue(name, out holder))
            {
                if (holder.awake != null)
                    appDomain.Invoke(holder.awake, holder.instance);
            }
        }
    }
 
    private void Start()
    {
        foreach (var name in classNames)
        {
            ILBehaviourHolder holder;
            if (ilBehaviourHolders.TryGetValue(name, out holder))
            {
                if (holder.start != null)
                    appDomain.Invoke(holder.start, holder.instance);
            }
        }
    }
 
    private void OnEnable()
    {
        foreach (var name in classNames)
        {
            ILBehaviourHolder holder;
            if (ilBehaviourHolders.TryGetValue(name, out holder))
            {
                if (holder.onEnable != null)
                    appDomain.Invoke(holder.onEnable, holder.instance);
            }
        }
    }
 
    private void OnDisable()
    {
        foreach (var name in classNames)
        {
            ILBehaviourHolder holder;
            if (ilBehaviourHolders.TryGetValue(name, out holder))
            {
                if (holder.onDisable != null && appDomain != null)
                { 
                    appDomain.Invoke(holder.onDisable, holder.instance);
                }    
            }
        }
    }
 
    private void Update()
    {
        foreach (var name in classNames)
        {
            ILBehaviourHolder holder;
            if (ilBehaviourHolders.TryGetValue(name, out holder))
            {
                if (holder.update != null)
                    appDomain.Invoke(holder.update, holder.instance);
            }
        }
    }
 
    private void FixedUpdate()
    {
        foreach (var name in classNames)
        {
            ILBehaviourHolder holder;
            if (ilBehaviourHolders.TryGetValue(name, out holder))
            {
                if (holder.fixedUpdate != null)
                    appDomain.Invoke(holder.fixedUpdate, holder.instance);
            }
        }
    }
 
    private void LateUpdate()
    {
        foreach (var name in classNames)
        {
            ILBehaviourHolder holder;
            if (ilBehaviourHolders.TryGetValue(name, out holder))
            {
                if (holder.lateUpdate != null)
                    appDomain.Invoke(holder.lateUpdate, holder.instance);
            }
        }
    }
 
    private void OnDestroy()
    {
 
        foreach (var name in classNames)
        {
            ILBehaviourHolder holder;
            if (ilBehaviourHolders.TryGetValue(name, out holder))
            {
                if (appDomain != null && holder.onDestroy != null)
                    appDomain?.Invoke(holder.onDestroy, holder.instance);
                if (appDomain != null && holder.dipose != null)
                    appDomain?.Invoke(holder.dipose, holder.instance);
            }
        }
        ilBehaviourHolders.Clear();
    }
 
    private class ILBehaviourHolder
    {
        public object instance;
        public IMethod awake, start, onEnable, onDisable, update, fixedUpdate, lateUpdate, onDestroy;
        public IMethod dipose;
 
        public ILBehaviourHolder(object instance)
        {
            this.instance = instance;
        }
    }
 
}