Я вероятно все еще не понимаю что за система у тебя, что она просто меняет переменные не зная что она меняет и все счастливы) Ты все еще держишься за изменение переменных и интерфейс не применяешь как таковой.
По коду
// Блок выбора направления движения
if ((Input.GetKeyDown(KeyCode.W)) & !(UnitIsMove)) UnitDirection = "North"; // север
if ((Input.GetKeyDown(KeyCode.S)) & !(UnitIsMove)) UnitDirection = "South"; // юг
if ((Input.GetKeyDown(KeyCode.D)) & !(UnitIsMove)) UnitDirection = "East"; // восток
if ((Input.GetKeyDown(KeyCode.A)) & !(UnitIsMove)) UnitDirection = "West"; // запад
Вот этот код выше присваивает переменной UnitDirection одно из значений North/South/East/West и следовательно ни одно из следующих условий не сработает, т.к. в условии обязательно в переменной наличие двух значений, что можно сделать только битовыми флагами, а не строками.
if ((UnitIsMove) & ((UnitDirection == "North") && (UnitDirection == "South"))) RotatePlayerUnit(this.directionNS);
if ((UnitIsMove) & ((UnitDirection == "East") && (UnitDirection == "West"))) RotatePlayerUnit(this.directionEW);
Вот тут есть пример по перечислениям с битовыми флагами:
http://msdn.microsoft.com/ru-ru/libr...attribute.aspx
И тут в коде нет того, что ты хочешь избежать - исключения конструкций if или case. Они есть и довольно сложные.
На мой взгляд твоя задача сводится к следующему:
public int RotatePlayerUnit(int toMove)
{
return toMove++;
}
this.directionEW = RotatePlayerUnit(this.directionEW);
Т.е. обычная функция, обрабатывающая значение и возвращающая результат, который присваивается той переменной, с которой было взято исходное значение. И эту функцию можно вызвать для всех переменных, требующих изменения хоть в цикле, хоть по условию.