如果我们将float值传递给Vector3Int,它的行为如何?

时间:2019-07-02 07:36:25

标签: c# unity3d

如果我们将一些float值传递给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 个答案:

答案 0 :(得分:1)

在问题注释后添加注释

在您发布的代码中,您正在执行整数除法,发送结果为int(另请参见this answer)。

根据我在评论中看到的内容。 target.xtarget.yspeedxspeedz(还有常数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)。

如果要获得其他结果,可以检查以下方法。


浮动转换为转化

Mathf.FloorMath.FloorToInt

最终结果将与基本转换相同。浮点数将被截断到较低的int。

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→转换为int 124
float 124.789f→转换为int 124


Mathf.CeilMathf.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→转换为int 125
float 124.789f→转换为int 125


Mathf.RoundMathf.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→转换为int 124
float 124.789f→转换为int 125

答案 1 :(得分:1)

它不会编译。

您有多种选择,可以根据需要将值转换为int。。

但是首先要特别确保speedx的类型为float或使用4f,否则您可能已经进行了 int那里使用不正确的结果。


简单的类型转换| FloorToInt

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

它只是“切掉”逗号后面的任何内容。因此,它的行为类似于Mathf.FloorToInt

(124.6f, 0, 0)(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)(125, 0, 0)
(124.4f, 0, 0)(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)(125, 0, 0)
(124.4f, 0, 0)(125, 0, 0)