Unity VR - 用手移动滚动文本(Oculus)
Unity VR - Scrolling text with hand movement (Oculus)
我想要的是一个可以用手滚动的世界space canvas。我可以获得控制器的 worldPosition 并找到实际移动,但我不知道如何启用文本滚动。
我目前正在尝试的是使用 scrollrect+ 隐藏滚动条并更改滚动条的值,但这不起作用。
我也尝试过更改文本对象的世界位置,虽然我设法使文本相应地移动,但我不知道如何找到文本大小,但我认为这就像重新发明 scrollrect。
对于现在检查这个的任何人,我建议使用 OVR 输入模块及其在 oculus 框架中提供的滚动组件。我在下面留下我的旧答案。
旧答案,如果您不想使用 OVRInput 模块
经过更多搜索,我在统一论坛中偶然发现了一个答案,
我把它张贴在这里以供将来参考。
在这里你只需在项目设置中使用指定的轴滚动,如果你想用手移动滚动只需计算控制器位置之间的差异,对于 oculus touch 我可以通过稍微更改他们的代码来获得我的这里https://developer.oculus.com/blog/adding-gear-vr-controller-support-to-the-unity-vr-samples/
public class MoveScrollRect : ScrollRect, IMoveHandler, IPointerClickHandler
{
private const float speedMultiplier = 0.01f;
public float xSpeed = 0;
public float ySpeed = 0;
private float hPos, vPos;
void IMoveHandler.OnMove(AxisEventData e)
{
xSpeed += e.moveVector.x * (Mathf.Abs(xSpeed) + 0.1f);
ySpeed += e.moveVector.y * (Mathf.Abs(ySpeed) + 0.1f);
}
void Update()
{
ySpeed = Input.GetAxis("VerticalScroller");
hPos = horizontalNormalizedPosition + xSpeed * speedMultiplier;
vPos = verticalNormalizedPosition + ySpeed * speedMultiplier;
xSpeed = Mathf.Lerp(xSpeed, 0, 0.1f);
ySpeed = Mathf.Lerp(ySpeed, 0, 0.1f);
if (movementType == MovementType.Clamped)
{
hPos = Mathf.Clamp01(hPos);
vPos = Mathf.Clamp01(vPos);
}
normalizedPosition = new Vector2(hPos, vPos);
}
public void OnPointerClick(PointerEventData e)
{
EventSystem.current.SetSelectedGameObject(gameObject);
}
public override void OnBeginDrag(PointerEventData eventData)
{
EventSystem.current.SetSelectedGameObject(gameObject);
base.OnBeginDrag(eventData);
}
}
我想要的是一个可以用手滚动的世界space canvas。我可以获得控制器的 worldPosition 并找到实际移动,但我不知道如何启用文本滚动。
我目前正在尝试的是使用 scrollrect+ 隐藏滚动条并更改滚动条的值,但这不起作用。
我也尝试过更改文本对象的世界位置,虽然我设法使文本相应地移动,但我不知道如何找到文本大小,但我认为这就像重新发明 scrollrect。
对于现在检查这个的任何人,我建议使用 OVR 输入模块及其在 oculus 框架中提供的滚动组件。我在下面留下我的旧答案。
旧答案,如果您不想使用 OVRInput 模块
经过更多搜索,我在统一论坛中偶然发现了一个答案, 我把它张贴在这里以供将来参考。
在这里你只需在项目设置中使用指定的轴滚动,如果你想用手移动滚动只需计算控制器位置之间的差异,对于 oculus touch 我可以通过稍微更改他们的代码来获得我的这里https://developer.oculus.com/blog/adding-gear-vr-controller-support-to-the-unity-vr-samples/
public class MoveScrollRect : ScrollRect, IMoveHandler, IPointerClickHandler
{
private const float speedMultiplier = 0.01f;
public float xSpeed = 0;
public float ySpeed = 0;
private float hPos, vPos;
void IMoveHandler.OnMove(AxisEventData e)
{
xSpeed += e.moveVector.x * (Mathf.Abs(xSpeed) + 0.1f);
ySpeed += e.moveVector.y * (Mathf.Abs(ySpeed) + 0.1f);
}
void Update()
{
ySpeed = Input.GetAxis("VerticalScroller");
hPos = horizontalNormalizedPosition + xSpeed * speedMultiplier;
vPos = verticalNormalizedPosition + ySpeed * speedMultiplier;
xSpeed = Mathf.Lerp(xSpeed, 0, 0.1f);
ySpeed = Mathf.Lerp(ySpeed, 0, 0.1f);
if (movementType == MovementType.Clamped)
{
hPos = Mathf.Clamp01(hPos);
vPos = Mathf.Clamp01(vPos);
}
normalizedPosition = new Vector2(hPos, vPos);
}
public void OnPointerClick(PointerEventData e)
{
EventSystem.current.SetSelectedGameObject(gameObject);
}
public override void OnBeginDrag(PointerEventData eventData)
{
EventSystem.current.SetSelectedGameObject(gameObject);
base.OnBeginDrag(eventData);
}
}