Unity中如何从其他类调用VRInput类的OnClick等事件?
解决VRInput无法编程触发事件的方案
嘿,我之前做Unity VR回放功能时也碰到过这个问题,VRStandardAssets的VRInput确实没给直接触发事件的公开接口,不过通过派生类扩展完全可以搞定,下面是具体步骤:
1. 创建VRInput的派生类,添加事件触发方法
首先我们要写一个继承自VRInput的自定义类,把触发事件的逻辑封装成公开方法。这里要注意VRInput里的事件(比如OnClick、OnDoubleClick)如果是protected或public的UnityEvent,我们可以直接调用Invoke();如果是private的,就需要用反射来访问。
情况一:事件是protected/public(大部分VRStandardAssets版本是这种)
using UnityEngine; using VRStandardAssets.Utils; public class CustomVRInput : VRInput { // 公开触发OnClick事件的方法 public void SimulateOnClick() { OnClick?.Invoke(); } // 同理扩展其他事件的触发方法 public void SimulateOnDoubleClick() { OnDoubleClick?.Invoke(); } public void SimulateOnDown() { OnDown?.Invoke(); } public void SimulateOnUp() { OnUp?.Invoke(); } }
情况二:事件是private(极少数版本)
如果VRInput的事件是private字段,我们用反射来获取并触发:
using UnityEngine; using VRStandardAssets.Utils; using System.Reflection; public class CustomVRInput : VRInput { public void SimulateOnClick() { // 通过反射获取private的OnClick字段 var onClickField = typeof(VRInput).GetField("OnClick", BindingFlags.Instance | BindingFlags.NonPublic); if (onClickField == null) return; var onClickEvent = onClickField.GetValue(this) as UnityEvent; onClickEvent?.Invoke(); } // 其他事件的反射触发逻辑同理,替换字段名即可 }
2. 在其他类中调用触发方法
比如你有一个ReplayController负责回放逻辑,只需要引用CustomVRInput实例,然后在需要回放输入时调用对应的模拟方法:
public class ReplayController : MonoBehaviour { // 在Inspector中拖入你的CustomVRInput组件 [SerializeField] private CustomVRInput m_CustomVRInput; // 回放点击输入的示例方法 public void ReplayClickAction() { m_CustomVRInput.SimulateOnClick(); } // 回放双击输入 public void ReplayDoubleClickAction() { m_CustomVRInput.SimulateOnDoubleClick(); } }
最后注意事项
- 把场景中原有的
VRInput组件替换成CustomVRInput,原来绑定的所有事件都会自动保留,不影响原有逻辑。 - 如果用反射的方式,要注意VRStandardAssets版本更新后字段名是否变化,尽量优先用直接访问的方式。
内容的提问来源于stack exchange,提问作者Kamran Bigdely
相关产品推荐
相关产品推荐

