所以我正在开发一个Unity / C#项目,我有一个名为GridObject
的类和一个名为GridRect
的结构,它包含静态方法PrintX(GridObject obj)
。
更新:我终于尝试创建一个全新的Unity项目并添加最少数量的课程。事实证明,复制比我预期的要容易得多!
测试代码,用于设置对象并调用PrintX()
:
using UnityEngine;
public class CorruptionTest : MonoBehaviour {
public GridObject gridObject;
public void Start() {
var gridObj = new GridObject();
gridObj.rect = new GridRect();
gridObj.rect2 = new GridRect2();
gridObj.rect.x = 1;
gridObj.rect2.x = 1;
GridRect.PrintX(gridObj);
GridRect2.PrintX(gridObj);
}
}
这是我的专业GridObject
课程:
public class GridObject {
public GridRect rect;
public GridRect2 rect2;
}
我的GridRect
结构:
using UnityEngine;
public struct GridRect {
public int x;
public int y;
public static void PrintX(GridObject gridObj) {
GridRect rect = gridObj.rect;
GridRect2 rect2 = gridObj.rect2;
Debug.Log(rect.x); // prints 518506984
Debug.Log(gridObj.rect.x); // prints 1
Debug.Log(rect2.x); // prints 1
Debug.Log(gridObj.rect2.x); // prints 1
}
}
GridRect2
除名称外是相同的:
using UnityEngine;
public struct GridRect2 {
public int x;
public int y;
public static void PrintX(GridObject gridObj) {
GridRect rect = gridObj.rect;
GridRect2 rect2 = gridObj.rect2;
Debug.Log(rect.x); // prints 1
Debug.Log(gridObj.rect.x); // prints 1
Debug.Log(rect2.x); // prints 518506984
Debug.Log(gridObj.rect2.x); // prints 1
}
}
这展示了一些有趣的事情:
x
或GridRect
时,GridRect2
或rect
结构的rect2
字段已损坏,但访问它时#34 ;到位"在Debug.Log(gridObj.rect.x);
GridRect rect = gridObj.rect;
在GridRect2
版本的PrintX()
中工作,而不是GridRect
1}}版本。GridRect
和GridRect2
示例的错误值相同。所以我完全不知道这里会发生什么。我怀疑这是Unity的序列化代码中的一个错误,但在从等式中删除后仍然会发生。唯一似乎有效的是将静态函数移动到另一个类。
答案 0 :(得分:-1)
您可以尝试将对象复制到另一个临时对象中吗?
public static void PrintX(GridObject gridObj) {
GridObject tmpgridObj = gridObj;
GridRect rect = tmpgridObj.rect;
Debug.Log(rect.x);
}
我生锈但我相信直接传递和对象只是传递对原始对象的引用,而不是它的值。