订阅活动Unity VR

时间:2018-01-09 17:53:49

标签: c# unity3d unity5

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

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

MenuButton.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");
        }
    }

}

但我有错误:&#34;错误CS0123:方法或委托VRStandardAssets.Menu.GetDiscover.Teleport()' parameters do not match delegate System.Action(VRStandardAssets.Menu.MenuButton)&#39;参数&#34;

这是什么意思?我只是在寻找最简单的方式来召集活动......

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

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

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

1 个答案:

答案 0 :(得分:2)

这个错误说的是当你订阅&#34; OnButtonSelected&#34; event,您定位的方法(在您的情况下,&#34; Teleport&#34;)必须接受VRStandardAssets.Menu.MenuButton类型的参数。

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

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

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

(注意:对于良好的编程习惯,虽然我建议将这些内容命名为&#34; Teleport&#34; - 称之为&#34; HandleMenuButton&#34;或者&#34; MenuButtonPressed&#34;保持它的意图是明确的;然后在该方法中你可以调用一个单独的Teleport&#34;函数。将来如果你需要改变交互,如果你保持这种分离水平,更新代码会更容易。 )