【问题标题】:Unity goes beyond a value set as limit, when using scrollwheel使用滚轮时,Unity 超出了设置为限制的值
【发布时间】:2016-05-23 08:20:03
【问题描述】:

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

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

Unity 在使用鼠标滚轮时总是过冲;如果我设置 1.0f 并滚动;最终结果为 0.92;如果我将最大值设置为 5.0f,并且使用滚轮,它也会超过 5.1。

这导致camera卡住了,因为现在camera 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);

【问题讨论】:

  • 您到底想限制什么?滚动滚轮时相机移动多远?
  • 正确;所以它不会夹住东西。我有一个最小和最大高度,所以我可以控制相机的距离。
  • 刚回来。尼卡的回答有用吗?我想知道我是否需要提供答案。
  • 我刚刚注意到了变化;立即试用

标签: unity3d


【解决方案1】:

因此,此代码使您的变换在世界空间中的 minZoomPos 和 maxZoomPos 之间移动。 currentZoom 是归一化值,它决定了变换到 minZoomPos 的距离以及从 maxZoomPos 的 var 距离:

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);
}

【讨论】:

  • 这可能很有用,但您能否添加一些信息来解释您所做的更改以及为什么会有所帮助?
  • 我所做的是无论如何都尝试平移变换,然后将 y 和 z 值限制在 1 到 3 之间。
  • 你在 Update() 中使用这个吗?我让屏幕不断闪烁;在更新中运行此代码时,尝试在最小值和最大值之间进行更改。拆下Z上的夹子去掉了闪动,但是拉近拉远时相机并没有直线移动
  • NP,现在试试。谢谢!
  • 抱歉耽搁了;我试过了,但有一个问题:如果你缩放,你根本无法移动相机,在缩放轴旁边。我用鼠标在屏幕的边缘移动相机;当您调整位置时,结果是变焦有效,但无论如何相机都锁定在适当位置,
【解决方案2】:

找到了解决办法。

基本上,如果我低于或高于限制;我只是手动设置了限制。不优雅,但用 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)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-03
    • 2021-11-23
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多