Menu
CoddyTech

Magnet

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

Power-ups sorgen dafür, dass sich jeder Lauf anders anfühlt als der vorherige. Das erste ist ein Magnet: 8 Sekunden lang fliegt jede Münze in der Nähe des Läufers zu ihm.

Der Läufer speichert die verbleibende Zeit in magnet und zählt sie herunter. Jede Münze schaut auf den Läufer und bewegt sich, solange der Magnet aktiv und der Läufer in der Nähe ist, auf ihn zu:

if (runner.magnet > 0f && Vector3.Distance(transform.position, runner.transform.position) < pullRange)
{
    transform.position = Vector3.MoveTowards(transform.position, runner.transform.position, pullSpeed * Time.deltaTime);
}

Die Münze fliegt in den Läufer hinein und sein Trigger erledigt den Rest. Hin und wieder erhält ein Straßenabschnitt ein pinkfarbenes Magnet-Power-up, 6 Einheiten vor seinen Hindernissen.

challenge icon

Aufgabe

Einfach
  1. Füge in Runner public float magnetTime = 8f; und public float magnet; hinzu. Zähle den Wert in jedem Frame herunter, solange er über 0 liegt.
  2. In OnTriggerEnter setzt ein Magnet-Tag magnet = magnetTime und zerstört das aufgesammelte Objekt.
  3. Füge in Coin pullRange = 7f und pullSpeed = 30f hinzu, finde den Runner in Start und ziehe die Münzen wie oben beschrieben an.
  4. Füge in Road magnetPrefab hinzu. Füge am Ende von Fill float roll = Random.value; ein und platziere bei roll < 0.06f einen Magneten in einer zufälligen Spur bei y 1, z -6.

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();
        }
        else if (other.CompareTag("Coin"))
        {
            game.AddCoin();
            Destroy(other.gameObject);
        }
    }
}

Alle Lektionen in Unity-Spiel: Himmelsbahnen

Übe selbstständig: Unity-Playground