Menu
CoddyTech

뱀 위에 있지 않기

Coddy의 Unity 게임: 3D 스네이크 코스 레슨. 14개 중 9번째.

MoveFood()는 뱀이 차지하고 있는 칸을 포함해 아무 칸이나 선택합니다. 뱀 아래에 있는 먹이는 뱀이 그 칸에서 벗어나야 먹을 수 있으며, 뱀이 길수록 이런 일이 더 자주 발생합니다.

한 가지 해결 방법은 빈 칸이 나올 때까지 다시 선택하는 것입니다. 비어 있는 보드에서는 잘 작동하지만, 보드가 채워질수록 시도 횟수가 점점 늘어나고 빈 칸이 하나도 남지 않으면 끝나지 않습니다. 확실한 해결 방법은 먼저 빈 칸 목록을 만든 다음 그중 하나를 선택하는 것입니다. 빈 칸은 모두 선택될 확률이 같고, 한 번만 선택하면 항상 충분합니다. 영화관에서 늦게 온 손님에게 좌석을 배정하는 것도 같은 방식입니다.

List<int> free = new List<int>();
for (int seat = 1; seat <= 40; seat++)
{
    if (!taken.Contains(seat)) free.Add(seat);
}
int pick = free[Random.Range(0, free.Count)];

Random.Range(0, free.Count)는 0부터 마지막 인덱스까지 중 하나를 반환합니다. 최댓값은 포함되지 않기 때문입니다. 목록을 만들기 위해 보드는 뱀에게 해당 칸을 차지하고 있는지 묻습니다. 즉, Snake에 있는 메서드가 머리와 모든 몸통을 확인합니다.

challenge icon

챌린지

중급

먹이는 뱀 위에 떨어지지 않습니다.

  1. Snake에서 머리의 칸이나 꼬리 부분 중 어느 하나의 칸에 해당하면 true를 반환하는 public bool Occupies(Vector3 cell)을 작성하세요.
  2. GameManager의 MoveFood()에서 x와 z를 -snake.edge부터 snake.edge까지 반복하고, !snake.Occupies(cell)인 각 칸을 List<Vector3> free에 추가한 다음, 먹이를 free[Random.Range(0, free.Count)]에 놓으세요.

‘플레이’를 누르고 뱀을 길게 키워 보세요. 먹이는 항상 빈 칸에 떨어집니다. 그런 다음 ‘확인’을 누르세요.

직접 해보기

using UnityEngine;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

    public Snake snake;
    public GameObject foodPrefab;
    private Transform food;
    private int score;

    void Awake()
    {
        Instance = this;
    }

    void Start()
    {
        food = Instantiate(foodPrefab).transform;
        MoveFood();
    }

    public bool IsFood(Vector3 cell)
    {
        return cell == food.position;
    }

    public void Eat()
    {
        score++;
        MoveFood();
    }

    void MoveFood()
    {
        int x = Random.Range(-snake.edge, snake.edge + 1);
        int z = Random.Range(-snake.edge, snake.edge + 1);
        food.position = new Vector3(x, 0f, z);
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Unity 게임: 3D 스네이크의 모든 레슨

직접 연습해 보세요: Unity 플레이그라운드