首页 > 解决方案 > Unity - 一个 3D 滑块?

问题描述

好的,我正在尝试在 Unity 的 C# 中制作一个 3d 滑块,用户可以在其中修改最大值和最小值并在旋钮上下移动滑块时获取当前值 -

在此处输入图像描述

为此,我认为我需要一种映射函数,将旋钮的实际位置映射到最大值和最小值,并防止滑动超过该值。输入是通过指针控制的,所以到目前为止我尝试的是:

 public void OnClickDown()
    {
        if (ModeManager.GameMode == ModeManager.Mode.Preview)
        {
            isSelected = true;
        }
    }
    public void OnUnhover()
    {
        if (ModeManager.GameMode == ModeManager.Mode.Preview)
        {
            isSelected = false;
        }
    }

    public float scale(float OldMin, float OldMax, float NewMin, float NewMax, float OldValue)
    {

        float OldRange = (OldMax - OldMin);
        float NewRange = (NewMax - NewMin);
        float NewValue = (((OldValue - OldMin) * NewRange) / OldRange) + NewMin;

        return (NewValue);
    }

要么用界限手动尝试:

private void Update()
    {
        
        if (isSelected)
        {
            if(pointer.keyboardCollider.transform.position.x <= 0.1744 && pointer.keyboardCollider.transform.position.x > -0.1879)
            {
                knob.transform.position = new Vector3(pointer.keyboardCollider.transform.position.x, knob.transform.position.y, knob.transform.position.z);
            }
        }
    }

或使用比例/地图功能:

//In Update()
knob.transform.position = new Vector3(scale(minValue, maxValue, -0.185f, 0.1744f, pointer.keyboardCollider.transform.position.x), knob.transform.position.y, knob.transform.position.z);

既不工作也不给出一致的结果。如何创建这个 3d 滑块 - 确保旋钮仅在轨道上移动?

标签: c#unity3d

解决方案


您可以为滑块的最小点和滑块的最大点创建一个游戏对象。这使得可视化和更改变得更容易,但绝不是必需的。下面的示例将假设 minPoint 和 maxPoint 是变换。

您可以使用 Lerp 轻松设置旋钮的位置(假设 x 轴)

knob.position.x = Mathf.Lerp(minPoint.position.x, maxPoint.position.x, value01);

从旋钮位置获取value01(假设x轴)

1f / ((maxPoint.position.x - minPoint.position.x) / (knob.position.x - minPoint.position.x));

推荐阅读