В подобной ситуации я предпочитаю смещать только значения в массиве, а блоки двигать по формуле...
Код
public class BlockItem:MonoBehaviour
{
float size = 10f;
float speed = .1f;
Vector2Int gridposition = new Vector2Int;
public void SetPosition(int x, int y)
{
gridposition.x = x;
gridposition.y = y;
if(transform.position.y!= (float)gridposition.y*size)
{
StartCoroutine(Move());
}
}
private IEnumerator Move()
{
Vector3 newpos = transform.position;
int dir = (transform.position.y> ((float)gridposition.y*size))?1:-1;
while(Mathf.Abs(transform.position.y - ((float)gridposition.y*size)>.1f)
{
newpos.y += + speed *dir;
transform.position = newpos;
yield return null;
}
newpos.y = (float)gridposition.y*size);
transform.position = newpos;
}
}
дальше создаешь массив с этих объектов и при изменении передаешь новые координаты в SetPosition();