#c# #unity3d
#c# #unity3d
Вопрос:
Я использую C # и Unity для шутера. Мой код работает, но я бы хотел его подправить. У меня есть это в дереве смешивания, и я использую, в каком направлении находится игрок, чтобы выстрелить пулей. Проблема в том, что если вы быстро меняете направление, игрок не всегда стреляет. Я обнаружил, что это связано с тем, что полное значение 1 или -1 не всегда достигается. Если я ставлю «меньше или равно» вместо «равно (==)», пули стреляют все время, так как в этот момент они всегда «меньше». Есть ли другой способ сделать это? Заранее благодарю.
Пример моего кода, это только 2 направления для экономии места, это 4-х направленный спрайт. Я прошу прощения, если код разбит, я не знаю, как правильно его показать здесь.
if (myAnimator.GetFloat("DirectionX") == -1f)
{
shotTime = Time.time timeBetweenShots;
GameObject b = (Instantiate(bulletLeft, shotPoint.position -transform.right, Quaternion.identity));
b.GetComponent<Rigidbody2D>().AddForce(-transform.right * speed);
}
if (myAnimator.GetFloat("DirectionY") == 1f)
{
shotTime = Time.time timeBetweenShots;
GameObject b = (Instantiate(bulletUp, shootUpPoint.position transform.up, Quaternion.Euler(0, 0, 90)));
b.GetComponent<Rigidbody2D>().AddForce(transform.up * speed);
}
Комментарии:
1. Числа с плавающей запятой по своей сути являются приближениями. Поэтому проверки на равенство, как правило, бессмысленны в этом контексте. Равенство может использоваться только с числами с фиксированной запятой, такими как int, decimal, long . Короче говоря, если вы согласны с приближениями, используйте плавающую точку из-за гораздо лучшей производительности; если вам нужна точность, используйте фиксированную точку.
2. Вы можете использовать меньшее или равное, но вы должны исключить 0 и более, т.е. dir> 0.0f amp;amp; dir <= 1.0f или dir < 0.0f amp;amp; dir > = -1.0f
Ответ №1:
Похоже, вы ищете дискретные целочисленные значения:
int dirX = Mathf.RoundToInt(myAnimator.GetFloat("DirectionX"))
if(dirX == 1)
//etc