Menu
CoddyTech

벽

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은 키 입력과 타이머를 모두 건너뜁니다.

challenge icon

챌린지

쉬움
  1. public int edge = 7;를 추가합니다(보드의 칸은 -edge부터 edge까지입니다). 그리고 public bool alive = true;를 추가합니다.
  2. Step()에서 direction을 설정한 다음, 머리가 진입하려는 칸인 next를 계산합니다. 보드 밖이면 Die()를 호출하고 이동하지 않은 채 반환합니다. 그렇지 않으면 머리를 next로 이동합니다.
  3. alive를 false로 설정하는 void Die()를 작성합니다.
  4. 뱀이 살아 있지 않을 때 반환하도록 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;
    }
}
quiz icon실력 점검

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

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