Как получить список для правильного подсчета общего числа int в Unity - PullRequest
0 голосов
/ 29 апреля 2020

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

У меня есть 2 игровых объекта "Блок1", " block2" . Я хочу иметь возможность подсчитать общее количество блоков, когда они входят в круг. Для этого я сделал следующее:

Поместил скрипт в каждый блок с именем NumberBlock. Затем я конвертирую блок в его Integer, используя следующий скрипт: publi c int number; string str;

private void Awake()
{
    str = gameObject.transform.name; //first get the name

    str = str.Substring(str.Length -1, 1); //remove all words apart from number
    int.TryParse(str, out number); //convert string to number


}

Это успешно оставляет меня с целым числом = 1, 2 et c.

Я тогда пу sh блок в сферу. Сфера имеет скрипт, который делает следующее: 1- Создает пустой список интергеров. 2- OnTriggerEnter Проверяет, что тег объектов не является игроком или землей. 3- Получает объект Numberblock Script и проверяет блоки "IntNumber", затем добавляет его. в список InCircle. Наконец, foreach суммирует каждое число, чтобы дать итоговое значение (TotalBlocks).

// отслеживать, сколько чисел в круге опубликовано c List InCircle = new List ();

//add the total number in the blocks
public int BlockNumber;
public int TotalBLocks;

private void OnTriggerEnter(Collider other)
{

    if (other.CompareTag("Player"))
    {
        return;
    }

    if (other.CompareTag("Floor"))
    {
        return;
    }

    //get the blocks number
    BlockNumber = other.transform.GetComponent<Numberblocks>().number;

      //add block number to the list
      InCircle.Add(BlockNumber);

    foreach (int e in InCircle)
    {
        TotalBLocks += e;

    }

}

Проблема, как видно на скриншоте, заключается в том, что TotalBlocks неправильно суммирует значения. Блок 1 и блок 2 должны суммировать 3, а не 4. Список InCircle правильно хранит 2 значения, я также проверил, сохранив игровые объекты, которые также правильно отображаются.

Пожалуйста, помогите мне понять, где я делаю это неправильно? введите описание изображения здесь

1 Ответ

1 голос
/ 30 апреля 2020
TotalBLocks += e; 

также выполняется в первый раз для Block1, поэтому оно уже 1, когда вы приходите к следующему вызову с Block1 и Block2 => 1 + 1 + 2 = 4


Вы бы хотели сбросить его до пересчета:

private void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Player"))
    {
        return;
    }

    if (other.CompareTag("Floor"))
    {
        return;
    }

    BlockNumber = other.transform.GetComponent<Numberblocks>().number;

    InCircle.Add(BlockNumber);

    // Reset this!
    TotalBlocks = 0;
    foreach (int e in InCircle)
    {
        TotalBLocks += e;
    }
}

Или просто не использовать al oop, а только добавить новый номер блока:

private void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Player"))
    {
        return;
    }

    if (other.CompareTag("Floor"))
    {
        return;
    }

    BlockNumber = other.transform.GetComponent<Numberblocks>().number;

    // Not sure if still needed then
    InCircle.Add(BlockNumber);

    // Only add the new number
    TotalBLocks += BlockNumber;
}

Я бы также добавил HashSet, чтобы каждый объект добавлялся в список только один раз, чтобы избежать повторяющихся записей.

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