벽
Coddy의 Unity 게임: 3D 스네이크 코스 레슨. 14개 중 4번째.
보드의 칸은 x축과 z축에서 -7부터 7까지이므로, x와 z가 모두 -7에서 7 사이에 있는 칸은 보드 위에 있습니다. 보드의 중심이 0이므로, 하나의 검사로 양쪽을 모두 확인할 수 있습니다. Mathf.Abs(x) > 7은 어느 한쪽 가장자리를 넘으면 true입니다.
머리가 들어가려는 칸을 실제로 이동하기 전에 검사하세요. 그러면 뱀이 벽에 부딪혀도 보드의 마지막 칸에 머물고, 경계 안쪽으로 들어가지 않습니다. 0부터 7까지 번호가 매겨진 체스판의 룩도 같은 방식으로 검사합니다.
Vector3 target = transform.position + move;
if (target.x < 0 || target.x > 7 || target.z < 0 || target.z > 7)
{
return; // 보드 밖으로 벗어나면 룩은 제자리에 머뭅니다
}
transform.position = target;벽에 부딪히면 게임이 끝나고 뱀은 완전히 멈춥니다. Update()가 먼저 검사하는 bool이 이 역할을 합니다. 맨 위의 return은 키 입력과 타이머를 모두 건너뜁니다.
챌린지
쉬움public int edge = 7;를 추가합니다(보드의 칸은-edge부터edge까지입니다). 그리고public bool alive = true;를 추가합니다.Step()에서direction을 설정한 다음, 머리가 진입하려는 칸인next를 계산합니다. 보드 밖이면Die()를 호출하고 이동하지 않은 채 반환합니다. 그렇지 않으면 머리를next로 이동합니다.alive를 false로 설정하는void Die()를 작성합니다.- 뱀이 살아 있지 않을 때 반환하도록
Update()를 시작합니다. 이렇게 하면 죽은 뱀은 방향을 바꾸거나 이동하지 않습니다.
Play를 누르고, 벽을 향해 조종한 다음 Check를 누릅니다.
직접 해보기
using UnityEngine;
using UnityEngine.InputSystem;
public class Snake : MonoBehaviour
{
public float tick = 0.15f; // 두 번의 이동 사이의 시간(초)
private float timer;
private Vector3 direction = Vector3.right; // 머리가 마지막 이동에서 움직인 방향
private Vector3 nextDirection = Vector3.right; // 다음 이동을 기다리는 방향 전환
void Update()
{
Keyboard keyboard = Keyboard.current;
if (keyboard != null)
{
if (keyboard.upArrowKey.wasPressedThisFrame || keyboard.wKey.wasPressedThisFrame) Turn(Vector3.forward);
if (keyboard.downArrowKey.wasPressedThisFrame || keyboard.sKey.wasPressedThisFrame) Turn(Vector3.back);
if (keyboard.leftArrowKey.wasPressedThisFrame || keyboard.aKey.wasPressedThisFrame) Turn(Vector3.left);
if (keyboard.rightArrowKey.wasPressedThisFrame || keyboard.dKey.wasPressedThisFrame) Turn(Vector3.right);
}
timer += Time.deltaTime;
if (timer >= tick)
{
timer -= tick;
Step();
}
}
void Turn(Vector3 newDirection)
{
if (newDirection != -direction)
{
nextDirection = newDirection;
}
}
void Step()
{
direction = nextDirection;
transform.position += direction;
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.