我正在使用64位Ubuntu 18.04进行C#/ Unity项目。我有两个非静态类ClassA
和ClassB
,在实例方法classA.Foo()
中,有两个对public static int
方法ClassB.Floor(float x)
的调用。在Foo
调用Floor
的两个地方之一中,如果我遵循从classA.Foo
传递到ClassB.Floor
的值的堆栈跟踪,则来自Foo
的非零输入将变为在进行任何计算之前,Floor
内为0。
我一般都在搜索stackoverflow,stackexchange和google来寻找那些用C#或其他语言将变量从非零变为0时遇到问题的人。我发现了一些有关传递引用与值类型的结果,但是ClassB.Floor
正在接收浮点数并返回一个整数。我已经确认正在将正确类型的值(非双浮点数)输入到ClassB.Floor
中。
ClassB.Floor
定义为
public class ClassB : MonoBehaviour {
[...]
public static int Floor(float x) {
int xi = (int)x;
return x < xi ? xi - 1 : xi;
}
}
带有调试器值注释的示例:
public class ClassA {
# Set somewhere else during initialization, but definitely
# exists by the time `Foo` is called.
private GameObject gameObject;
[...]
public byte Foo(Vector3 pos) { # pos: "(-17f, 0f, 15f)"
[...]
int x = ClassB.Floor(pos.x); # x: -17
Vector3 objPosition = gameObject.transform.position; # objPosition: "(-16f, 0f, 0f)"
float xx = objPosition.x; # xx: -16f
int px = ClassB.Floor(xx); # px: 0
[...]
}
}
因此,px
不能正确设置ClassB.Floor
的值,即使它在x
的计算中可以正常工作。此外,如果我进入调试器并按照程序流程从int px = ClassB.Floor(xx);
中的classA.Foo
到ClassB.Floor
,我会立即看到:
public static int Floor(float x) { # x: 0
从输入0正确计算出输出值0。如果在定义xx
之后的程序执行过程中的任何时候使用Rider调试器的Evaluate Expression功能,则ClassB.Floor(xx)
返回正确的值即使程序本身没有-16
的值。
在通过此部分代码的程序流程中,不会生成任何错误或警告。有谁知道这可能是什么原因?我真的很困惑。预先感谢!
[更新]这是一个演示相同行为的更简单的示例。 ClassB.Floor
似乎无关紧要:
public class ClassA {
public byte Foo(Vector3 pos) { # pos: "(-17f, 0f, 15f)"
float xx = -16f; # xx: -16f
int px = Mathf.FloorToInt(xx); # px: 0
return 0;
}
}
相同的交易:如果我进入Mathf.FloorToInt
,定义为
public static int FloorToInt(float f)
{
return (int) Math.Floor((double) f);
}
即使是f=0
,我也从函数开头发现了xx=-16f
。
答案 0 :(得分:1)
这对我来说很好:
public class ClassB : MonoBehaviour
{
void Start(){
ClassA instance = new ClassA(gameObject);
instance.Foo(new Vector3(10.5f,15.2f,20.8f));
}
public static int Floor(float x) // 10.5f and 12.19f
{
int xi = (int)x;
return x < xi ? xi - 1 : xi;
}
}
public class ClassA
{
private GameObject gameObject;
public ClassA(GameObject go){
gameObject = go;
}
public byte Foo(Vector3 pos) // new Vector3(10.5f,15.2f,20.8f)
{
int x = ClassB.Floor(pos.x); // 10
//Debug.Log(x);
Vector3 objPosition = gameObject.transform.position; // new Vector3(12.19f, 1f, -10f);
float xx = objPosition.x; // 12.19f
int px = ClassB.Floor(xx); //12
//Debug.Log(px);
return new byte();
}
}