【问题标题】:Subscribe event Unity VR订阅活动 Unity VR
【发布时间】:2018-01-10 02:15:36
【问题描述】:

Unity 共享不同的资产/脚本以使用 VR。我尝试开发一种简单的体验来提高我对不同 Unity 功能的了解,但我在调用事件时遇到了麻烦。

在脚本 MenuButton.cs 中,您可以订阅 OnButtonSelected 事件,但我不知道如何:

菜单按钮.cs

    public class MenuButton : MonoBehaviour
    {
         public event Action<MenuButton> OnButtonSelected;                   // This event is triggered when the selection of the button has finished.
...

         private IEnumerator ActivateButton()
         {
                // If anything is subscribed to the OnButtonSelected event, call it.
                if (OnButtonSelected != null)
                    OnButtonSelected(this);
         }
    }

我尝试了多种不成功的方式从另一个脚本订阅此事件,例如:

namespace VRStandardAssets.Menu
{
    public class GetDiscover : MonoBehaviour
    {
        [SerializeField] private MenuButton m_MenuButton;         // This controls when the selection is complete.

        void OnEnable()
        {
            m_MenuButton.OnButtonSelected += Teleport;
        }


        void OnDisable()
        {
            m_MenuButton.OnButtonSelected -= Teleport;
        }


        void Teleport()
        {
            Debug.Log("Hello");
        }
    }

}

但我有错误:“错误 CS0123:方法或委托VRStandardAssets.Menu.GetDiscover.Teleport()' parameters do not match delegateSystem.Action(VRStandardAssets.Menu.MenuButton)' 参数”。

这是什么意思?我只是在寻找调用事件的最简单方法...

我也尝试使用委托方法,但它也不起作用...... 也许我不太了解 Unity 事件系统的功能,即使我已经遵循了一些教程,也欢迎一些清晰的解释:

https://unity3d.com/fr/learn/tutorials/topics/scripting/events-creating-simple-messaging-system

https://unity3d.com/fr/learn/tutorials/topics/scripting/events

【问题讨论】:

    标签: c# unity3d unity5


    【解决方案1】:

    此错误的意思是,当您订阅“OnButtonSelected”事件时,您的目标方法(在您的情况下为“Teleport”)必须接受 VRStandardAssets.Menu.MenuButton 类型的参数。

    这就是事件系统告诉您的侦听器选择了哪个按钮的方式。

    所以,你可以使用这样的东西:

    void Teleport(VRStandardAssets.Menu.MenuButton buttonPressed)
    {
        // if you care which button, access buttonPressed parameter here..
        Debug.Log("Hello");
    }
    

    (注意:为了良好的编程习惯,尽管我建议将其命名为“Teleport”以外的其他名称 - 将其命名为“HandleMenuButton”或“MenuButtonPressed”可以保持其意图清晰;然后在该方法中您可以调用单独的“Teleport” "函数。以后如果你需要改变交互,如果你保持那个级别的分离,更新代码会更容易。)

    【讨论】:

    • 它成功了谢谢!!我肯定会改变命名。另一个快速的问题,我的事件 OnButtonSelected 保持为空,你知道为什么吗?
    • 嗯.. 不是 100% 确定这一点 - 要检查的事情:确保您正在查看 GetDiscover 类的同一个实例上的 OnButtonSelected .. 验证它没有在您之前的某个地方被取消订阅测试是否为空。最后但并非最不重要的一点是,仔细检查您没有使用“= null”而不是“==null”:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 2023-04-08
    • 2023-01-09
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多