【问题标题】:Unity 3D : Compare array in for loopUnity 3D:在for循环中比较数组
【发布时间】:2014-08-26 00:43:14
【问题描述】:

我有一个 for 循环,它获取场景中的所有“块”并获取它们的 X、Y 和 Z 坐标,然后将这些坐标加上它的名称写入文本文件。它对所有块执行此操作。这个 for 循环位于一个名为 saveLoadedChunk 的函数中。此函数每分钟调用一次以保存块。但问题是,当玩家站在与 10 分钟前相同的区域时,它会保存相同的块并生成包含所有块的文本文件,但会多次。我不希望这种情况发生,所以编写了一小段代码,将文本文件的所有块放在一个数组中,并将它们与要保存的块进行比较。如果是这样,它将不会再次保存该块。但在添加一些 Debug.Log(); 后它不起作用函数,我发现第 20 行的 if 语句总是采用 else 分支。我不知道为什么,感谢所有帮助。

非常感谢,

代码:

function saveLoadedChunk() {
    var loadedChunks : GameObject[] = FindObjectsOfType(GameObject) as GameObject[];
    var fileName = "C:/Reactor Games/chunks.txt";    

    var fileText = System.IO.File.ReadAllText(fileName);
    var lines = fileText.Split("\n"[0]);

    var dontWrite = false;

    var sw : System.IO.StreamWriter = new System.IO.StreamWriter(fileName, true);
    for (var i = 0; i < loadedChunks.length ; i++) {
        if(loadedChunks[i].name.Substring(0,5) == "Chunk" || loadedChunks[i].name.Substring(0,5) == "_TERR") {
            if(loadedChunks[i].tag != "Player") {
                var xco = loadedChunks[i].transform.position.x;
                var yco = loadedChunks[i].transform.position.y;
                var zco = loadedChunks[i].transform.position.z;
                var stringToWrite = "Chunk (" + xco + ", " + yco + ", " + zco + ")";

                for(var chunkName in lines) {
                    if(chunkName.Equals(stringToWrite)) {
                        Debug.LogError("dontwrite = true");
                        dontWrite = true;
                    }
                    else{
                        dontWrite = false;
                    }
                }

                if(!dontWrite){sw.WriteLine(stringToWrite);}        
            }
        }
    }
    sw.Flush();
    sw.Close();
}

文本文件示例(应该是这样的,没有块被写两次):

Chunk (100, 0, -100)
Chunk (100, 0, -50)
Chunk (100, 0, 0)
Chunk (100, 0, 50)
Chunk (100, 0, 100)
Chunk (50, 0, -100)
Chunk (50, 0, 100)
Chunk (0, 0, -100)
Chunk (0, 0, 100)
Chunk (-50, 0, -100)
Chunk (-50, 0, 100)
Chunk (-100, 0, -100)
Chunk (-100, 0, -50)
Chunk (-100, 0, 0)
Chunk (-100, 0, 50)
Chunk (-100, 0, 100)
Chunk (0, 0, -50)
Chunk (0, 0, 50)
Chunk (-50, 0, -50)
Chunk (-50, 0, 0)
Chunk (-50, 0, 50)
Chunk (50, 0, -50)
Chunk (50, 0, 0)
Chunk (50, 0, 50)
Chunk (0, 0, 0)

错误的文本文件示例: 正如您在下面的文本文件中看到的那样,您可以看到它一遍又一遍地写入相同的块,每次 saveLoadedChunk();函数被调用。

Chunk (0, 0, -100)
Chunk (0, 0, 100)
Chunk (-50, 0, -100)
Chunk (-50, 0, 100)
Chunk (-100, 0, -100)
Chunk (-100, 0, -50)
Chunk (-100, 0, 0)
Chunk (-100, 0, 50)
Chunk (-100, 0, 100)
Chunk (0, 0, -50)
Chunk (0, 0, 50)
Chunk (-50, 0, -50)
Chunk (-50, 0, 0)
Chunk (-50, 0, 50)
Chunk (50, 0, -50)
Chunk (50, 0, 0)
Chunk (50, 0, 50)
Chunk (0, 0, 0)
Chunk (100, 0, -100)
Chunk (100, 0, -50)
Chunk (100, 0, 0)
Chunk (100, 0, 50)
Chunk (100, 0, 100)
Chunk (50, 0, -100)
Chunk (50, 0, 100)
Chunk (0, 0, -100)
Chunk (0, 0, 100)
Chunk (-50, 0, -100)
Chunk (-50, 0, 100)
Chunk (-100, 0, -100)
Chunk (-100, 0, -50)
Chunk (-100, 0, 0)
Chunk (-100, 0, 50)
Chunk (-100, 0, 100)
Chunk (0, 0, -50)
Chunk (0, 0, 50)
Chunk (-50, 0, -50)
Chunk (-50, 0, 0)
Chunk (-50, 0, 50)
Chunk (50, 0, -50)
Chunk (50, 0, 0)
Chunk (50, 0, 50)
Chunk (0, 0, 0)
Chunk (100, 0, -100)
Chunk (100, 0, -50)
Chunk (100, 0, 0)
Chunk (100, 0, 50)
Chunk (100, 0, 100)
Chunk (50, 0, -100)
Chunk (50, 0, 100)
Chunk (0, 0, -100)
Chunk (0, 0, 100)
Chunk (-50, 0, -100)
Chunk (-50, 0, 100)
Chunk (-100, 0, -100)
Chunk (-100, 0, -50)
Chunk (-100, 0, 0)
Chunk (-100, 0, 50)
Chunk (-100, 0, 100)
Chunk (0, 0, -50)
Chunk (0, 0, 50)
Chunk (-50, 0, -50)
Chunk (-50, 0, 0)
Chunk (-50, 0, 50)
Chunk (50, 0, -50)
Chunk (50, 0, 0)
Chunk (50, 0, 50)
Chunk (0, 0, 0)
Chunk (100, 0, -100)
Chunk (100, 0, -50)
Chunk (100, 0, 0)
Chunk (100, 0, 50)
Chunk (100, 0, 100)
Chunk (50, 0, -100)
Chunk (50, 0, 100)
Chunk (0, 0, -100)
Chunk (0, 0, 100)
Chunk (-50, 0, -100)
Chunk (-50, 0, 100)
Chunk (-100, 0, -100)
Chunk (-100, 0, -50)
Chunk (-100, 0, 0)
Chunk (-100, 0, 50)
Chunk (-100, 0, 100)
Chunk (0, 0, -50)
Chunk (0, 0, 50)
Chunk (-50, 0, -50)
Chunk (-50, 0, 0)
Chunk (-50, 0, 50)
Chunk (50, 0, -50)
Chunk (50, 0, 0)
Chunk (50, 0, 50)
Chunk (0, 0, 0)
Chunk (100, 0, -100)
Chunk (100, 0, -50)
Chunk (100, 0, 0)
Chunk (100, 0, 50)
Chunk (100, 0, 100)
Chunk (50, 0, -100)
Chunk (50, 0, 100)
Chunk (0, 0, -100)
Chunk (0, 0, 100)
Chunk (-50, 0, -100)
Chunk (-50, 0, 100)
Chunk (-100, 0, -100)
Chunk (-100, 0, -50)
Chunk (-100, 0, 0)
Chunk (-100, 0, 50)
Chunk (-100, 0, 100)
Chunk (0, 0, -50)
Chunk (0, 0, 50)
Chunk (-50, 0, -50)
Chunk (-50, 0, 0)
Chunk (-50, 0, 50)
Chunk (50, 0, -50)
Chunk (50, 0, 0)
Chunk (50, 0, 50)
Chunk (0, 0, 0)

更新 1: 感谢罗伯特,我将代码更改为以下代码。但是由于某种原因它仍然无法调试 dontwrite... 非常感谢您的帮助,我会在它有效时接受答案 + 我对每一个对我有帮助的答案都投赞成票。

    function saveLoadedChunk() {
    var loadedChunks : GameObject[] = FindObjectsOfType(GameObject) as GameObject[];
    var fileName = "C:/Reactor Games/chunks.txt";    

    var fileText = System.IO.File.ReadAllText(fileName);
    var lines = fileText.Split("\n"[0]);

    var write = true;

    var sw : System.IO.StreamWriter = new System.IO.StreamWriter(fileName, true);
    for (var i = 0; i < loadedChunks.length ; i++) {
        if(loadedChunks[i].name.Substring(0,5) == "Chunk" || loadedChunks[i].name.Substring(0,5) == "_TERR" || loadedChunks[i].name.Substring(0,5) == "_ACTI") {
            if(loadedChunks[i].tag != "Player") {
                var xco = loadedChunks[i].transform.position.x;
                var yco = loadedChunks[i].transform.position.y;
                var zco = loadedChunks[i].transform.position.z;
                var stringToWrite = "Chunk (" + xco + ", " + yco + ", " + zco + ")";

                write = true;
                for(var chunkName in lines) {
                    if(chunkName.Equals(stringToWrite)) {
                        Debug.LogError("dontwrite = true");
                        write = false;
                        break;
                    }
                }

                if(write){sw.WriteLine(stringToWrite);}     
            }
        }
    }
    sw.Flush();
    sw.Close();
}

【问题讨论】:

  • 对于同一个问题在这里多问几个问题可不是什么好事。

标签: arrays unity3d .net unityscript


【解决方案1】:

这是因为您的 for 循环在找到匹配项时不会转义。只要行中的 LAST 对象不等于 stringToWrite,它就会写入。将代码更改为以下内容:

dontWrite=false;
for(var chunkName in lines) {
    if(chunkName.Equals(stringToWrite)) {
        Debug.LogError("dontwrite = true");
        dontWrite = true;
        break;
    }
}

【讨论】:

  • 感谢您的回复,确实是个问题,但还是没有调试“dontwrite = true”。我不知道为什么。你知道为什么吗?请告诉我,非常感谢您的帮助。我很感激。 :)
猜你喜欢
  • 1970-01-01
  • 2023-04-05
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多