c# - 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 滑块 - 确保旋钮仅在轨道上移动?
解决方案
您可以为滑块的最小点和滑块的最大点创建一个游戏对象。这使得可视化和更改变得更容易,但绝不是必需的。下面的示例将假设 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));
推荐阅读
- python - 如何在while循环中记录第一次出现
- python-3.x - 当我在另一个函数中调用一个函数时,返回值不会被打印出来,所以我需要使用 print 函数
- class - Dart:如何访问另一个类中对象的类属性?(嵌套类)
- r - oob=scales::squish 不适用于 ggplot2 中的 scale_size_continuous
- reactjs - 如何隐藏 URL 扩展名以防止访问页面
- ios - 如何使用委托和协议传递数据
- django - 表“avc.consumptions_message”不存在
- unit-testing - 如何将 POST 请求 multipart/form-data 字段作为数组发送以进行单元测试?
- arrays - 通过 Swift 编程访问二维数组中的值
- java - 如何使用 Java 将图像编码为 AVIF?