Menu
CoddyTech

Uターン禁止

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

ヘビがまっすぐ引き返すと自分の首にぶつかるため、反対方向への旋回は無視されます。方向の反対はその負の方向です。ヘビが右に進んでいる間、-direction は Vector3.left です。

キーを押すと方向がすぐに変わる場合、direction と比較するだけでは不十分です。右に進んでいるとき、プレイヤーが1ティックの間に上、続いて左を押したとします。上は許可され、次に左は上と比較され、これも許可されるため、次の一歩で首をまたいでしまいます。

そこで、方向を2つ保持します。direction は頭が直前に進んだ方向、nextDirection は次の一歩で実行される、待機中の旋回方向です。キーを押すと、direction と比較したうえで nextDirection が変更され、一歩進むと待機中の旋回が実際に適用されます。

challenge icon

チャレンジ

簡単

ヘビが真後ろに曲がって自分の首に向かわないようにします。

  1. private Vector3 nextDirection = Vector3.right;とvoid Turn(Vector3 newDirection)を追加します。newDirection == -directionでない場合に、nextDirectionを設定します。
  2. Update()では、各キーでdirectionを設定する代わりに、その方向を指定してTurnを呼び出します。
  3. Step()の先頭で、direction = nextDirection;を設定します。

「プレイ」を押し、右に進んでいるときに左を押します。ヘビは右に進み続けます。その後、「確認」を押します。

自分で試してみよう

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;
    }
}

Unityゲーム:3Dスネークのすべてのレッスン

自分で練習してみよう: Unityプレイグラウンド