Нельзя стрелять огненным шаром дважды

#c# #unity3d #2d

#c# #unity3d #2d

Вопрос:

Итак, я делаю игру, похожую на Space Invaders, только с Poke’mon. В игре игрок (Charmeleon) должен стрелять огненными шарами при нажатии клавиши пробела (по одному огненному шару за каждое нажатие). Проблема в том, что когда я нажимаю клавишу пробела, игрок стреляет всеми огненными шарами одновременно только после одного нажатия. Как я могу это исправить? Я отдам игру бесплатно тому, кто решит мою проблему после того, как я закончу. Вот мой код:

 if (ableToFire == true)
    {
        GameObject Flame = GameObject.Find("Fire");

        if (usedFire == 0)
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                Debug.Log("Fire");

                Flame.GetComponent<SpriteRenderer>().enabled = true;
                Flame.GetComponent<Rigidbody>().AddForce(Vector3.up * 175);

                usedFire  ;

                Debug.Log("You used fire "   usedFire   " times");
            }
        }


        GameObject Flame2 = GameObject.Find("Fire 2");

        if (usedFire == 1)
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                Debug.Log("Fire");

                Flame2.GetComponent<SpriteRenderer>().enabled = true;
                Flame2.GetComponent<Rigidbody>().AddForce(Vector3.up * 175);

                usedFire  ;

                Debug.Log("You used fire "   usedFire   " times");
            }
        }
    }
  

Ответ №1:

Игрок стреляет всеми огненными шарами одновременно после всего одного нажатия.

Мы можем более четко понять, почему это происходит, если мы проверим поток вашего кода. Сначала мы проверяем, может ли игрок стрелять, если он есть, затем мы дополнительно проверяем, являются ли usedFire целые числа 0 или 1.

Проблема сейчас в том, что после перехода к usedFire == 0 части вашего кода мы увеличиваем usedFire переменную, затем оставляем функцию и после этого проверяем, равна ли usedFire переменная 1. Так оно и есть, потому что мы только что увеличили его.

Итак, теперь вторая часть кода get вызывается снова, увеличивая usedFire переменную до 3. Повторное использование в другой части кода вызывается и, таким образом, не приводит к появлению новых огненных шаров.

 if (ableToFire != true || !Input.GetKeyDown(KeyCode.Space)) {
    // If the player can't fire or hasn't pressed space, skip the rest of the code.
    return;
}

if (usedFire == 0) {   
    Flame.GetComponent<SpriteRenderer>().enabled = true;
    Flame.GetComponent<Rigidbody>().AddForce(Vector3.up * 175);

    usedFire  ;
    Debug.Log("You used fire "   usedFire   " times");
}
else if(usedFire == 1) {
    Flame2.GetComponent<SpriteRenderer>().enabled = true;
    Flame2.GetComponent<Rigidbody>().AddForce(Vector3.up * 175);

    usedFire  ;
    Debug.Log("You used fire "   usedFire   " times");

    // Reset usedFire so we can use it again.
    usedFire = 0;
}
  

Я бы также посоветовал вам переместить оба GameObject.Find() вызова в Start() метод, потому что поиск по 2 игровых объекта в каждом кадре действительно сказывается на производительности игр.

 GameObject Flame;
GameObject Flame2;

private void Start() {
    Flame = GameObject.Find("Fire");
    Flame2 = GameObject.Find("Fire 2");
}
  

Комментарии:

1. Привет, большое спасибо за вашу помощь. У меня была небольшая проблема, которую ты не мог предвидеть, но я исправила ее, так что теперь ты мой любимый человек, Мэтью. После того, как я закончу игру, я отправлю ее вам бесплатно. (Это будет бесплатно для всех, но кого это волнует)

2. Я обязательно попробую, кажется, это интересно: D

3. Привет, я наконец-то закончил игру. Я обещал вам, что отправлю вам игру, так что вот она. Это моя первая игра: baryo.itch.io/pokemon-invaders

4. Я сохраню его и воспроизведу, как только вернусь домой: P

5. Я бы посоветовал вам создать жесткую сборку WebGL, у вас будет гораздо больше людей, играющих в вашу игру, если они смогут сделать это в своем браузере.