为什么添加列表 也加入到不同的目录 ?

问题描述 投票:0回答:2

我创建网格通过发送到Unity被应用到游戏中呈现的对象。我有一个是通过我的MeshData类包含一个实例的方法(顶点,顶点索引列表,使三角形和UV坐标),并合并与MeshData的当前实例,从而获得包含顶点,三角形的最终合并MeshData索引,以及二者的合并的UV套传递作为网对象来统一。

推理是,我正在做一个素类游戏,我创建为每个单独的块网格,然后合并所有的网格块成块的16×16“块”。这个大网眼被转换成统一网格对象并施加到用于块的游戏对象。

当运行这种方法,目前陷入无限循环,似乎在同一时间进行更新this._tris和data._tris,从而为它遍历data._tris它永远不会到达终点,因为每次this._tris被添加到,它还更新data._tris。这是意外的行为,我不知道是什么原因造成的行为是那样。

这个代码特定位被罚款早期的工作,并没有在所有被修改。但是,当我在另一个类修改后的代码就开始陷入无限循环,直到遇到一个内存溢出异常。无论是在传递什么合并(),它不应该陷入这样的。

// Class for creating MeshData
public class MeshData
{
    // MeshData objects
    private List<Vector3> _verts = new List<Vector3>();
    private List<int> _tris = new List<int>();
    private List<Vector2> _uvs = new List<Vector2>();

    // MeshData constructor with parameters
    public MeshData(List<Vector3> v, List<int> i, Vector2[] u)
    {
        this._verts = v;
        this._tris = i;
        this._uvs = new List<Vector2>(u);
    }

    // MeshData default constructor
    public MeshData()
    {

    }

    // Merge Mesh Data
    public void Merge(MeshData data)
    {
        // if data is empty, don't do anything
        if(data._verts.Count <= 0)
        {
            return;
        }
        // if current meshdata is empty, just set it to be the new data set
        if(this._verts.Count <= 0)
        {
            this._verts = data._verts;
            this._tris = data._tris;
            this._uvs = data._uvs;
            return;
        }
        // if neither case above is true, merge the two data sets
        int count = this._verts.Count;
        this._verts.AddRange(data._verts);
        for(int i = 0; i < data._tris.Count; i++)
        {
            this._tris.Add(data._tris[i] + count);
        }
        this._uvs.AddRange(data._uvs);
    }
}

合并方法应该合并所述当前MeshData(本)与给定MeshData(数据),使得电流MeshData(本)同时含有的元素。

在for循环Merge方法 “为(INT I = 0;我<data._tris.Count;我++)” 是进入无限循环。当我在运行Visual Studio中的调试器和观看当地人变量列表,每次this._tris更新/加,它也更新/增加data._tris。所以data._tris在不断变大,因此对循环永远不会打它的结束。

用它为什么表现这种方式,以及如何避免这种行为任何帮助吗?

c# unity3d mesh
2个回答
2
投票

每当你等于与List<T>运营商的另一个List<T>一个=,你建立到列表的引用,在不复制值:


在您的例子中,你首先创建一个新的List<int>

private List<int> _tris = new List<int>();

但随后,在构造函数中,设置_tris引用一个不同的列表:

this._tris = i;

new List<int>()you已经不再被引用,将垃圾回收(最终)。这种过度写入也有可能发生在与线的Merge方法:

this._tris = data._tris;

如果你想this._tris引用另一个列表(并因此增加了一个增加了其他的),您使用=。如果你不是想将所有的值复制过来,你喜欢你AddRange确实使用_verts

this._tris.AddRange(data._tris);

4
投票

乍一看,我说你的问题是this._tris = data._tris;,你让this._trisdata._tris。可能要添加data._tris的内容,而不是this._tris

© www.soinside.com 2019 - 2024. All rights reserved.