Работа с классами из массива или list<>

Программирование на Юнити.

Работа с классами из массива или list<>

Сообщение darktree 12 июн 2018, 17:02

Всем привет! Работаю над системой аммуниции игрока и столкнулся с проблемой над которой ломаю голову уже больше недели.

Я пользуюсь сторонней системой инвентаря которую дописал под свои нужды. У меня есть класс патронов, который содержит кол-во патронов и тип "string" для сортировки по глобальным переменным (если string "7х62" то плюсовать к int ak_ammo и т.д.). В чем сложность... Допустим у меня в инвентаре находится два класса в которых одинаковое количество патронов. Мне нужно перезарядить оружие и если в первом классе недостаточно патронов, то перейти ко второму и вычесть с него необходимое кол-во а первый удалить из списка. Я пытался реализовать всё это дело через листы, но насколько я понял, оперировать полями через них очень трудно...

Основные проблемы такие:
1) Как лучше объеденить все классы патронов. Через что ими оперировать? Массивы не дают гибкого контроля, а с листами пока особо не сталкивался и до конца их не понял.
2) Как дать понять скрипту какую пачку выбрать первой и как перейти ко второй.

Если кто-то работал над чем-то подобным или может подсказать направление, то ваше мнение будет очень полезным для меня. Ниже не рабочий кусок кода, который как-то описывает мою модель.

Спасибо за прочтение!

Синтаксис:
Используется csharp
public class AmmoGraber : MonoBehaviour {

    public int akCurrentCapacity;
    public int akMaxCapacity;

    public int akAmmo;
    public Ammo[] mainArray;
    public Ammo[] ammoArray;

    private void Update()
    {
        SearchAmmo();
       
    }

    void SearchAmmo()
    {
        for (int i = 0; i < mainArray.Length; i++)
        {
            if(mainArray[i].tag == "ak")
            {
                ammoArray[0] = mainArray[i];
            }
        }
    }

    void Reload()
    {
        while(akCurrentCapacity < akMaxCapacity && ammoArray!=null)
        {
            var arrayCounter = 0;

            if (ammoArray[arrayCounter].ammo > 0)
                akCurrentCapacity += 1;
            else
                ammoArray[arrayCounter] = null;
                arrayCounter++;
        }
    }
}
 
darktree
UNец
 
Сообщения: 8
Зарегистрирован: 03 июл 2012, 18:23

Re: Работа с классами из массива или list<>

Сообщение 1max1 12 июн 2018, 17:40

оперировать полями через них очень трудно

Та вроде нет :-?

А так и задумано что arrayCounter в цикле всегда будет равен 0?
Синтаксис:
Используется csharp
while(akCurrentCapacity < akMaxCapacity && ammoArray!=null)
        {
            var arrayCounter = 0;

            if (ammoArray[arrayCounter].ammo > 0)
                akCurrentCapacity += 1;
            else
                ammoArray[arrayCounter] = null;
                arrayCounter++;
        }
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Работа с классами из массива или list<>

Сообщение darktree 12 июн 2018, 19:02

Нет, это ошибка. Я даже не компилил.
darktree
UNец
 
Сообщения: 8
Зарегистрирован: 03 июл 2012, 18:23

Re: Работа с классами из массива или list<>

Сообщение darktree 12 июн 2018, 19:50

Разобрался ~x( Оставлю скрипт здесь, может кому-нибудь пригодиться.

Патроны берутся из первого элемента массива. Когда элемент пуст, счетчик меняется на один и переходит к следующему элементу.

Синтаксис:
Используется csharp
public class AmmoGraber : MonoBehaviour {

    public List<AmmoTest> ammoList;
    public int ammo = 4;
    public int ammoMax = 15;

    private void Start()
    {
        for(int i = 0; i < GetComponents<AmmoTest>().Length; i++)
        {
            ammoList.Add(GetComponents<AmmoTest>()[i]);
            Debug.Log(ammoList[i].name);
        }
    }

    void Update()
    {
        if(ammo > 0 && Input.GetKeyDown(KeyCode.Space))
        {
            ammo -= 1;
            Debug.Log("Shoot! Remaining bullets is " + ammo);
        }

        if(Input.GetKeyDown(KeyCode.R))
        {
            Reload();
        }
    }

    void Reload()
    {
        while (ammo < ammoMax)
        {
            var arrayIndex = 0;
           
            if (ammoList[arrayIndex].ammoCount > 0)
            {
                ammoList[arrayIndex].ammoCount -= 1;
                ammo += 1;
            }
            else if (ammo <= ammoMax)
            {
                ammoList.RemoveAt(arrayIndex);
                arrayIndex++;
            }
            else
                return;
        }
    }
}
darktree
UNец
 
Сообщения: 8
Зарегистрирован: 03 июл 2012, 18:23


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10