1

我有一个根据鼠标位置旋转的对象,但我想夹住它,这样它就不会进一步或低于某个值。这是我的代码:

void LookAt () {

        float distance = transform.position.z - Camera.main.transform.position.z;

        Vector3 position = new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance);

        position = Camera.main.ScreenToWorldPoint(position);
        position.x = Mathf.Clamp(position.x, -70, 70);
        position.z = Mathf.Clamp(position.z, -70, 70);

        Vector3 target = new Vector3 (position.x, transform.position.y, position.z); // Use current object positin.y
        transform.LookAt(target);
    }

但不幸的是它不起作用,它一直在旋转 360。

编辑:这是一个 3D 自上而下的游戏,我有一个坦克,我想旋转它的上半部分。我上面写的代码非常适合这项工作,但现在我不知道如何限制它,所以枪管(我正在旋转的部分)总是面向敌人来自的地方。70 或任何我正在测试的随机值,首先我想弄清楚正确的代码到底是什么,然后确定这些值是容易的部分。

4

2 回答 2

0

实际上,问题在于您正在锁定位置,而不是旋转。你让它看着某个点,但限制那个点而不是它需要旋转以满足它的角度。您必须使用三角函数来计算它想要指向的角度(更具体地说,是 atan2 函数),将该值钳制为 (-70, 70),然后将该旋转应用于对象(使用欧拉角)。您需要对这些步骤中的任何一个进行进一步说明吗?

干杯。

PS请注意, atan2 返回一个弧度值,但您的范围和欧拉角使用度数。

于 2016-05-19T00:14:24.987 回答
-1

您在世界空间中将目标位置限制为 70 个单位,这通常很多,但取决于您的游戏规模。我认为您想要做的是将鼠标位置限制在屏幕中心周围 70 像素。(请在问题本身中提供此评论,这样我们就不必猜测了)。但是,由于您对目标的屏幕空间和世界空间位置使用了相同的变量,因此在将其转换为世界空间后,您可能会混淆并限制位置。

此外,您使目标的 y 坐标与对象相同。但这意味着每次目标经过时,对象都必须旋转 360 度。我假设您想要做的是假设目标位置位于相机位置。

void LookAt () {

        var cursorPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, camera.main.nearClipPlane);
        cursorPosition.x = Mathf.Clamp(position.x, -70, 70);
        cursorPosition.z = Mathf.Clamp(position.z, -70, 70);
        var targetPosition = Camera.main.ScreenToWorldPoint(cursorPosition);
        transform.LookAt(targetPosition);
    }

当您要求查找代码中的错误时,请提供有关您的推理和期望行为的详细信息。

于 2015-05-09T21:49:53.413 回答