我是初学者,刚刚开始使用 Unity 2022、Hololens2 和 MRTK3。对于我的项目,我试图启用凝视交互,这样当一个人凝视一个物体(例如球体全息图)超过阈值时间(例如3秒)时,之前的文本(textMeshPro)不可见因凝视而变得可见。如果有人能够指导我完成所有必要的步骤,我将非常感激。我知道我应该使用 Gaze Controller 但我不知道如何使用。
我一直在网上寻找教程/分步示例,但没有运气。到目前为止我发现的大部分内容都与 MRTK2 有关,考虑到这些变化,这没有多大帮助。
提前致谢!
MRTK3上的资源确实有些匮乏。 MRTK3 开发模板是一个很好的起点。下面让我们尝试重新创建您的示例用例。我假设您使用运行 MRTK3 的 MRTK XR Rig 获得了一个基本场景。
首先,您需要对
FuzzyGazeInteractor
的引用,例如如 gazeInteractor
。您可能会在 MRTK XR Rig -> MRTK Gaze Controller -> GazeInteractor 下找到它。然后,以下脚本将光线投射到场景中并检查是否与例如物体发生碰撞。球体,我们称之为 targetObj
。凝视交互器为我们提供了一些方便的信息,例如 rayOriginTransform
,我们可以使用它来确定凝视方向并执行光线投射。在您的用例中,您希望在用户凝视某物 gazeTriggerDuration
秒后触发某事。如果检测到与 targetObject
的碰撞,我们将对帧之间经过的时间求和,否则我们重置。
// References on script to gaze interactor and target object
public FuzzyGazeInteractor gazeInteractor;
public GameObject targetObj;
// Max. distance used for raycasting
public float rayMaxDistance = 5f;
// Timer for gaze duration
public float gazeTriggerDuration = 3f;
// Elapsed time between collision
private float elapsedTime = 0f;
// Check for gaze collision continuously
void Update()
{
// Create ray along gaze direction
var gazeRay = new Ray(gazeInteractor.rayOriginTransform.position, gazeInteractor.rayOriginTransform.forward * rayMaxDistance);
if (Physics.Raycast(gazeRay, out var hit))
{
// Check if we hit target object or sth else (could also use tags)
if (hit.collider.gameObject == targetObj)
{
// Increase elapsed time
elapsedTime += Time.deltaTime;
// Check if gaze trigger duration surpassed
if (elapsedTime >= gazeTriggerDuration)
{
// Do sth e.g. enable text obj
...
}
}
else
{
// No collision with target object
elapsedTime = 0f;
}
}
else
{
// No collision at all
elapsedTime = 0f;
}
}
附带说明:如果您对与按钮等 UI 元素进行注视交互感兴趣,某些组件带有内置的 MRTK 事件,包括诸如 Is Gaze Hovered 之类的事件,您可以使用它来触发回调等。请参阅下图以供参考:
此外,此代码未经测试,但核心思想应该可行。