Как найти радиус от ширины 2D холста в Unity? - PullRequest
0 голосов
/ 11 октября 2018

У меня есть объект, который вращается по кругу нединамически со следующим кодом.

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

Я хочу динамически получить радиус круга и использовать его в качестве изображения пользовательского интерфейса внутри холста.Ширина изображения пользовательского интерфейса составляет 125 и видна по синим стрелкам.Логика, я думаю, что это будет работать, будет иметь радиус = ширина / 2.

125/2 = 62,5, что не близко 4.7f.Что еще я не принимаю во внимание?Масштабирование или масштабирование изображения в пикселях?

Любая помощь приветствуется!

enter image description here

enter image description here

1 Ответ

0 голосов
/ 11 октября 2018

Во-первых, вам нужно учесть масштаб изображения (как предложено @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 кадрах в секунду вы будете вращаться на 0,25 * 60 = 15 градусов в секунду. Но с 30 кадрами в секунду вы будете вращаться на 0,25 * 30 = 7,5 градусов в секунду)

Чтобы быть независимым от частоты кадров, вы можете выполнить простое вычисление, используя Time.deltaTime (это время, которое требуется последнему кадру для полной визуализации)

Вместо angle += .25f;

Выполните следующее:

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