Hi, I make script to show rotate sprite of my snake but I think it can be better but I don’t know how improve code. I am know code is terrible :/.
If player change direction in Snake class:
void ChangeMoveDirection()
{
if ((Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.W)) && MoveDirectionEnum != MoveDirection.down && MoveDirectionEnum != MoveDirection.up)
{
MoveDirectionEnum = MoveDirection.up;
roadTurn.Add(gameObject.transform.position);
actualGround.GetComponent<Node>().turnDirection = MoveDirectionEnum;
actualGround.GetComponent<Node>().isTurnNode = true;
SetSprite();
isPossibleChangeDirection = false;
}
Others if’s look similar.
Now when player move one node forward in other snake parts run method Move:
If body part is in position where snake change direction (Method IsTurnPosition return true) then will show correct rotate sprite.
Body class
snakeBodyIndex is index this body (GameObject) from array in Snake class with all body.
public void Move(int snakeBodyIndex)
{
previousPosition = gameObject.transform.position;
if (snakeBodyIndex > 0 && snakeBodyIndex < 2)
{
targetPosition = snake.snakeBody[snakeBodyIndex-1].GetComponent<Body>().previousPosition;
transform.position = targetPosition;
if (IsTurnPosition(gameObject.transform.position))
{
SetTurnSprite(snake.snakeBody[snakeBodyIndex-1].GetComponent<Body>().transform.position, snake.snakeTail.transform.position);
}
else SetSprite(snake.snakeBody[snakeBodyIndex-1].GetComponent<Body>().transform.position);
}
else if (snakeBodyIndex >= 2)
{
targetPosition = snake.snakeBody[snakeBodyIndex-1].GetComponent<Body>().previousPosition;
transform.position = targetPosition;
if (IsTurnPosition(gameObject.transform.position))
{
SetTurnSprite(snake.snakeBody[snakeBodyIndex-1].GetComponent<Body>().transform.position, snake.snakeBody[snakeBodyIndex-1].GetComponent<Body>().transform.position);
}
else SetSprite(snake.snakeBody[snakeBodyIndex-1].GetComponent<Body>().transform.position);
}
else
{
targetPosition = snake.previousPosition;
transform.position = targetPosition;
if (IsTurnPosition(gameObject.transform.position))
{
SetTurnSprite(snake.transform.position, snake.snakeTail.transform.position);
}
else SetSprite(snake.transform.position);
}
}
void SetTurnSprite(Vector2 targetPosition, Vector2 previousBodyPosition)
{
foreach (var item in GameObject.FindGameObjectsWithTag("Ground"))
{
if (item.transform.position == gameObject.transform.position)
{
actualGround = item;
break;
}
}
if (actualGround.GetComponent<Node>().turnDirection == Snake.MoveDirection.down)
{
if (previousPosition.x < gameObject.transform.position.x) spriteRenderer.sprite = bodySprites[0];
else spriteRenderer.sprite = bodySprites[1];
}
if (actualGround.GetComponent<Node>().turnDirection == Snake.MoveDirection.left)
{
if (previousPosition.y < gameObject.transform.position.y) spriteRenderer.sprite = bodySprites[0];
else spriteRenderer.sprite = bodySprites[4];
}
if (actualGround.GetComponent<Node>().turnDirection == Snake.MoveDirection.right)
{
if (previousPosition.y < gameObject.transform.position.y) spriteRenderer.sprite = bodySprites[1];
else spriteRenderer.sprite = bodySprites[3];
}
if (actualGround.GetComponent<Node>().turnDirection == Snake.MoveDirection.up)
{
if (previousPosition.x < gameObject.transform.position.x) spriteRenderer.sprite = bodySprites[4];
else spriteRenderer.sprite = bodySprites[3];
}
}
bool IsTurnPosition(Vector2 bodyPosition)
{
for (int i = 0; i < snake.roadTurn.Count; i++)
{
if (snake.roadTurn[i] == bodyPosition) return true;
}
return false;
}