Не удалось удалить словарь C # - PullRequest
0 голосов
/ 01 июня 2018

Это в 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);
}

}

1 Ответ

0 голосов
/ 01 июня 2018

Проблема в том, что вы никогда не устанавливаете вражеское поле wave для объекта wavecontroller.Поэтому он пытается убрать врага из пустого волнового контроллера вместо действующего.Когда вы создаете экземпляр врага, установите его волновое поле на this.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...