如何在 Unity 中从 2D canvas 宽度找到半径?

How can you find the radius from a 2D canvas width in Unity?

我有一个对象可以使用以下代码非动态地完美地围绕一个圆旋转。

    Radius = 4.7f;
    angle += .25f;

    float x = Radius * Mathf.Cos(angle);
    float y = Radius * Mathf.Sin(angle);
    float z = 0;

    ball.transform.position = new Vector3(x,y,z);

我希望动态获取圆的半径并将圆作为 canvas 内的 UI 图像。 UI 图像的宽度为125,可以通过蓝色箭头看到。我认为可行的逻辑是半径 = width/2。

125/2=62.5,不接近4.7f。我还没有考虑到什么?缩放或像素图像大小?

感谢任何帮助!

首先,您需要考虑图像的比例(正如@derHugo 在评论中建议的那样)

但您还需要考虑到您的 canvas 也会对单位应用比例,具体取决于您的设置方式。

一个好的解决方案是使用RectTransform.GetWorldCorners。这将使您无需自己进行比例计算即可知道您的圆的世界坐标。

Vector3[] v = new Vector3[4];
rt.GetWorldCorners(v);
var radius = v[0].x - v[2].x; // Not sure about the order of the corners, the indices might be wrong

另一条评论:您的代码依赖于帧率:每帧添加 0.25 度。这意味着 FPS 会影响旋转速度(60 fps,你将每秒旋转 0.25 * 60 = 15 度。但是如果是 30 FPS,你将每秒旋转 0.25 * 30 = 7.5 度)

要独立于帧率,您可以使用 Time.deltaTime 进行简单计算(这是最后一帧完全渲染所用的时间)

而不是angle += .25f;

这样做:

var anglePerSeconds = 15; // Choose the angular speed you want
angle += anglePerSeconds * Time.deltaTime;