0

我对 C# 有点陌生,我遇到了一个奇怪的问题。发生的事情是,我添加到列表中的所有值都被重复了,我不知道为什么,因为每次我将对象添加到列表中时,我都会在下一行重新初始化该对象......这是我的代码:

waves=new List<EnemyWave>();
EnemyWave cur_wave=null;
for (int i=1; i<lines.Length; i++){
    string[] point_b=lines[i].Split("\t"[0]);
    if (point_b[0].StartsWith("[WAVE ")){
        string wave_data=point_b[0].Replace("[WAVE ","");
        int data=System.Convert.ToInt32(wave_data.Remove(wave_data.Length-1));
        if (cur_wave==null){
            cur_wave=new EnemyWave(data);
            path.addPoint(System.Convert.ToInt32(point_a[0]),System.Convert.ToInt32(point_a[1]));
        } else {
            waves.Add(cur_wave);
            cur_wave=new EnemyWave(data);
        }
    } else {
        if (cur_wave==null){
            createPath(point_a,point_b,i);
            point_a=point_b;
        } else {
            string type=point_b[0].ToLower();
            int wait_time=0;
            if (point_b.Length>1 && !point_b[1].Equals("")){
                wait_time=System.Convert.ToInt32(point_b[1]);
            }
            cur_wave.addEnemyData(type,wait_time);
        }
    }
}
waves.Add(cur_wave);

所以,这里重要的是wavesand cur_wave,正如你所看到的,在我添加cur_wave到之后waves,我重新初始化它。那么,还有什么在重复呢?因为我在行之前和之后放置了一个调试代码,并且waves.Add(cur_wave); cur_wave=new EnemyWave(data);在第一次调试时,我得到了0正确的位置项,但是在第二次调试代码中,位置项0已被清除......

编辑

我忘了说我使用的是 Unity 4.2.2f1。这是我的调试代码:

[...]
if (point_b[0].StartsWith("[WAVE ")){
    string wave_data=point_b[0].Replace("[WAVE ","");
    int data=System.Convert.ToInt32(wave_data.Remove(wave_data.Length-1));
    if (cur_wave==null){
        cur_wave=new EnemyWave(data);
        path.addPoint(System.Convert.ToInt32(point_a[0]),System.Convert.ToInt32(point_a[1]));
    } else {
        if (waves.Count>0){
            foreach (EnemyData en_data in waves[0].getArrayEnemyData()){
                Debug.Log (en_data.getType());
            }
        }
        if(!waves.Contains(cur_wave)) 
            waves.Add(cur_wave);
        cur_wave=new EnemyWave(data);
        if (waves.Count>0){
            foreach (EnemyData en_data in waves[0].getArrayEnemyData()){
                Debug.Log (en_data.getType());
            }
        }
    }
} else {
[...]

这是文件的内容。

-320    240
-220    40
220 60
320 -240
[WAVE 1000]
Weak
Weak    500
Weak    500
Weak    1000
[WAVE 1000]
Weak    
Weak    500
Weak    500
[WAVE 1000]
Medium
Medium  500

两个调试都应该打印这个:

weak
weak
weak
weak

但我越来越weak少,我只在第一次调试时得到它......第二个没有打印任何东西......怎么了?

4

2 回答 2

1

您正在遍历元素列表(文件的行?),执行一些修改并将相应的变量添加到列表中而无需任何预检查。如果给定的元素是重复的(例如,两个相同的行),它们无论如何都会被添加到列表中。此外,您正在循环之外执行最后一次添加,这可能会引发进一步的重复。最安全的事情是在添加之前始终检查。替换waves.Add(cur_wave);为:

if(!waves.Contains(cur_wave)) waves.Add(cur_wave);
于 2013-10-27T17:14:52.670 回答
0

好的,错误不在于这段代码......它是这样的EnemyWave,所以我真的找错了地方......这是问题所在:

public static List<EnemyData> enemies_data;

因为犯了这个static错误,我在想不知何故,传递给的对象List被重复了......但是不,我只是在每次制作时都替换了这个变量new,而不知道它......所以解决方案很简单将此代码更改为:

private List<EnemyData> enemies_data;

妈的,我以前从来没有遇到过这样的问题...

于 2013-10-27T21:30:32.963 回答