Menu
CoddyTech

Münzen

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

Münzen geben dem Spieler einen Grund, die Spur zu wechseln, wenn nichts im Weg ist. Auf jedem Streckenabschnitt wird nach den Hindernissen eine Reihe aus vier Münzen in einer Spur platziert, bei 4, 7, 10 und 13 entlang des Abschnitts und bei y 1.

Eine Münze dreht sich selbstständig, mit ihrem eigenen Skript:

void Update()
{
    transform.Rotate(0f, 0f, spinSpeed * Time.deltaTime);
}

Das Münz-Prefab liegt auf der Seite, sodass seine eigene z-Achse nach oben zeigt: Eine Drehung um z lässt sie sich wie eine Münze auf einem Tisch drehen.

Das Einsammeln ist Aufgabe des Runner, im selben OnTriggerEnter: Eine Münze fügt über game.AddCoin() eine Münze hinzu und wird zerstört.

challenge icon

Aufgabe

Einfach
  1. Füge in Coin public float spinSpeed = 180f; und das obige Update hinzu.
  2. Füge in Road coinPrefab hinzu und platziere am Ende von Fill 4 Münzen in einer zufälligen Spur bei z 4f + i * 3f.
  3. Füge in GameManager public TMP_Text coinText;, public int coins; und public void AddCoin() hinzu (eine weitere Münze, dann ShowScore()). ShowScore setzt außerdem coinText.text = "Coins: " + coins;.
  4. Füge in Runner.OnTriggerEnter else if (other.CompareTag("Coin")) hinzu: Füge die Münze hinzu und zerstöre sie.

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 GameManager game;
    private float fallSpeed;
    private float slide;

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

    void Update()
    {
        if (!game.over)
        {
            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;
    }

    void OnTriggerEnter(Collider other)
    {
        if (game.over) return;
        if (other.CompareTag("Obstacle"))
        {
            game.GameOver();
        }
    }
}

Alle Lektionen in Unity-Spiel: Himmelsbahnen

Übe selbstständig: Unity-Playground