Как можно оптимизировать данный код?

Дело в чем, уже который раз сталкиваюсь с подобными конструкциями в чужом коде (я сам новичок, поэтому может глупый вопрос):

           if(i == 0)
            {
                _mov[0] = Vector3Int.forward;
                _mov[1] = Vector3Int.forward * -1;
                _mov[2] = Vector3Int.right;
                _mov[3] = Vector3Int.left;
            }
            else if(i == 1)
            {
                _mov[0] = Vector3Int.left;
                _mov[1] = Vector3Int.right;
                _mov[2] = Vector3Int.forward;
                _mov[3] = Vector3Int.forward * -1;
            }
            else if(i == 2)
            {
                _mov[0] = Vector3Int.forward * -1;
                _mov[1] = Vector3Int.forward;
                _mov[2] = Vector3Int.left;
                _mov[3] = Vector3Int.right;
            }
            else
            {
                _mov[0] = Vector3Int.right;
                _mov[1] = Vector3Int.left;
                _mov[2] = Vector3Int.forward * -1;
                _mov[3] = Vector3Int.forward;
            } 

Вопрос заключается в том, можно ли это сделать как-то более просто? Вряд-ли же возможна только такая реализация... Заранее спасибо за ответ!!


Ответы (3 шт):

Автор решения: Anton S.

Как минимум можно не в каждой строчке в ячейку писать, а в одну строку, типа _mov = {..., ... ,..., ...}. Во-вторых нужно вообще понимание что это за mov и зачем он нужен. Вполне возможно тут нужен не глупый массив, а объект, и инициализировать данный объект через конструктор. А Все if'ы можно заменить мапой, где ключ - число, значение - объект с заданными параметрами. Далее просто выдёргивать по ключу объект и пользоваться им

Примерная реализация.

Объект

class Mover {
    поле1 = null
    поле2 = null
    поле3 = null
    поле4 = null

    конструктор Mover(поле1, поле2, поле3, поле4) {
        присваивание значений
    }
}

Мапа

Dictionary<int, Mover> myDictionary = new Dictionary<int, Mover>() { 
    {0, new Mover(..., ..., ..., ...)}, 
    {1, new Mover(..., ..., ..., ...)}, 
    {2, new Mover(..., ..., ..., ...)}, 
    {-1, new Mover(..., ..., ..., ...)}, 
};

Далее в коде

if (myDictionary.TryGetValue(КЛЮЧ, out value)) {
    
} else {
   myDictionary.TryGetValue(-1, out value);
}

Вместо if/else можно изначально дефолтное значение задать переменной, а потом просто применить TryGetValue по ключу. Если получится достать - то значение в переменной изменится, а если нет, то останется дефолтным

типа

value =  myDictionary[-1]; // это псевдокод, я не знаю как это выглядит в C#
myDictionary.TryGetValue(КЛЮЧ, out value)
→ Ссылка
Автор решения: MBo

Поиграем с поворотами базового вектора forward на нужные углы:

for j = 0..3
    an = pi/2 * (i - (j&1)<<1 - (j&2)>>1)
    s,c = sincos(an)
                        [ c -s]
    mov[j] = (fx, fy) * [     ]
                        [ s  c]

где fx, fy - компоненты forward вектора

На Python: https://onlinegdb.com/ZZZDh18TXK
И без тригонометрии: https://onlinegdb.com/HUl2ZDb6KR

→ Ссылка
Автор решения: pasx

Код можно упростить, например, так:

var f =  Vector3Int.forward;
var b =  Vector3Int.back;
var r =  Vector3Int.right;
var l =  Vector3Int.left;
(_mov[0], _mov[1], _mov[2], _mov[3]) = i switch
{
    0 => (f, b, r, l),
    1 => (l, r, f, b),
    2 => (b, f, l, r),
    _ => (r, l, b, f),
};
→ Ссылка