PlayerController (Unity/C#). Условия запуска анимаций по 8-ми направлениям. Ошибка "не все пути возвращают значение
Проблематика: пишу код для запуска Спрайт-анимаций в зависимости от направления движения по X и Y. Перечислил все состояния (x>0 y>0, x>0 y<0, x<0 y<0, x<0 y>0, x=0 y<0, x=0 y>0, x>0 y=0 x<0 y=0). Ошибка:
"TopDownController.GetSpriteDirection()": не все пути возвращают значение.
Заранее извиняюсь за стилистику. Полный нуб. Код писал по уроку.
Код:
List<Sprite> GetSpriteDirection()
{
List<Sprite> selectedSprites = null;
if (direction.y > 0) // north east
{
if (direction.x > 0)
{
selectedSprites = nESprites;
}
}
else if (direction.y > 0) // north west
{
if (direction.x < 0)
{
selectedSprites = nWSprites;
}
else if (direction.y < 0) // south east
{
if (direction.x > 0)
{
selectedSprites = sESprites;
}
else if (direction.y < 0) // south west
{
if (direction.x < 0)
{
selectedSprites = sWSprites;
}
}
else if (direction.y < 0) // south
{
if (direction.x == 0)
{
selectedSprites = sSprites;
}
}
else if (direction.y > 0) // north
{
if (direction.x == 0)
{
selectedSprites = nSprites;
}
}
else if (direction.y == 0) // east
{
if (direction.x > 0)
{
selectedSprites = eSprites;
}
}
else if (direction.y == 0) // west
{
if (direction.x < 0)
{
selectedSprites = wSprites;
}
}
return selectedSprites;
}
}
}
Ответы (2 шт):
Каждая ветвь в методе GetSpriteDirection должна возвращать List<Sprite>, например, selectedSprites. У вас есть первое условие direction.y > 0 и, соответственно, две ветви: когда это условие верно, и когда нет. Обе эти ветви должны возвращать какое-то значение списка. А у вас значение возвращается только в одной из последующих подветвей блока else.
Проще всего в таком случае написать оператор return один раз в самом конце метода, а в каждой из ветвей только изменять соответствующим образом возвращаемый список. Или же, если ветвей немного и они очевидны, то использовать несколько операторов return (но в этом конкретном случае это не так, ибо ветвей много)
У тебя столько if, что ты сам запутался. Первое же условие ничего не возвращает, если х не больше нуля. Вся эта пизанская башня вообще не нужна, дело решается в две строчки и конкатенацией.
public string GetCompasVector (Vector2 vector)
{
string ver = vector.y > 0 ? "n" :
vector.y < 0 ? "s" : "";
string hor = vector.x > 0 ? "e" :
vector.x < 0 ? "w" : "";
return ver + hor;
}
string spriteName = GetCompasVector(direction) + "Sprite";