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

时间:2018-10-11 03:54:54

标签: c# unity3d canvas game-physics unityscript

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

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

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

125/2 = 62.5,这不是4.7f。我还没有考虑什么?缩放还是像素图像调整大小?

感谢您的帮助!

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

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

但是您还需要考虑一个事实,即画布也会根据设置方式在单位上应用比例尺。

一个好的解决方案是使用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度/秒。但是,当FPS为30时,您将旋转0.25 * 30 = 7.5度/秒)

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

代替angle += .25f;

这样做:

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