Unity — запись игровых объектов в переменные

#c# #unity3d

Вопрос:

У меня есть 2d массив, хранящий игровые объекты, и метод обновления логики. Вот 1-й код:

 public void UpdatePlayerPosition(Vector3 posStart, Vector3 posEnd)
    {
        
        _levelItems[(int)posEnd.x, (int)posEnd.z] = _levelItems[(int)posStart.x, (int)posStart.z];
        _levelItems[(int)posStart.x, (int)posStart.z] = null;

    }
 

Вот 2-й код

 public void UpdatePlayerPosition(Vector3 posStart, Vector3 posEnd)
    {
        var placeStart = _levelItems[(int)posStart.x, (int)posStart.z];
        var placeEnd = _levelItems[(int)posEnd.x, (int)posEnd.z];

        placeEnd = placeStart;
        placeStart = null;

    }
 

1-й код работает нормально, однако я хотел бы, чтобы он был более читаемым, как 2-й, который не работает. Я знаю о рекомендациях vars и ценностях, поэтому я знаю, почему это работает неправильно. Есть ли какой-нибудь способ заставить его работать должным образом и хорошо выглядеть ? Лучшее, что я могу сделать, это

 public void UpdatePlayerPosition(Vector3 posStart, Vector3 posEnd)
    {
        var placeStart = _levelItems[(int)posStart.x, (int)posStart.z];
        var placeEnd = _levelItems[(int)posEnd.x, (int)posEnd.z];

       _levelItems[(int)posEnd.x, (int)posEnd.z] = placeStart;
        _levelItems[(int)posStart.x, (int)posStart.z] = null;

    }
 

Ответ №1:

2-й код не будет работать, потому что вы просто присваиваете значение _levelItems[(int)posStart.x, (int)posStart.z] и _levelItems[(int)posEnd.x, (int)posEnd.z] placeStart и placeEnd соответственно. Затем вы просто меняете значение более поздних 2 переменных, а не массива. Вы должны изменить значение переменных массива напрямую, чтобы изменить их.

На мой взгляд, более чистый код будет выглядеть так:

 public void UpdatePlayerPosition(Vector3 posStart, Vector3 posEnd)
{
    int xStart = (int)posStart.x;
    int zStart = (int)posStart.z;
    int xEnd = (int)posEnd.x;
    int zEnd = (int)posEnd.z;

    _levelItems[xStart, zStart] = null;
    _levelItems[xEnd, zEnd] = placeStart;
}