Как я могу минимизировать использование операторов if if? - PullRequest
0 голосов
/ 05 января 2019

Как мне установить значение направления без необходимости бросать все остальные опции?

if (Input.GetKey(right_button)) { direction = 1; }
else if(Input.GetKey(left_button)) { direction = -1; }        
else { direction = 0; }
if (direction!=0) { rb.velocity = new Vector2(player_speed*direction, rb.velocity.y);  }

Мне нужно перевести вход игрока в движение. Я не могу использовать оси, потому что я не могу изменить их так же легко, как используя этот метод.

Как я могу оптимизировать этот кусок кода?

Ответы [ 3 ]

0 голосов
/ 05 января 2019

Вы можете определить коллекцию, которая определяет, какие входные данные обеспечивают какое направление:

var directionMap = new List<(bool isInputPressed, int directionalValue)>
{
    (Input.GetKey(right_button), 1),
    (Input.GetKey(left_button), -1)
};

И затем, чтобы получить направление, вы просто получаете directionalValue из записей в коллекции, где isInputPressed истинно:

var direction = directionMap.Where(x => x.isInputPressed).Sum(x => x.directionalValue);

Использование .Where() может потенциально привести к неожиданным результатам, если обе кнопки будут нажаты одновременно. Если этого никогда не произойдет, вы можете изменить вышеприведенное, используя вместо него .SingleOrDefault():

var direction = directionMap.SingleOrDefault(x => x.isInputPressed).directionalValue;

Обратите внимание, что это приведет к исключению, если одновременно нажимается более одной кнопки. Вы можете обработать это исключение в блоке try / catch. Или вы могли бы убедиться, что только одна нажата, прежде чем вызвать .SingleOrDefault(), а затем продолжить соответственно.

0 голосов
/ 06 января 2019

Ваше беспокойство по поводу оптимизации преждевременно. Ответ @Christos является лучшим с точки зрения производительности (скопировано ниже)

// set the value of 0 to direction from the start and change it if it is needed
direction = 0;
if (Input.GetKey(right_button)) 
{ 
    direction = 1; 
}
if(Input.GetKey(left_button)) 
{ 
    direction = -1; 
}

Это единственная оптимизация, поскольку она удаляет ветку из пути кода.

Я бы сказал, для стиля и читабельности, держитесь подальше от терминальных операторов (используя синтаксис bool? 1: 0). Они обычно приводят к более запутанному коду для чего-либо, возвращающего ясно читаемое значение с ясным условием.

В этих различных реализациях нужно учитывать то, хотите ли вы, чтобы ваш персонаж двигался только в четырех направлениях (при условии, что вы могли бы увеличивать и уменьшать) или поддерживал диагональное движение. Удаление операторов «else» в вашем коде позволит вам перемещаться по диагонали. Если вы сохраните «еще, если», то вы сможете двигаться только в основных направлениях. Если вы хотите двигаться только влево и вправо, подумайте, что произойдет, когда оба будут нажаты. Плеер никуда не девается? Игрок движется в направлении последнего нажатия? Если вы добавляете вверх и вниз, как вы отслеживаете нажатие 3 кнопок?

0 голосов
/ 05 января 2019

Другой способ написать выше без if / else будет следующим:

direction = Input.GetKey(right_button) 
                ? 1
                : Input.GetKey(left_button)
                      ? -1 
                      : 0;

Я не знаю, является ли это более читабельным. В этом случае, я думаю, что это скорее предпочтение того, как вы хотите написать этот фрагмент кода, чем то, что он более читабелен. Другими словами, я не думаю, что операторы if / else не читаются - в качестве небольшой модификации я бы предложил вам поместить в другую строку тело, а не в эту же строку - но это опять-таки личное предпочтение :).

if (Input.GetKey(right_button)) 
{ 
    direction = 1; 
}
else if(Input.GetKey(left_button)) 
{ 
    direction = -1; 
}
else 
{ 
    direction = 0; 
}

Что касается вашего второго вопроса, в вашем коде нет проблем с производительностью.

Другим подходом было бы следующее:

// set the value of 0 to direction from the start and change it if it is needed
direction = 0;
if (Input.GetKey(right_button)) 
{ 
    direction = 1; 
}
if(Input.GetKey(left_button)) 
{ 
    direction = -1; 
}

По сути, мы устанавливаем значение direction равным 0 с начала и переустанавливаем значение только в том случае, если оно необходимо (либо Input.GetKey(right_button), либо Input.GetKey(left_button) возвращает значение true).

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