Если мы передадим значение с плавающей точкой в ​​Vector3Int, как оно будет себя вести? - PullRequest
0 голосов
/ 02 июля 2019

Если мы передадим некоторое значение с плавающей точкой в ​​аргумент Vector3Int, как оно будет обрабатываться?

m_target = new Vector3Int(target.x-speedx/4,target.y,target.z-speedz/4);

так что если speedx / 4 будет с плавающей точкой, то как она будет конвертирована в int

Vector3Int (124,66,0,0) будет рассматриваться как (124,0,0) или (125,0,0)

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Не скомпилируется.

У вас есть несколько вариантов преобразования значений в int в зависимости от ваших потребностей .

Но сначала убедитесь, что либо speedx имеет тип float, либо используйте 4f, в противном случае вы, возможно, уже делали int деление , используя неверные результаты.


Simple Typecast | FloorToInt

new Vector3Int((int)(target.x - speedx/4f), (int)(target.y), (int)(target.z-speedz/4f));

Это просто "срезы" чего-либо за запятой. Поэтому он ведет себя как равный Mathf.FloorToInt

(124.6f, 0, 0) & rightarrow; (124, 0, 0)
(124.4f, 0, 0) и вправо; (124, 0, 0)


RoundToInt

вы можете использовать Mathf.RoundToInt вместо

new Vector3Int(Mathf.RoundToInt(target.x-speedx/4f), Mathf.RoundToInt(target.y), Mathf.RoundToInt(target.z-speedz/4f)); 

для правильного увеличения и уменьшения значения до действительного int.

(124.6f, 0, 0) & rightarrow; (125, 0, 0)
(124.4f, 0, 0) & rightarrow; (124, 0, 0)


CeilToInt

Если вы хотите , чтобы он всегда был окружен, вы также можете использовать Mathf.CeilToInt

new Vector3Int(Mathf.CeilToInt(target.x-speedx/4f), Mathf.CeilToInt(target.y), Mathf.CeilToInt(target.z-speedz/4f)); 

(124.6f, 0, 0) & rightarrow; (125, 0, 0)
(124.4f, 0, 0) & rightarrow; (125, 0, 0)

1 голос
/ 02 июля 2019

ПРИМЕЧАНИЕ, ДОБАВЛЕННОЕ ПОСЛЕ КОММЕНТАРИЙ К ВОПРОСУ

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

Из того, что я прочитал в комментариях. target.x, target.y, speedx и speedz (а также константа 4) являются целыми числами.

См. Также этот пример:

int x = 13 / 4; //this returns int 3

Так что вам не нужно там кастовать.


Ответ на вопрос с плавающей точкой для Vector3Int

Float не конвертируется в int неявно, поэтому ваш код не будет компилироваться. Для конвертации вам нужен каст.

Учтите также, что преобразование усекает число с плавающей запятой.

float x = 124.345f;  
int y = (int) x;   //x will become 124.

В вашем конкретном случае вы можете конвертировать его следующим образом.

m_target = new Vector3Int((int) target.x-speedx/4, (int)target.y, (int)target.z-speedz/4);

И результат будет (124,0, 0,0, 0,0).

Если вы хотите достичь других результатов, вы можете проверить эти методы.


FLOAT TO INT CONVERSIONS

Mathf.Floor и Math.FloorToInt

Конечный результат будет таким же, как базовый состав. Поплавок будет усечен до нижнего целого.

float x 124.345;
int y = (int) Mathf.Floor(x); //y will become 124
//or
int z = Mathf.FloorToInt(x);  //z will become 124

РЕЗУЛЬТАТЫ КОНВЕРСИИ
float 124.345f & rightarrow; преобразует в int 124
float 124.789f & rightarrow; преобразует в int 124


Mathf.Ceil и Mathf.CeilToInt

Число с плавающей точкой будет усечено до более высокого значения.

float x 124.345;
int y = (int) Mathf.Ceil(x); //y will become 125
//or
int z = Mathf.CeilToInt(x); //z will become 125

РЕЗУЛЬТАТЫ КОНВЕРСИИ
float 124.345f & rightarrow; преобразует в int 125
float 124.789f & rightarrow; преобразует в int 125


Mathf.Round и Mathf.RoundToInt

Поплавок будет округлен до ближайшего целого.

float x 124.345;
int y = (int) Mathf.Round(x); //y will become 124
//or
int z = Mathf.RoundToInt(x);  //z will become 124

РАЗНЫЕ РЕЗУЛЬТАТЫ КОНВЕРСИИ
float 124.345f & rightarrow; преобразует в int 124
float 124.789f & rightarrow; преобразует в int 125

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...