近期在做游戏移植,把部分Unity的代码移植到laya上,发现laya上的表现跟Unity上有差异,
debug了一番,最终找到可疑点,代码实现大致是函数内使用三次Random.Range,随机出
三个值,做为Vector3的构造参数传入(new Vector3(值1,值2,值3)),然后返回Vector3,
在c#中通过Debug.LogError打印返回的Vector3,打印出来的结果不符合预期,于是写了段
测试代码,代码和运行结果如下图:
代码
结果
预期结果是-0.1到0.1之间的小数,实际打印出来的结果却不是
单独打印value1,value2,value3的值却是符合预期,
如果不知道有这回事,平时开发中很容易被输出的数据误导,
那这究竟是怎么回事?
首先,Vector3作为一个Struct,构造函数接收三个浮点类型的参数,内部实现应该是直接存起来而不会做任何修改,
为证实这一点,我们反编译下源代码看看(不懂的可看Unity--使用反编译软件ILSpy查看dll中的代码)
通过查看源代码确实也是直接把参数存起来,那我们再看看Debug.LogError的实现
Debug.LogError接收object类型的参数,c#中object是所有类的基类,即继承树上最顶层的那个类
我们再看看object里有什么
object里有个虚函数ToString,Debug.LogError内部的实现通过调用ToString得到要输出的字符串
那我们回头再看看Vector3里的ToString实现
好家伙!把x,y,z三个值格式化输出了,F1表示保留小数点后一位
总结一下,在平时开发中,打印数值型的object时(如Vector3,Vector4等等),为保证准确性,最好单独把每个分量打印出来
转载:https://blog.csdn.net/zlQQhs/article/details/116761736