非零函数参数在函数内部变为零

时间:2019-05-31 06:40:04

标签: c# unity3d

我正在使用64位Ubuntu 18.04进行C#/ Unity项目。我有两个非静态类ClassAClassB,在实例方法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.FooClassB.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

1 个答案:

答案 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();
    }
}