Menu
CoddyTech

유턴 금지

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

뱀이 곧바로 뒤로 돌면 자기 목에 부딪히므로, 진행 방향의 반대 방향으로 돌려는 입력은 무시됩니다. 한 방향의 반대 방향은 그 방향의 음수입니다. 뱀이 오른쪽으로 이동할 때 -direction은 Vector3.left입니다.

Vector3 heading = Vector3.right;
Vector3 back = -heading;            // (-1, 0, 0), Vector3.left
bool reverse = Vector3.left == back;   // true

키를 누르면 direction이 즉시 바뀌므로, direction과 비교하는 것만으로는 충분하지 않습니다. 오른쪽으로 이동하던 중 한 틱 안에 플레이어가 위쪽 키를 누른 다음 왼쪽 키를 누릅니다. 위쪽 방향은 허용됩니다. 그다음 왼쪽 방향은 아직 실제로 이루어지지 않은 회전인 위쪽 방향과 비교되므로, 이것도 허용되어 다음 이동에서 왼쪽으로 가며 목을 지나 곧바로 뒤로 돌아갑니다.

해결 방법은 방향을 두 개 유지하는 것입니다. direction은 마지막 이동에서 머리가 움직인 방향이고, nextDirection은 다음 이동을 기다리는 회전 방향입니다. 키를 누르면 회전 방향을 direction과 비교한 뒤 nextDirection을 바꾸고, 다음 이동이 시작될 때 대기 중인 회전을 실제 방향으로 적용합니다. 위의 경우 왼쪽 방향은 머리가 실제로 움직이는 방향인 오른쪽과 비교되므로 무시됩니다.

challenge icon

챌린지

쉬움
  1. private Vector3 nextDirection = Vector3.right;를 추가합니다. 이는 다음 이동을 위해 대기 중인 방향 전환입니다.
  2. void Turn(Vector3 newDirection)을 작성합니다. newDirection이 direction의 반대 방향이 아닌 경우 nextDirection을 newDirection으로 설정합니다.
  3. Update()에서 각 키는 direction을 설정하는 대신 해당 방향을 인수로 하여 Turn을 호출합니다.
  4. Step()의 시작 부분에서 direction을 nextDirection으로 설정합니다.

Play를 누르고 뒤로 방향을 바꿔 본 다음, Check를 누르세요.

직접 해보기

using UnityEngine;
using UnityEngine.InputSystem;

public class Snake : MonoBehaviour
{
    public float tick = 0.15f;   // 두 단계 사이의 시간(초)
    private float timer;
    private Vector3 direction = Vector3.right;

    void Update()
    {
        Keyboard keyboard = Keyboard.current;
        if (keyboard != null)
        {
            if (keyboard.upArrowKey.wasPressedThisFrame || keyboard.wKey.wasPressedThisFrame) direction = Vector3.forward;
            if (keyboard.downArrowKey.wasPressedThisFrame || keyboard.sKey.wasPressedThisFrame) direction = Vector3.back;
            if (keyboard.leftArrowKey.wasPressedThisFrame || keyboard.aKey.wasPressedThisFrame) direction = Vector3.left;
            if (keyboard.rightArrowKey.wasPressedThisFrame || keyboard.dKey.wasPressedThisFrame) direction = Vector3.right;
        }

        timer += Time.deltaTime;
        if (timer >= tick)
        {
            timer -= tick;
            Step();
        }
    }

    void Step()
    {
        transform.position += direction;
    }
}
quiz icon실력 점검

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

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