MRTK 在 C# 中添加 ManipulationHandler
MRTK Add ManipulationHandler in C#
我正在尝试将操作事件动态添加到正在添加到父对象的子对象的 ManipulationHandler
。父对象将是用户正在检查的对象,但用户将能够从父对象中抓取部分并更仔细地检查它们。 (即你可以查看引擎(父对象),但如果你想检查活塞(子对象),你可以抓住它们并查看它们)
不必进入每个子对象并在 Unity 中手动添加它,我希望能够添加父对象并在程序上添加 ManipulationHandler
和 ManipulationEvent
s开始或醒来。
到目前为止,我有以下用于添加 ManipulationHandler
脚本的代码,但是要添加 ManipulationEvent
我不确定如何设置指针以便我可以使用脚本和函数我想从来源:
gameObject.AddComponent<ManipulationHandler>();
ManipulationHandler handler = gameObject.GetComponent<ManipulationHandler>();
ManipulationEvent newevent = new ManipulationEvent();
ManipulationEventData eventdata = new ManipulationEventData();
eventdata.ManipulationSource = gameObject;
程序在我抓取对象时工作,但我想在抓取对象时添加操作事件,以便显示其他数据。
我看到 ManipulationEventData
中的指针有 getter 和 setter,但我不确定如何实例化 IMixedRealityPointer
以及如何让它工作.我也不确定这是否是我真正需要完成的目标。
如果我错过了一些明显的事情,我提前道歉。我是 MRTK 新手。
谢谢!
ManipulationHandler
has four callback events among them OnManipulationStarted
and OnManipulationEnded
you can simply add listeners to. (see UnityEvent.AddListener
)
除非我理解错了你的问题,否则你不必实例化任何 IMixedRealityPointer
。 您 不会自己创建事件数据,而是 ManipulationHandler
将当前事件数据(包括交互指针信息)提供给这些事件。 ManipulationHandler
通过 IMixedRealityPointerHandler
接口使用 OnPointerDown
和 OnPointerDragged
以及 OnPointerUp
来管理交互指针并在需要时调用相应的事件。
而不是使用AddComponent
后接GetComponent
直接存储和使用AddComponent
的return值,它将作为新添加的组件的引用。 MRTK也有扩展方法
T EnsureComponent<T>(this Component component) where T : Component
这样您就可以简单地使用例如
var handler = this.EnsureComponent<ManipulationHandler>();
首先在内部检查组件是否已经存在,如果不存在则添加它。
请注意,为了启用近距交互,您还需要一个 NearInteractionGrabbable
,因此您也应该添加这个。
您还必须确保您的对象有某种 Collider
附加到与 NearInteractionGrabbable
相同的 GameObject
。
...
gameObject.transform.EnsureComponnet<NearInteractionGrabbable>();
var handler = gameObject.transform.EnsureComponnet<ManipulationHandler>();
handler.OnManipulationStarted.AddListener(HandleOnManipulationStarted);
handler.OnManipulationEnded.AddListener(HandleOnManipulationEnded);
...
/// <summary>
/// If you need it later you need to store the pointer since unfortunately in
/// OnManipulationEnded the <see cref="ManipulationEventData.Pointer"/> is null
/// (no idea why they do it this way :D )
/// </summary>
private IMixedRealityPointer _pointer;
private void HandleOnManipulationStarted(ManipulationEventData eventData)
{
_pointer = eventData.Pointer;
// whatever shall happen when manipulation started
}
private void HandleOnManipulationEnded(ManipulationEventData eventData)
{
// whatever shall happen when manipulation ended
}
注意:我不确定你想要实现的这个架构是否可以用这个架构......嵌套各种ManipulationHanlder
导致到处都是奇怪的行为。尤其是非常小的零件,几乎是抢不到的...
我正在尝试将操作事件动态添加到正在添加到父对象的子对象的 ManipulationHandler
。父对象将是用户正在检查的对象,但用户将能够从父对象中抓取部分并更仔细地检查它们。 (即你可以查看引擎(父对象),但如果你想检查活塞(子对象),你可以抓住它们并查看它们)
不必进入每个子对象并在 Unity 中手动添加它,我希望能够添加父对象并在程序上添加 ManipulationHandler
和 ManipulationEvent
s开始或醒来。
到目前为止,我有以下用于添加 ManipulationHandler
脚本的代码,但是要添加 ManipulationEvent
我不确定如何设置指针以便我可以使用脚本和函数我想从来源:
gameObject.AddComponent<ManipulationHandler>();
ManipulationHandler handler = gameObject.GetComponent<ManipulationHandler>();
ManipulationEvent newevent = new ManipulationEvent();
ManipulationEventData eventdata = new ManipulationEventData();
eventdata.ManipulationSource = gameObject;
程序在我抓取对象时工作,但我想在抓取对象时添加操作事件,以便显示其他数据。
我看到 ManipulationEventData
中的指针有 getter 和 setter,但我不确定如何实例化 IMixedRealityPointer
以及如何让它工作.我也不确定这是否是我真正需要完成的目标。
如果我错过了一些明显的事情,我提前道歉。我是 MRTK 新手。
谢谢!
ManipulationHandler
has four callback events among them OnManipulationStarted
and OnManipulationEnded
you can simply add listeners to. (see UnityEvent.AddListener
)
除非我理解错了你的问题,否则你不必实例化任何 IMixedRealityPointer
。 您 不会自己创建事件数据,而是 ManipulationHandler
将当前事件数据(包括交互指针信息)提供给这些事件。 ManipulationHandler
通过 IMixedRealityPointerHandler
接口使用 OnPointerDown
和 OnPointerDragged
以及 OnPointerUp
来管理交互指针并在需要时调用相应的事件。
而不是使用AddComponent
后接GetComponent
直接存储和使用AddComponent
的return值,它将作为新添加的组件的引用。 MRTK也有扩展方法
T EnsureComponent<T>(this Component component) where T : Component
这样您就可以简单地使用例如
var handler = this.EnsureComponent<ManipulationHandler>();
首先在内部检查组件是否已经存在,如果不存在则添加它。
请注意,为了启用近距交互,您还需要一个 NearInteractionGrabbable
,因此您也应该添加这个。
您还必须确保您的对象有某种 Collider
附加到与 NearInteractionGrabbable
相同的 GameObject
。
...
gameObject.transform.EnsureComponnet<NearInteractionGrabbable>();
var handler = gameObject.transform.EnsureComponnet<ManipulationHandler>();
handler.OnManipulationStarted.AddListener(HandleOnManipulationStarted);
handler.OnManipulationEnded.AddListener(HandleOnManipulationEnded);
...
/// <summary>
/// If you need it later you need to store the pointer since unfortunately in
/// OnManipulationEnded the <see cref="ManipulationEventData.Pointer"/> is null
/// (no idea why they do it this way :D )
/// </summary>
private IMixedRealityPointer _pointer;
private void HandleOnManipulationStarted(ManipulationEventData eventData)
{
_pointer = eventData.Pointer;
// whatever shall happen when manipulation started
}
private void HandleOnManipulationEnded(ManipulationEventData eventData)
{
// whatever shall happen when manipulation ended
}
注意:我不确定你想要实现的这个架构是否可以用这个架构......嵌套各种ManipulationHanlder
导致到处都是奇怪的行为。尤其是非常小的零件,几乎是抢不到的...