Menu
CoddyTech

Bewege die Straße

Lektion 6 von 20 im Kurs Unity-Spiel: Himmelsbahnen von Coddy.

In einem Runner bleibt der Spieler an Ort und Stelle, während die Welt auf ihn zukommt. Die Kamera und den Spieler für immer nach vorne zu bewegen, würde auch funktionieren, aber die Zahlen würden unbegrenzt wachsen; wenn man die Straße bewegt, bleibt alles nahe null.

Die Geschwindigkeit gilt für das ganze Spiel und befindet sich daher in GameManager. Die Straße findet sie einmal in Start und liest ihre Geschwindigkeit in jedem Frame aus:

float step = game.speed * Time.deltaTime;
foreach (Transform chunk in chunks)
{
    chunk.position += Vector3.back * step;
}

Vector3.back ist (0, 0, -1): zur Kamera hin. Damit die Straße die Teile später bewegen kann, muss sie sie in einer List<Transform> speichern.

challenge icon

Aufgabe

Einfach
  1. Füge in GameManager public float startSpeed = 10f; und public float speed; hinzu und setze in Start speed = startSpeed.
  2. Füge in Road private List<Transform> chunks = new List<Transform>(); (mit using System.Collections.Generic;) und private GameManager game; hinzu.
  3. Setze in Start game = FindFirstObjectByType<GameManager>(); und füge jedes neue Teil zu chunks hinzu.
  4. Schreibe Update wie oben.

Probier es selbst

using UnityEngine;

public class Runner : MonoBehaviour
{
    public float laneWidth = 2.5f;
    public float laneSpeed = 16f;
    public float jumpHeight = 1.6f;
    public float gravity = -40f;
    public float slideTime = 0.7f;

    public int lane;

    private CharacterController controller;
    private float fallSpeed;
    private float slide;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.LeftArrow)) lane = Mathf.Max(-1, lane - 1);
        if (Input.GetKeyDown(KeyCode.D) || Input.GetKeyDown(KeyCode.RightArrow)) lane = Mathf.Min(1, lane + 1);
        bool jump = Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.Space);
        if (jump && controller.isGrounded)
        {
            fallSpeed = Mathf.Sqrt(jumpHeight * -2f * gravity);
            StopSlide();
        }
        if ((Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown(KeyCode.DownArrow)) && controller.isGrounded)
        {
            slide = slideTime;
            Resize(0.5f);
        }

        if (slide > 0f)
        {
            slide -= Time.deltaTime;
            if (slide <= 0f) StopSlide();
        }

        if (controller.isGrounded && fallSpeed < 0f) fallSpeed = -2f;
        fallSpeed += gravity * Time.deltaTime;

        float targetX = lane * laneWidth;
        float x = Mathf.MoveTowards(transform.position.x, targetX, laneSpeed * Time.deltaTime);
        Vector3 move = new Vector3(x - transform.position.x, fallSpeed * Time.deltaTime, 0f);
        controller.Move(move);
    }

    void StopSlide()
    {
        if (transform.localScale.y < 1f) Resize(1f);
        slide = 0f;
    }

    void Resize(float height)
    {
        controller.enabled = false;
        transform.position += Vector3.up * (height - transform.localScale.y);
        transform.localScale = new Vector3(1f, height, 1f);
        controller.enabled = true;
    }
}

Alle Lektionen in Unity-Spiel: Himmelsbahnen

Übe selbstständig: Unity-Playground