如何在 Unity VR 应用程序的 Update() 中设计平滑的 UI 滚动?
How to design a smooth UI scroll inside Update() for a Unity VR application?
我正在 Unity 中开发一个 VR 应用程序,我正在努力使用我的 VR 控制器的操纵杆开发一个平滑的 UI 滚动。到目前为止,我所看到的是这样的...
private void Update()
{
float joyStickDirection = globals.menuInteraction_Scroll.GetAxis(SteamVR_Input_Sources.Any).y; // this is either 1 for up or -1 for down
if (joyStickDirection != 0)
{
float multiplier = joyStickDirection * 5f;
scrollRect.verticalNormalizedPosition = scrollRect.verticalNormalizedPosition + (multiplier * Time.deltaTime);
}
}
...这可行,但有两个问题。首先,它根据滚动容器的大小以不同的速度滚动。其次,滚动不是很流畅,因为它显然只是跳过了 0 和 1 之间的不同间隙。
我想我知道出了什么问题,但我没有足够的在 Update() 内部工作的经验来找出正确的方法。谁能给点建议?
实际上,您不一定要通过 ScrollRect
组件本身。
我通常会简单地做
public class ScrollExample : MonoBehaviour
{
public float speed = 5f;
public Transform ScrollContent;
void Update()
{
// this is either 1 for up or -1 for down
var joyStickDirection = globals.menuInteraction_Scroll.GetAxis(SteamVR_Input_Sources.Any).y;
if (joyStickDirection != 0)
{
var multiplier = joyStickDirection * speed;
// You want to invert the direction since scrolling down actually means
// moving the content up
ScrollContent.position -= Vector3.up * multiplier * Time.deltaTime;
}
}
}
然后 ScrollRect
自行更新和处理其余部分。 speed
在 Units/seconds 或屏幕空间覆盖 canvas 中,无论内容有多大,以每秒像素为单位。
通常您会想要调整 ScrollRect 的弹性或直接将 Movement Type 设置为 Clamped。
我正在 Unity 中开发一个 VR 应用程序,我正在努力使用我的 VR 控制器的操纵杆开发一个平滑的 UI 滚动。到目前为止,我所看到的是这样的...
private void Update()
{
float joyStickDirection = globals.menuInteraction_Scroll.GetAxis(SteamVR_Input_Sources.Any).y; // this is either 1 for up or -1 for down
if (joyStickDirection != 0)
{
float multiplier = joyStickDirection * 5f;
scrollRect.verticalNormalizedPosition = scrollRect.verticalNormalizedPosition + (multiplier * Time.deltaTime);
}
}
...这可行,但有两个问题。首先,它根据滚动容器的大小以不同的速度滚动。其次,滚动不是很流畅,因为它显然只是跳过了 0 和 1 之间的不同间隙。
我想我知道出了什么问题,但我没有足够的在 Update() 内部工作的经验来找出正确的方法。谁能给点建议?
实际上,您不一定要通过 ScrollRect
组件本身。
我通常会简单地做
public class ScrollExample : MonoBehaviour
{
public float speed = 5f;
public Transform ScrollContent;
void Update()
{
// this is either 1 for up or -1 for down
var joyStickDirection = globals.menuInteraction_Scroll.GetAxis(SteamVR_Input_Sources.Any).y;
if (joyStickDirection != 0)
{
var multiplier = joyStickDirection * speed;
// You want to invert the direction since scrolling down actually means
// moving the content up
ScrollContent.position -= Vector3.up * multiplier * Time.deltaTime;
}
}
}
然后 ScrollRect
自行更新和处理其余部分。 speed
在 Units/seconds 或屏幕空间覆盖 canvas 中,无论内容有多大,以每秒像素为单位。
通常您会想要调整 ScrollRect 的弹性或直接将 Movement Type 设置为 Clamped。