Unity VR - прокрутка текста движением руки (Oculus)

То, что я хочу, - это космическое полотно, которое я могу прокручивать, используя движения рук. Я могу получить worldPosition контроллеров и найти фактическое движение, но я не могу понять, как включить прокрутку текста.

В данный момент я пытаюсь использовать прокрутку + скрытую полосу прокрутки и изменить значение полосы прокрутки, но это не работает.

Я также попытался изменить мировую позицию текстового объекта, и, хотя мне удалось заставить текст двигаться соответствующим образом, я не могу понять, как найти размер текста, но я думаю, что это похоже на переизобретение скролла.

1 ответ

Решение

Для тех, кто проверяет это сейчас, я предлагаю использовать модуль ввода OVR с его компонентами скроллера, предоставленными в структуре oculus. Я оставляю свой старый ответ ниже.


Старый ответ, если вы не хотите использовать модуль OVR Input

После еще одного поиска я наткнулся на ответ на форумах Unity, я публикую его здесь для дальнейшего использования.

Здесь вы просто прокручиваете назначенную ось как настройку в настройках проекта, если вы хотите прокрутить движениями рук, просто рассчитайте разницу между позицией контроллера, для касания oculus я мог бы получить, изменив немного их код отсюда 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);
}
}
Другие вопросы по тегам