뱀 위에 있지 않기
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에 있는 메서드가 머리와 모든 몸통을 확인합니다.
챌린지
중급먹이는 뱀 위에 떨어지지 않습니다.
Snake에서 머리의 칸이나 꼬리 부분 중 어느 하나의 칸에 해당하면 true를 반환하는public bool Occupies(Vector3 cell)을 작성하세요.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);
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
Unity 게임: 3D 스네이크의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드