Почему переменная не увеличивается при обнаружении столкновения? - PullRequest
0 голосов
/ 10 июля 2020

У меня есть поплавок с именем kill, и я хочу увеличивать его каждый раз, когда пуля сталкивается с противником.

Это мой код, но он не работает. Всегда остается ноль.

public float kill = 0;
Text killed;

void OnCollisionEnter2D(Collision2D bullet) 
{
    if(bullet.collider.tag == "bullet")
    {               
        Destroy(gameObject);
        kill++;
    }
}

void Update() 
{
    killed = GameObject.Find("killed").GetComponent<Text>();
    killed.text = kill.ToString();
}

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Во-первых, не звоните GameObject.Find или GetComponent часто, как в Update, поскольку это дорогостоящие операции. Вместо этого вызывайте их как можно несколько раз (например, вызывая их один раз в Start) и кешируйте результат.

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

Кроме того, когда вы вызываете Destroy(gameObject), вы в основном избавляетесь от всех значений в полях компонента. - Значит, вам следует хранить счетчик убийств в другом месте. Вы можете использовать для этого синглтон, или член класса stati c, или просто просто использовать текстовый компонент для отслеживания значения - для этого вы можете использовать int.TryParse.

Наконец, чтобы установите начальное значение текста, вы можете проверить, является ли это уже числом, а если нет, установите его на ноль. Для этого также можно использовать int.TryParse.

Всего:

Text killed;

void Start()
{
    killed = GameObject.Find("killed").GetComponent<Text>();
    int curKilled;
    if (!int.TryParse(killed.text, out curKilled))
    {
        // Does not already contain a number, set it to zero
        killed.text = "0";
    }
}

void OnCollisionEnter2D(Collision2D bullet) 
{
    if(bullet.collider.tag == "bullet")
    {               
        int curKilled;
        if (int.TryParse(killed.text, out curKilled))
        {
            killed.text = (curKilled+1).ToString();
        }
        else
        {
            // assume it should have been zero
            killed.text = "1";
        }
        Destroy(gameObject);
    }
}
0 голосов
/ 10 июля 2020

Скрипт привязан к врагу? Кажется, он должен быть привязан к объекту игрока. Поскольку счетчик убийств должен принадлежать игроку? Если он прикреплен к вражескому объекту, вы также должны добавить к убийствам перед уничтожением игрового объекта

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