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);

ここで重要なのはwavesandcur_waveであり、ご覧のとおり、 に追加cur_waveした後waves、それを再初期化します。では、他に何が複製を作っているのでしょうか? 行の前後とwaves.Add(cur_wave); cur_wave=new EnemyWave(data);最初のデバッグでデバッグ コードを配置したため、位置の項目は0正しく取得されますが、2 番目のデバッグ コードでは、位置の項目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はあまりうまくいかず、最初のデバッグでしか得られません... 2番目のものは何も出力していません...何が問題なのですか?

4

2 に答える 2

1

要素のリスト(ファイルの行?)を繰り返し処理し、いくつかの変更を実行し、事前チェックなしで対応する変数をリストに追加しています。指定された要素が重複している場合 (たとえば、2 つの同一の行)、いずれにせよリストに追加されます。また、ループ外で最後の追加を実行しているため、さらに重複が発生する可能性があります。最も安全なことは、追加する前に常にチェックすることです。次のように置き換えます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 に答える