使用来自HoloToolkit资产和实现代码的InputManager预制件,用户可以点击并按住给定对象,然后向左或向右移动他们的手(沿着x平面)以沿着Y旋转对象轴或上下(沿y平面)在X轴上旋转物体。
然而,似乎有一个错误。如果用户注视离开对象,则旋转立即停止,直到用户注视返回对象。这是预期的功能吗?如果是这样,如何通过导航手势保留当前对象被更改并允许它继续被操纵,直到用户手离开FOV或用户释放点击并按住手势?
目标是利用点击并按住手势,但不要求用户凝视在整个旋转过程中锁定在对象上。对于形状较小或形状笨拙的物体来说,这是非常困难的。
实施代码:
[Tooltip("Controls speed of rotation.")]
public float RotationSensitivity = 2.0f;
private float rotationFactorX, rotationFactorY;
public void OnNavigationStarted(NavigationEventData eventData)
{
Debug.Log("Navigation started");
}
public void OnNavigationUpdated(NavigationEventData eventData)
{
rotationFactorX = eventData.CumulativeDelta.x * RotationSensitivity;
rotationFactorY = eventData.CumulativeDelta.y * RotationSensitivity;
//control structure to prevent dual axis movement
if (System.Math.Abs(eventData.CumulativeDelta.x) > System.Math.Abs(eventData.CumulativeDelta.y))
{
//rotate focusedObject along Y-axis
transform.Rotate(new Vector3(0, -1 * rotationFactorX, 0));
}
else
{
//rotate focusedObject along X-axis
transform.Rotate(new Vector3(-1 * rotationFactorY, 0, 0));
}
}
public void OnNavigationCompleted(NavigationEventData eventData)
{
Debug.Log("Navigation completed");
}
public void OnNavigationCanceled(NavigationEventData eventData)
{
Debug.Log("Navigation canceled");
}
答案 0 :(得分:2)
您需要调用这些方法:
NavigationRecognizer = new GestureRecognizer();
NavigationRecognizer.SetRecognizableGestures(GestureSettings.Tap);
NavigationRecognizer.TappedEvent += NavigationRecognizer_TappedEvent;
ResetGestureRecognizers();
这适用于抽头事件,但是在执行其他gesutres很简单,因为为|
调用添加事件回调并使用SetRecognizableGestures()
OR选择器。 e.g。
NavigationRecognizer.SetRecognizableGestures(GestureSettings.Tap | GestureSettings.NavigationX);
答案 1 :(得分:2)
Draco18s的答案更安全,但这个解决方案也有效 InputManager预制件为我们实现了一个堆栈。
在导航开始时,清除堆栈并按下正在导航的对象'在堆栈上,
InputManager.Instance.ClearModalInputStack();
InputManager.Instance.PushModalInputHandler(gameObject);
在导航完成或取消后,将其从堆栈中弹出。 InputManager.Instance.PopModalInputHandler();
将此添加到您自己的实现脚本中,无需在InputManager上调整任何预先存在的脚本。