Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 28.10.2012
Сообщений: 60
1

Не удаляется объект из списка

16.07.2014, 12:58. Показов 831. Ответов 14
Метки нет (Все метки)

у меня есть список:

C#
1
private List<T> List = new List<T>();
где класс Т:

C#
1
2
3
4
public class T : MonoBehaviour {
    public GameObject a = null;
    public GameObject b = null;
}
можно делать так?

C#
1
2
3
4
5
6
7
8
void Update () {
        List.ForEach(Damage);
                код.....код....код
}
void Damage(T go){
код...код...код
if(код...код...код)
List.Remove(go);
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.07.2014, 12:58
Ответы с готовыми решениями:

Говорит что объект есть, но в коде точно видно что объект удаляется
Добрый день. Вот небольшой пример кода. IF NOT OBJECT_ID('tempdb..#TMP_1') IS NULL DROP TABLE...

Не удаляется объект
Доброго времени суток, в коде я удаляю объект, и сразу же добавляю вместо него другой, но проблема...

Почему удаляется объект?
Помогите, пожалуйста, понять почему удаляется объект и как это исправить? Идея следующая: В...

Не удаляется объект из памяти
Здравствуйте! У меня возникла следующая проблема: Мне нужно сделать форму, на которой бы...

14
Эксперт .NET
15343 / 11630 / 3052
Регистрация: 17.09.2011
Сообщений: 19,469
16.07.2014, 13:24 2
Нельзя, вылетит ошибка при итерации коллекции, которая была изменена.

Замените ForEach на обычный for или лучше while.
0
0 / 0 / 1
Регистрация: 28.10.2012
Сообщений: 60
16.07.2014, 13:32  [ТС] 3
у мена кажись всё работает, только не хочет удалять из списка(
0
Эксперт .NET
5310 / 4106 / 1183
Регистрация: 12.10.2013
Сообщений: 11,909
Записей в блоге: 2
16.07.2014, 13:54 4
Цитата Сообщение от alexasassin Посмотреть сообщение
только не хочет удалять из списка(
alexasassin, через foreach удалить элемент из коллекции нельзя. Вам же ясно сказали...
Цитата Сообщение от kolorotur Посмотреть сообщение
Замените ForEach на обычный for или лучше while.
0
0 / 0 / 1
Регистрация: 28.10.2012
Сообщений: 60
16.07.2014, 13:58  [ТС] 5
как через for сделать? а то я 3 дня C# знаю(
0
Эксперт .NET
15343 / 11630 / 3052
Регистрация: 17.09.2011
Сообщений: 19,469
16.07.2014, 14:08 6
Цитата Сообщение от alexasassin Посмотреть сообщение
как через for сделать?
C#
1
2
for (int i = List.Length - 1; i >= 0; i--)
   Damage(List[i]);
1
0 / 0 / 1
Регистрация: 28.10.2012
Сообщений: 60
16.07.2014, 15:41  [ТС] 7
Цитата Сообщение от kolorotur Посмотреть сообщение
List.Length
у меня нету такого(
я для Юнити3д пишу...

Добавлено через 1 час 20 минут
использевал List.Count в цикле for, но всё равно не удаляет.
0
Заблокирован
16.07.2014, 16:16 8
alexasassin, покажите как вы использовали, должно работать:

C#
1
2
            for (int i = List.Count - 1; i >= 0; i--)
                Damage(List[i]);
0
0 / 0 / 1
Регистрация: 28.10.2012
Сообщений: 60
16.07.2014, 17:32  [ТС] 9
C#
1
2
3
4
5
6
7
8
void Update () {
        for (int i = ListShell.Count - 1; i >= 0; i--){
            Damage(ListShell[i]);
        }
}
public void Damage(TDTowerSeill shell){
        if(код...код...код){
            ListShell.Remove(shell);
Добавлено через 15 минут
вот так добавляю обект
C#
1
2
3
4
5
6
7
8
9
10
void Update(){
код....код....код...код....
 if(код){
    T go = new T();
    go.a = (GameObject)Instantiate(a);
    go.b = b;
    ListShell.Add(go);
    Destroy (go);
 }
}
0
Эксперт .NET
15343 / 11630 / 3052
Регистрация: 17.09.2011
Сообщений: 19,469
16.07.2014, 18:29 10
Цитата Сообщение от alexasassin Посмотреть сообщение
использевал List.Count в цикле for, но всё равно не удаляет.
Ищите косяк вот в этом месте:
Цитата Сообщение от alexasassin Посмотреть сообщение
C#
1
2
public void Damage(TDTowerSeill shell){
        if(код...код...код){
0
0 / 0 / 1
Регистрация: 28.10.2012
Сообщений: 60
16.07.2014, 19:10  [ТС] 11
Цитата Сообщение от kolorotur Посмотреть сообщение
Ищите косяк вот в этом месте:
у меня выполняетса условие после удаление, а удаление нет(

Добавлено через 1 минуту
вожет он не знает как удалять мой класс?
может там нужно перегрузить функцию дестрой? ну или както так....
0
Life Builder
526 / 493 / 373
Регистрация: 12.01.2011
Сообщений: 1,734
16.07.2014, 21:12 12
Цитата Сообщение от alexasassin Посмотреть сообщение
у меня есть список:
Код C#
1
private List<T> List = new List<T>();
поменяйте переменную List на list. Может поэтому не хочет работать.
0
0 / 0 / 1
Регистрация: 28.10.2012
Сообщений: 60
16.07.2014, 21:21  [ТС] 13
Цитата Сообщение от sk007 Посмотреть сообщение
поменяйте переменную List на list. Может поэтому не хочет работать.
тут я для примера так написал, в проекте другое имя ListShell
0
Life Builder
526 / 493 / 373
Регистрация: 12.01.2011
Сообщений: 1,734
16.07.2014, 21:49 14
Цитата Сообщение от alexasassin Посмотреть сообщение
тут я для примера так написал, в проекте другое имя ListShell
Можете свой проект скинуть посмотрим
0
0 / 0 / 1
Регистрация: 28.10.2012
Сообщений: 60
17.07.2014, 01:19  [ТС] 15
файл TDTower.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
 
public class TDTower : MonoBehaviour {
    
    public GameObject curTarget = null;
    public GameObject TowerShell = null;
    public float towerPrice = 100.0f;
    public float towetHeight = 15.0f;
    public float attackMaxDistance = 100.0f;
    public float attackMinDistance = 0.0f;
    public float attackDamage = 10.0f;
    public float reloadTimer = 1.0f;
    private float reloadCooldown = 1.0f;
    public TDGlobal Global;
    
    private List<TDTowerSeill> ListShell = new List<TDTowerSeill>();
 
    //public RaycastHit Hit;
    
    // Use this for initialization
    void Start () {
        reloadCooldown = reloadTimer;
        Global = GameObject.FindGameObjectWithTag("Global").GetComponent<TDGlobal>();
    }
    
    // Update is called once per frame
    void Update () {
        for (int i = ListShell.Count - 1; i >= 0; i--){
            Damage(ListShell[i]);
        }
        if(curTarget != null){
            float distance = Vector3.Distance(gameObject.transform.position, curTarget.transform.position);
            if(attackMaxDistance > distance && distance > attackMinDistance){
                if(reloadTimer > 0) reloadTimer -= Time.deltaTime;
                else if(reloadTimer <= 0) {
                    TDTowerSeill TD = new TDTowerSeill();
                    TD.Shell = (GameObject)Instantiate(TowerShell);
                    TD.Shell.transform.position = gameObject.transform.position;
                    TD.SeillTarget = curTarget;
                    ListShell.Add(TD);
                    Destroy (TD);
                    reloadTimer = reloadCooldown;
                }
            }
            else curTarget = null;
        }
        else curTarget = SortTardets();
    }
    
    public void Damage(TDTowerSeill shell){
        shell.Shell.transform.rotation = Quaternion.Slerp (shell.Shell.transform.rotation, Quaternion.LookRotation(shell.SeillTarget.transform.position - shell.Shell.transform.position), 100 * Time.deltaTime);
        shell.Shell.transform.position += shell.Shell.transform.forward * 10 * Time.deltaTime;
        if(Vector3.Distance (shell.Shell.transform.position, shell.SeillTarget.transform.position) < 0.05){
            TDMobHP mhp = shell.SeillTarget.GetComponent<TDMobHP>();
            ListShell.Remove(shell);
            mhp.ChangeHP(-attackDamage);
        }
    }
    
    public GameObject SortTardets(){
        float MobDistance = 0.0f;
        GameObject nearestmob = null;
        foreach(var everyTarget in Global.Mobs){
            if(Vector3.Distance(everyTarget.transform.position, gameObject.transform.position) < MobDistance || MobDistance == 0){
                MobDistance = Vector3.Distance(everyTarget.transform.position, gameObject.transform.position);
                nearestmob = everyTarget;
            }
        }
        return nearestmob;
    }
}
файл TDTowerSeill.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using UnityEngine;
using System.Collections;
 
public class TDTowerSeill : MonoBehaviour {
    public GameObject SeillTarget = null;
    public GameObject Shell;
    // Use this for initialization
    void Start () {
    
    }
    
    // Update is called once per frame
    void Update () {
    
    }
файл TDMobHP.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using UnityEngine;
using System.Collections;
 
public class TDMobHP : MonoBehaviour {
    
    public float Soul;
    public float maxHP = 100.0f;
    public float curHP = 100.0f;
    public Color MaxColor = Color.red;
    public Color MinColor = Color.green;
    public TDGlobal Global;
    
    public void ChangeHP(float changeHP){
        if(curHP + changeHP > maxHP )curHP = maxHP;
        else curHP += changeHP;
    }
    
    
    // Use this for initialization
    void Start () {
    Global = GameObject.FindGameObjectWithTag("Global").GetComponent<TDGlobal>();
    }
    
    // Update is called once per frame
    void Update () {
        gameObject.renderer.material.color = Color.Lerp (MaxColor, MinColor, curHP / maxHP);
        if(curHP <= 0){
            Destroy(gameObject);
            Global.Soul += Soul;
        }
            
    }
    
    private void OnDestroy(){
        Global.Mobs.Remove(gameObject); 
            
    }
}
Добавлено через 35 секунд
это всё для Юнити3д

Добавлено через 2 минуты
есть клас башни в которых есть цена, дамаг, снаряд, цель(мобы). всё работает кроме удаления снарядов(

Добавлено через 2 часа 48 минут
во нашел)

Добавлено через 19 секунд
он улаляет из списка но не удаляет сам обект

Добавлено через 1 минуту
так почало работать)
C#
1
2
3
4
5
6
7
8
9
10
public void Damage(GameObject shell, GameObject target){
        ляляляляля
        if(ляляляляля){
            ляляляляля
            ListShell.Remove(shell);
            Destroy (shell);
            ListTarget.Remove(target);
            ляляляляля
        }
    }
Добавлено через 12 минут
вышло что если моба убил, а к нему ешё летит снаряд то вылетала ошибка так как цель унечтожета... сделал так, кажись норм))))
C#
1
2
3
4
5
6
7
8
9
10
11
void Update () {
        for (int i = ListShell.Count - 1; i >= 0; i--){
            if(ListShell[i] != null && ListTarget[i] != null)
            Damage(ListShell[i], ListTarget[i]);
            else {
                ListTarget.Remove(ListTarget[i]);
                Destroy(ListShell[i]);
                ListShell.Remove(ListShell[i]);
            }
        }
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.07.2014, 01:19

Объект удаляется до возвращения его из функции
Есть следующий код перегрузки операции &quot;+&quot; для сложения матриц: Matrix operator+(const Matrix...

Не удаляется объект после уничтожения shared_ptr
Добрый день Не могу понт почему так происходит? class Widget { public: void...

удаляется ли объект или происходит утечка памяти?
Добрый день, подскажите, при таком коде, удаляется ли объект или происходит утечка памяти? ...

Удаляется объект когда не требуется и всё равно продолжает существовать
Всем привет. Честно говоря я не знаю как ещё более правильно описать проблему в заголовке. В общем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.