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
答案 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;函数。将来如果你需要改变交互,如果你保持这种分离水平,更新代码会更容易。 )