Menu
CoddyTech

Uターン禁止

Coddyの「Unityゲーム:3Dスネーク」コースのレッスン 3/14。

ヘビが真後ろに曲がると自分の首にぶつかるため、進行方向と反対への曲がりは無視されます。ある方向の反対はその負の方向です。ヘビが右に進んでいるとき、-directionはVector3.leftです。

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

キーを押すとdirectionがすぐに変わる場合、directionと比較するだけでは不十分です。右に進んでいるとき、プレイヤーが1ティックの間に上を押してから左を押します。上への方向転換は許可されます。次に左は、まだ実際には起きていない方向転換である上と比較され、これも許可されるため、次の移動では左に進み、首をまっすぐ逆方向に通り抜けてしまいます。

この問題は、2つの方向を保持することで解決できます。directionは直前の移動で頭が進んだ方向、nextDirectionは次の移動まで待機している方向転換です。キーを押すとnextDirectionが変わりますが、その前に方向転換をdirectionと比較します。そして移動を始めるときに、待機中の方向転換を実際に反映します。上のケースでは、左は頭が実際に進んでいる方向である右と比較され、無視されます。

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;   // 2回の移動の間隔(秒)
    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スネークのすべてのレッスン