使用滚轮时,Unity超出了设置为限制的值

时间:2016-05-23 08:20:04

标签: unity3d

这很奇怪;而且我不知道如何实际修复它。

我使用一组限制(最小和最大),以了解滚轮可以放大或缩小相机的程度。问题是相机卡住了,因为我指定只有当y位置在最小值和最大值之间时才会发生变焦。

使用鼠标滚轮时Unity总是超调;如果我设置1.0f,并滚动;最终结果最终为0.92;同样如果我将最大值设置为5.0f,并使用滚轮,则会超过5.1。

这会导致相机卡住,因为现在相机的y值设置超出限制,所以很明显它不会移动。

你如何真正避免Unity会超出实际限制?

这就是我使用的

float mouse = Input.GetAxis("Mouse ScrollWheel");
float zoom_speed = 1.0f; 
if (transform.position.y <= 3f && transform.position.y >= 1f)
    transform.Translate(0, -mouse * zoom_speed, mouse * zoom_speed, Space.World);

2 个答案:

答案 0 :(得分:0)

因此,此代码使您的转换在世界空间中的minZoomPos和maxZoomPos之间传输。 currentZoom是标准化值,用于确定转换为minZoomPos的接近程度以及maxZoomPos的变量:

Vector3 minZoomPos = new Vector3(0, 1f, -3f); //transform's position when zoomed in all the way
Vector3 maxZoomPos = new Vector3(0, 3f, -1f); //position when zoomed out
float currentZoom = 0f; //this is normalized value >> 0 means it's zoomed all the way in, 1 means it's on all the way out

float zoom_speed = 1.0f; //if you keep these declarations in Update() function it will give you unnecessary overhead on garbage collection

void Update(){
    currentZoom += Input.GetAxis("Mouse ScrollWheel") * zoom_speed;
    currentZoom = Mathf.Clamp01(currentZoom);

    //get point between minZoomPos and maxZoomPos depending on currentZoom
    transform.position = Vector3.Lerp (minZoomPos, maxZoomPos, currentZoom);
}

答案 1 :(得分:0)

找到解决方案。

基本上,如果我低于或超过限制;我只是手动设定限制。不优雅,但有4行代码,我得到了我需要的东西。

我也改变了处理变焦的方式;因为我不需要在Y轴和Z轴上移动,所以我只需在Y轴上降低相机,这对我的场景更有效

float mouse = Input.GetAxis("Mouse ScrollWheel");
float zoom_speed = 1.0f; 

if (transform.position.y <= 3f && transform.position.y >= 1f)
    transform.Translate(0, -mouse * zoom_speed, 0);
    if (transform.position.y < 1f)
        transform.position = new Vector3(transform.position.x, 1f, transform.position.z)
    if (transform.position.y > 3f)
        transform.position = new Vector3(transform.position.x, 3f, transform.position.z)

有了这个,一旦改变它就会调整它的值,它发生得太快以至于相机不会抖动甚至轻微移动。很确定有更好的方法可以做到这一点,但这似乎现在有效。