ice*_*cub 6 c# events ambiguity unity-game-engine
常规
使用 Unity 引擎开发游戏模组。
我尝试使用以下代码附加到activeSceneChanged事件的问题:
SceneManager.activeSceneChanged += OnSceneChanged;
Run Code Online (Sandbox Code Playgroud)
这会导致错误:
CS0229 “SceneManager.activeSceneChanged”和“SceneManager.activeSceneChanged”之间存在歧义
检查这里发生的情况后,该成员似乎activeSceneChanged
既是用户生成的又是 [CompilerGenerate]:
老实说,我自己尝试过,
我根本不知道如何解决这样的问题。我以前从未遇到过。问了我认识的其他一些开发人员,但他们也从未见过。使用 ILSpy 反编译 Unity DLL 文件,结果发现 CompilerGenerate 代码不在那里(有点有意义,因为它是由我假设的编译器生成的)。
我真的很想得到一些关于如何处理和解决这个问题的帮助。
编辑
为了帮助加快速度,这里有一个指向该模组的 Github 链接: https: //github.com/skarab42/ValheimTwitch
在 Plugin.cs 的第 93 行弹出错误
通常,当类声明事件时,C# 编译器会发出由同名字段public
支持的事件:private
[CompilerGenerated]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private static UnityAction<Scene, Scene> activeSceneChanged;
public static event UnityAction<Scene, Scene> activeSceneChanged
{
add { ... }
remove { ... }
}
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,Unity DLL 似乎已被修改,该字段的可访问性从 更改private
为public
. SceneManager.activeSceneChanged
因此,事件和字段之间的标识符现在不明确。
此问题的理想解决方案是修复修改 Unity DLL 的工具。当存在同名事件时,它不应更改字段的可访问性。
同时,您可以引用未修改的 Unity DLL,也可以使用 Reflection 添加事件处理程序:
typeof(SceneManager).GetEvent("activeSceneChanged").GetAddMethod()
.Invoke(null, new object[] { (UnityAction<Scene, Scene>)OnSceneChanged });
Run Code Online (Sandbox Code Playgroud)