MRTK 在 C# 中添加 ManipulationHandler

MRTK Add ManipulationHandler in C#

我正在尝试将操作事件动态添加到正在添加到父对象的子对象的 ManipulationHandler。父对象将是用户正在检查的对象,但用户将能够从父对象中抓取部分并更仔细地检查它们。 (即你可以查看引擎(父对象),但如果你想检查活塞(子对象),你可以抓住它们并查看它们)

不必进入每个子对象并在 Unity 中手动添加它,我希望能够添加父对象并在程序上添加 ManipulationHandlerManipulationEvents开始或醒来。

到目前为止,我有以下用于添加 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 接口使用 OnPointerDownOnPointerDragged 以及 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 导致到处都是奇怪的行为。尤其是非常小的零件,几乎是抢不到的...