我有一个对象,可以使用以下代码非动态地完美地绕圆旋转。
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。我还没有考虑什么?缩放还是像素图像调整大小?
感谢您的帮助!
答案 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;