C# 为什么会添加此UI按钮';谁的活动没有接到电话?

C# 为什么会添加此UI按钮';谁的活动没有接到电话?,c#,unity3d,cities-skylines-api,C#,Unity3d,Cities Skylines Api,在开发城市模型:天际线时,我遇到了一个问题 据我所知,我的大部分代码都运行良好——但到目前为止,我还没有对其进行测试。这是因为当我添加到UI中的按钮被单击时,它应该按顺序被调用。此按钮上的单击事件没有调用我分配给它的处理程序 这是我创建按钮的地方: public class LoadingExtension : LoadingExtensionBase { public override void OnLevelLoaded(LoadMode mode) { De

在开发城市模型:天际线时,我遇到了一个问题

据我所知,我的大部分代码都运行良好——但到目前为止,我还没有对其进行测试。这是因为当我添加到UI中的按钮被单击时,它应该按顺序被调用。此按钮上的单击事件没有调用我分配给它的处理程序

这是我创建按钮的地方:

public class LoadingExtension : LoadingExtensionBase
{
    public override void OnLevelLoaded(LoadMode mode)
    {
        Debug.LogDebugMessage("Adding 'Generate City Report' button to UI");

        // Get the UIView object. This seems to be the top-level object for most
        // of the UI.
        var uiView = UIView.GetAView();

        // Add a new button to the view.
        var button = (UIButton)uiView.AddUIComponent(typeof(UIButton));

        // Set the text to show on the button.
        button.text = "Generate City Report";

        // Set the button dimensions.
        button.width = 250;
        button.height = 30;

        // Style the button to look like a menu button.
        button.normalBgSprite = "ButtonMenu";
        button.disabledBgSprite = "ButtonMenuDisabled";
        button.hoveredBgSprite = "ButtonMenuHovered";
        button.focusedBgSprite = "ButtonMenuFocused";
        button.pressedBgSprite = "ButtonMenuPressed";
        button.textColor = new Color32(255, 255, 255, 255);
        button.disabledTextColor = new Color32(7, 7, 7, 255);
        button.hoveredTextColor = new Color32(7, 132, 255, 255);
        button.focusedTextColor = new Color32(255, 255, 255, 255);
        button.pressedTextColor = new Color32(30, 30, 44, 255);

        // Enable button sounds.
        button.playAudioEvents = true;

        // Place the button.
        button.transformPosition = new Vector3(-1.0f, 0.97f);

        // Respond to button click.
        // NOT GETTING CALLED
        button.eventClick += ButtonClick;
    }

    public void ButtonClick(UIComponent component, UIMouseEventParameter eventParam)
    {
        Debug.LogWarningMessage("HIGH LOGIC: Beginning report generation.");
        string now = DateTime.Now.ToFileTime().ToString();
        string filepath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
        string filename = filepath + "\\CityReport-" + now + ".xlsx";
        Output fileCreator = new Output(filename);
        fileCreator.GenerateReport();
    }
}
根据我一直遵循的原则,使用

button.eventClick += ButtonClick;
应添加
按钮单击
作为按钮的单击处理程序。但是,单击按钮没有任何作用。处理程序开头的调试消息(“HIGH LOGIC”消息)不会显示(注意:前面关于将按钮添加到UI的调试消息会显示)。在游戏的调试面板或VS中都不会显示错误消息

我还尝试过使用
newmouseeventhandler(ButtonClick)
,因为VS内联文档告诉我
eventClick
的类型是
MouseEventHandler
。这不会显示VS或游戏中的任何错误,但也不起作用

(注意:有,但几乎没有用。)

这里有没有人有使用C:SAPI的经验?为什么没有调用此事件?

您是否尝试过:

//button.eventClick += ButtonClick;
button.eventClick += (c,e) => {
    Debug.LogWarningMessage("HIGH LOGIC: Beginning report generation.");
    string now = DateTime.Now.ToFileTime().ToString();
    string filepath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
    string filename = filepath + "\\CityReport-" + now + ".xlsx";
    Output fileCreator = new Output(filename);
    fileCreator.GenerateReport();
};
你也试过这样做吗

//var button = (UIButton)uiView.AddUIComponent(typeof(UIButton));
var button = uiView.AddUIComponent(typeof(UIButton)) as UIButton

(对不起,我还不能来)

你可以试着后退一小步,检查不同的UI元素是否有效;例如,通过以下示例添加。将点击事件处理程序注册到此处理程序可能会起作用,因为下面有一个实际的示例;不过,文档中说要将此代码放在Start方法中。我不确定,但也许代码中的UIButton也应该放在Start方法中

作为旁白,我偶然发现了这个链接。Skylines似乎有自己的消息传递系统用于调试

我在您的代码中注意到,第一条调试语句使用的方法与第二条调试语句不同:

  • LogDebugMessage(“将“生成城市报告”按钮添加到UI”)
  • LogWarningMessage(“高逻辑:开始生成报告”) 这可能没有什么区别,但我会将Debug.LogWarningMessage调用移动到Debug.LogDebugMessage所在的位置,以测试它是否实际工作


    根据极其简洁的文档,有一个名为的日志文件,可能该文件中包含一些信息

    看起来您的单击处理程序本身是正常的。将按钮单击方法更改为:

    public void ButtonClick(UIComponent component, UIMouseEventParameter eventParam)
    {
        Debug.LogWarningMessage("HIGH LOGIC: Beginning report generation.");
    }
    

    然后检查调试输出。如果在该行之后出现错误,则调试消息可能不可见。

    这两种调试方法是我自己的:它们只需调用参数稍有不同的API调试方法,效果很好。不过退一步是个好主意。这两个都不管用,不过还是谢谢你的努力!