C#字典删除失败

时间:2018-06-01 18:27:31

标签: c# debugging unity3d

这是在Unity中。 当我尝试删除我添加到此特定字典中的元素时,删除失败,我不理解该行为。

以下是声明:

private Dictionary<int, EnemyControler> remainingMobs = new Dictionary<int, EnemyControler>();

在某些时候,我这样做:

remainingMobs.Add(newEnemy.MobID, newEnemy);

每当我创建一个新的敌人时,MobID就是一个int I,它附加到每个敌人身上

当敌人死亡时,在他的Destroy()方法中,他称之为:

public void EnemyDied(int someID) {
    if(remainingMobs.Remove(someID)) {
        print("removed "+someID);
    } else {
        print("Failed to remove " + someID);
        DisplayRemainingMobs();
    }
}

这是DisplayRemainingMobs方法:

public void DisplayRemainingMobs() {
    string availableKeys="";
    foreach (KeyValuePair<int, EnemyControler> pair in remainingMobs){
        availableKeys+= pair.Key + ", ";
    }
    print(remainingMobs.Keys.Count + " are available : " + availableKeys);
}

这是出问题的地方。 当我之前调用DisplayRemainingMobs()时,输出为:

  

2可用:1,2,

这完全是预期的。 但是,当我杀死我生成的两个中的一个,并且在字典上调用.remove()时,打印的输出变为:

  

无法删除2

     

0可用:

我不明白.remove()失败的原因,以及为什么失败后没有更多密钥可用。我已经尝试了很多东西,包括将int换成字符串,认为它可能来自那里。我无法调试这个,无论我打印什么只告诉我它应该工作。我的测试期间数字匹配。

我甚至已经完成了一个完整的功能,我在另一个专门为此制作的字典中使用了所有这些功能,当然,一切都按照预期进行。

我想到,它可能来自于从方法中调用remove的事实,但是我该如何解决呢?

(显然因为低输出而无法使用标签字典)

编辑:这是完整的代码: 这是WaveControler类(其中包含最多代码的类)

using System;
using System.Collections.Generic;
using UnityEngine;

public class WaveControler : MonoBehaviour {

public EnemyControler enemy;
public Transform spawnLocation;
private EnemyControler newEnemy;
private int waveNumber;
private Dictionary<int, EnemyControler> remainingMobs = new Dictionary<int, EnemyControler>();
private int mobID;

void Start () {
    waveNumber =2;
    mobID=0;
    Spawn();
}

void Update () {        
    if(AllEnemiesDead()) {
        print("GO TO NEXT WAVE");
        GoToNextWave();
        Spawn(); 
    } else {
        DisplayRemainingMobs();
    }
}

void  Spawn() {
    for(int i=0; i<waveNumber; i++) {
        print("Wave #"+waveNumber+" debug : i="+i);
        newEnemy = Instantiate(enemy, spawnLocation.position, spawnLocation.rotation) as EnemyControler;
        newEnemy.MobID= ++mobID;
        print("Spawning mob #" +mobID.ToString());
        remainingMobs.Add(newEnemy.MobID, newEnemy);
    }
}

public void GoToNextWave() {
    print("Wave "+waveNumber+" completed.");
    waveNumber++;
}

public void EnemyDied(int someID) {
    if(remainingMobs.Remove(someID)) {
        print("removed "+someID.ToString());
    } else {
        print("Failed to remove " + someID.ToString());
        DisplayRemainingMobs();

    }
}

public bool AllEnemiesDead() {
    print("remainingMobs.Count==0 ? " + (remainingMobs.Count==0));
    return remainingMobs.Count==0;
}

public void DisplayRemainingMobs() {
    string availableKeys="";
    foreach (KeyValuePair<int, EnemyControler> pair in remainingMobs){
        availableKeys+= pair.Key + ", ";
    }
    print(remainingMobs.Keys.Count + " are available : " + availableKeys);
}

}

这是带有.Destroy()

的类
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyControler : MonoBehaviour {

private Rigidbody myRB;
public WaveControler wave;
public float moveSpeed;

public PlayerControler thePlayer;

public int MobID { get; set; }

// Use this for initialization
void Start () {
    myRB = GetComponent<Rigidbody>();
    thePlayer = FindObjectOfType<PlayerControler>();
}

// Update is called once per frame
void Update () {
    transform.LookAt(thePlayer.transform.position);
}

private void FixedUpdate() {
    myRB.velocity = (transform.forward *moveSpeed);
}

private void OnDestroy() {
    wave.EnemyDied(MobID);
}

public override string ToString(){
    return String.Format("i'm number "+ MobID);
}

}

1 个答案:

答案 0 :(得分:4)

问题是你永远不会将敌人的wave字段设置为wavecontroller对象。因此它试图从空的波形控制器中移除敌人而不是实际的。实例化敌人时,将其波场设置为this