Это в Unity.Когда я пытаюсь удалить элемент, который я добавил в этот конкретный словарь, удаление завершается неудачно, и я не понимаю поведение.
Вот объявление:
private Dictionary<int, EnemyControler> remainingMobs = new Dictionary<int, EnemyControler>();
В какой-то моментЯ делаю это:
remainingMobs.Add(newEnemy.MobID, newEnemy);
MobID, являющийся int, я увеличиваю каждый раз, когда создаю нового врага, который прикрепляется к каждому из них
Когда враг умирает, в его 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 на string, думая, что он может появиться оттуда.Я не могу отладить это, и то, что я печатаю, только говорит мне, что это должно работать.Во время моих тестов числа совпадают.
Я даже сделал полную функцию, где я использую все эти функции в другом словаре, специально созданном для этого, чтобы быть уверенным, и все идет как надо.
Я имею в виду, что это может происходить из-за того, что удаление вызывается из метода, но тогда как я могу решить эту проблему, пожалуйста?
(словарь наклонных тегов, очевидно, из-за низкогоreput)
Редактировать: вот полный код: Это класс 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);
}
}