这是在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);
}
}
答案 0 :(得分:4)
问题是你永远不会将敌人的wave
字段设置为wavecontroller对象。因此它试图从空的波形控制器中移除敌人而不是实际的。实例化敌人时,将其波场设置为this
。