为什么这个添加了UI按钮的事件没有被调用?

时间:2015-05-22 17:37:42

标签: c# unity3d cities-skylines-api

在开发城市模式:Skylines时,我遇到了一个问题。

据我所知,我的大多数代码都运行正常 - 但到目前为止,我还没有对它进行测试。这是因为当我添加到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();
    }
}

根据documentation我一直关注,使用

button.eventClick += ButtonClick;

应添加ButtonClick作为按钮的点击处理程序。但是,单击按钮不会执行任何操作。处理程序开头的调试消息(" HIGH LOGIC"消息)没有显示(注意:关于向UI添加按钮的早期调试消息确实如此)。游戏的调试面板或VS中不会显示任何错误消息。

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

(注意: official documentation,但它旁边没用了。)

这里有没有人有使用C:S API的经验?为什么这个事件没有被调用?

3 个答案:

答案 0 :(得分:2)

您可以尝试向前退一步,检查其他UI元素是否有效;例如,通过以下示例添加UILabel。将click事件处理程序注册到这个可能可能有效,因为有一个实际的例子可以遵循;虽然,文档说要将此代码放在Start方法中。我不确定,但也许代码中的UIButton也应放在Start方法中。

顺便说一句,我偶然发现debugging的这个链接。 Skylines似乎有自己的消息传递系统进行调试。

我在代码中注意到的是第一个Debug语句使用的方法与第二个Debug语句不同:

  1. Debug.LogDebugMessage(“向UI添加'生成城市报告'按钮”);
  2. Debug.LogWarningMessage(“HIGH LOGIC:Beginning report generation。”);
  3. 它可能没有任何区别,但我会测试Debug.LogWarningMessage调用,将它移动到Debug.LogDebugMessage的位置,以查看它是否真的有效。

    根据极为简洁的文档,有一个名为output_log.txt的日志文件,也许这个文件中可能包含一些信息。

答案 1 :(得分:1)

你试过了吗?

//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

(对不起,我还没准备好)

答案 2 :(得分:1)

看起来你的点击处理程序就好了。将ButtonClick方法更改为:

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

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