当Button失去OnClick时,Unity缺少警告

当任何Button组件缺少方法时,有没有办法获得某种信息或警告?

我的意思是,当你为Button实现一个方法,在场景中分配该方法然后重命名方法时,重命名将不会更新场景中的方法调用,因此它显示““。

当发生这种情况时,我希望得到通知 – 至少在按下播放时,或者至少在部署应用程序时。

斯科特的答案与你正在做的非常接近,并得出了这个答案。 虽然缺少这么多东西。 您需要做更多工作才能使该脚本正常工作。

1.您需要使用Resources.FindObjectsOfTypeAll获取场景中的所有按钮(包括非活动/禁用的按钮)。

2.浏览按钮,检查保存该function的类/脚本是否存在reflection。 你这样做是因为有时我们重命名脚本。 这可能会导致问题。 显示脚本的消息不存在。

你可以通过简单地检查Type.GetType(className);null

如果它为null则甚至不进行下面的测试,因为包含ButtononClick函数的组件已被重命名。 显示一条错误消息,指出此脚本已被删除或重命名。

3.如果该类存在,现在检查该函数是否存在于该按钮的onClick事件中注册的class中的reflection。

这可以通过简单地检查type.GetMethod(functionName);null

如果函数存在,那么Button就可以了。 如果函数存在,则不必显示消息。 停在这里。

如果返回null则继续#4

4.检查函数是否存在,但这一次,检查函数是否使用private 访问修饰符声明。

这是人们犯的典型错误。 他们将function声明为public ,通过编辑器分配,然后错误地将其从public更改为private 这应该工作,但将来可能会导致问题。

这可以通过简单地检查type.GetMethod(functionName, BindingFlags.Instance | BindingFlags.NonPublic);null

如果该函数存在,则显示一条消息,警告您此函数的访问修饰符已从public更改为private ,应更改回public

如果该函数不存在,则显示一条消息,警告您此函数不再存在或已重命名。

下面是一个执行上面提到的所有内容的脚本。 将它附加到一个空的GameObject ,它将在编辑器中运行游戏时随时执行。

 using System; using System.Reflection; using UnityEngine; using UnityEngine.UI; public class MissingOnClickDetector : MonoBehaviour { void Awake() { //Debug.Log("Class exist? " + classExist("ok.ButtonCallBackTest")); searchForMissingOnClickFunctions(); } void searchForMissingOnClickFunctions() { //Find all Buttons in the scene including hiding ones Button[] allButtonScriptsInScene = Resources.FindObjectsOfTypeAll 

你可以扩展按钮类并检查事件计数+方法名称,如果名称包含缺失,则触发错误

 using UnityEngine.UI; public class SafeButton : Button { override protected void Awake() { for (int i = 0; i < onClick.GetPersistentEventCount(); i++) { var methodName = onClick.GetPersistentMethodName(i); // if method name contains "missing" // -> Log Error } } }