如何在 MRTK 中以编程方式分配可交互事件

Posted

技术标签:

【中文标题】如何在 MRTK 中以编程方式分配可交互事件【英文标题】:How to assign programmatically an Interactable Event in MRTK 【发布时间】:2021-12-20 02:02:34 【问题描述】:

我正在 Unity3D 中创建要在 Hololens 2 中显示的地图。我正在使用 MRTK 编写可交互功能的代码。

由于地图包含许多独立的国家/地区,其回复onClick 可能会随时间而变化,因此我决定以编程方式添加所需的组件。例如:

public Transform worlmap;
public Microsoft.MixedReality.Toolkit.UI.Theme mTheme;
public Microsoft.MixedReality.Toolkit.UI.States mStates;
List<Microsoft.MixedReality.Toolkit.UI.Theme> themes;


    void Start()

    themes = new List<Microsoft.MixedReality.Toolkit.UI.Theme>();
    if (mTheme)
    
        themes.Add(mTheme);
    

    // Looping through all the countries in worldMap
    foreach (Transform country in worldMap)
    
        // Adding the 4 components which make a GameObject interactable in Hololens
        country.gameObject.AddComponent<Microsoft.MixedReality.Toolkit.UI.Interactable>();
        country.gameObject.AddComponent<Microsoft.MixedReality.Toolkit.UI.PressableButton>();
        country.gameObject.AddComponent<Microsoft.MixedReality.Toolkit.Input.NearInteractionTouchable>();
        country.gameObject.AddComponent<MeshCollider>();

        // Assigning State
        country.gameObject.GetComponent<Microsoft.MixedReality.Toolkit.UI.Interactable>().States = mStates;
        
        // Assigning the Profiles (Will definine the colors based on the State)
        Microsoft.MixedReality.Toolkit.UI.InteractableProfileItem mProfile = new Microsoft.MixedReality.Toolkit.UI.InteractableProfileItem();
        mProfile.Themes = themes;
        mProfile.Target = country.gameObject;
        country.gameObject.GetComponent<Microsoft.MixedReality.Toolkit.UI.Interactable>().Profiles.Add(mProfile);
        
        // Assigning Events
        // TODO
    

下面的部分正在运行,但我无法将事件分配给同一循环中的不同国家/地区。

我可以在编辑器中定义这些事件,例如:

但由于它是一个重复性活动,可能会随着时间的推移而略有变化,因此我试图在上述脚本的循环内以编程方式实现相同的操作。

这是我尝试过的,但它不起作用:

// Creating an Event
Microsoft.MixedReality.Toolkit.UI.InteractableEvent mEvent = new Microsoft.MixedReality.Toolkit.UI.InteractableEvent();

// Assigning the method to be executed during onClick
mEvent.Event.AddListener(country.gameObject.GetComponent<CountrySelected>().printName)

// Assigning the Event to Interactable 
country.gameObject.GetComponent<Microsoft.MixedReality.Toolkit.UI.Interactable>().InteractableEvents.Add(mEvent);

以编程方式将事件添加到 MRTK 中的可交互对象的正确方法是什么?

【问题讨论】:

【参考方案1】:

要在运行时为 Interactable 组件分配 OnClick 事件,请尝试以下代码:

    this.GetComponent<Interactable>().OnClick.AddListener(MyFun1);

Unity 编辑器中的 Interactable 组件配置文件可能不会在运行时显示新方法,但它确实在场景中工作。

【讨论】:

谢谢,完美运行

以上是关于如何在 MRTK 中以编程方式分配可交互事件的主要内容,如果未能解决你的问题,请参考以下文章

如何在故事板或XIB中以编程方式分配uiview?

如何在d3中以编程方式调用“click”事件?

如何在 Android 中以编程方式设置背景可绘制对象

如何在 SwiftUI 中以交互方式按年份过滤日期列表

在 VBA 中以编程方式确定 OnClick 事件的事件处理程序

MS-Access 2007 - 如何在点击事件中以编程方式访问子表单列数据