Цель: создать функцию перезарядки для запуска лазеров в моей 2D-игре Galaxy Shooter, чтобы игрок не мог спамить лазерами.

Когда дело доходит до кода, необходимого для этой функции, он довольно прост и требует всего несколько строк. Лично я изо всех сил пытался понять, что именно делает код, чтобы моя функция перезарядки работала. Пожалуйста, объясните мне, что делает код, так как он заставит вас думать больше как инженер-программист. Если к концу вы просто запутались, смиритесь с замешательством и вернитесь к этому позже, если вам нужно. Мне тоже потребовалось немного времени, но теперь я могу объяснить это кому-то другому!

Давайте начнем с размышлений о том, что мы хотим сделать. В моем случае я хочу создать своего рода таймер, чтобы игрок мог стрелять лазером только по прошествии определенного времени с момента последнего выстрела лазера. Это приведет к тому, что игрок не сможет спамить лазером.

Теперь в код. Я объясню, что происходит, и проведу вас по коду по ходу дела.

Нам нужны 2 переменные с плавающей запятой. Я назвал свои _fireRate и _canFire.

Переменная _fireRate предназначена для количества времени, которое должно пройти, прежде чем игроку будет разрешено стрелять. Переменная _canFire необходима, чтобы нам было с чем сравнивать _fireRate. Если бы мы сказали, что _fireRate, например, равно 0,15, компьютеры хотели бы, чтобы 0,15 что? Через мгновение вы увидите больше того, что я имею в виду, и не беспокойтесь, если это запутает. Кто-то научил меня, и я тоже сначала растерялся. Не сдавайтесь!

Нам также потребуется использовать переменную Time.time, которая является числом с плавающей запятой. Эта переменная встроена в Unity и представляет собой текущее время с момента запуска приложения.

В окончательной реализации этого кода это будет выглядеть так:

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

В методе ShootLaser() мы также обновляем текущее значение _canFire. _canFire устанавливается со значением «=» на Time.time + _fireRate. Это означает, что переменная _canfire равна «=» текущему времени, прошедшему с момента запуска приложения, «+» скорострельности (0,15).

Это означает, что в операторе if мы проверяем, является ли текущее время с момента запуска приложения «›» текущим временем с момента запуска приложения «+» к скорострельности. Затем, когда мы запускаем огонь, переменная _canFire обновляется до нового значения, которое равно «=» текущему времени + скорострельности. Это означает, что каждый раз, когда вы стреляете, переменная _canFire имеет значение «=» еще на 0,15 секунды в будущем. Поэтому, когда вы проверяете, является ли Time.time «›», чем _canFire, вы проверяете, превышает ли текущее время 0,15 секунды с момента последнего выстрела.

Если вы хотите, вы также можете составить уравнение «›=», чтобы оно было более точным. Таким образом, вместо того, чтобы просто проверять, прошло ли больше 0,15 секунды, он также позволит вам выстрелить, если прошло ровно 0,15 секунды.

На данный момент это все, и я знаю, что для некоторых это может иметь смысл, но все же заставит вас задаться вопросом, как должны думать инженеры-программисты, поскольку это может вытолкнуть вас за пределы нормального человеческого мыслительного процесса. Это требует практики, и моя голова немного пульсирует, когда я пишу это, но это становится лучше :)

Продолжайте учиться и не сдавайтесь! Не стесняйтесь задавать любые вопросы!