Menu
CoddyTech

Baue die Straße

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

Bisher stand der Läufer auf einem einfachen Block namens Ground. Ab hier erstellt das Skript Road die Straße, und der Block ist verschwunden.

Die Straße besteht aus Stücken, die 20 Einheiten lang sind und hintereinander angeordnet werden. Ein Stück ist ein leeres GameObject namens Chunk, und alles auf diesem Stück ist sein untergeordnetes Objekt: der Boden, die Striche zwischen den Fahrspuren und die beiden Ränder. Wenn das Stück bewegt wird, bewegt sich alles darauf mit.

Transform chunk = new GameObject("Chunk").transform;
chunk.position = new Vector3(0f, 0f, i * chunkLength);
Instantiate(floorPrefab, chunk.position + new Vector3(0f, -0.25f, 0f), Quaternion.identity, chunk);

Das letzte Argument von Instantiate ist das übergeordnete Objekt. Der Boden ist eine halbe Einheit dick, sodass seine Mitte ein Viertel unter der Straßenoberfläche bei y 0 liegt.

Jede Fahrspurmarkierung besteht aus vier Strichen mit einer Länge von 3, jeweils im Abstand von 5 Einheiten, bei x -laneWidth / 2f und laneWidth / 2f. Die Ränder liegen bei x -4.1 und 4.1, y 0.05.

challenge icon

Aufgabe

Einfach
  1. Füge in Road die Prefab-Felder floorPrefab, stripePrefab und edgePrefab (alle public GameObject) sowie chunkCount = 7, chunkLength = 20f und laneWidth = 2.5f hinzu. Der Inspector füllt die Prefabs aus.
  2. Erzeuge in Start chunkCount Teile, wobei Teil i bei z i * chunkLength liegt und jeweils einen Boden hat.
  3. Platziere auf jedem Teil für d von 0 bis 3 zwei Striche bei z -7.5f + d * 5f und y 0.01, je einen auf jeder Fahrstreifenlinie.
  4. Platziere die beiden Ränder.

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