Menu
CoddyTech

Magnet

Pelajaran 14 dari 20 dalam kursus Game Unity: Sky Lanes di Coddy.

Power-up membuat satu kali lari terasa berbeda dari sebelumnya. Yang pertama adalah magnet: selama 8 detik, setiap koin di dekat pelari akan terbang ke arahnya.

Runner menyimpan sisa waktu di magnet dan menghitung mundur waktunya. Setiap koin melihat pelari, lalu saat magnet aktif dan pelari berada di dekatnya, koin bergerak mendekatinya:

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

Koin terbang ke pelari dan pemicunya menyelesaikan sisanya. Sesekali, ada bagian jalan yang memiliki pickup magnet berwarna merah muda, 6 unit sebelum rintangan di bagian tersebut.

challenge icon

Tantangan

Mudah
  1. Di Runner, tambahkan public float magnetTime = 8f; dan public float magnet;. Kurangi nilainya setiap frame selama nilainya lebih dari 0.
  2. Di OnTriggerEnter, tag Magnet menetapkan magnet = magnetTime dan menghancurkan benda yang diambil.
  3. Di Coin, tambahkan pullRange = 7f, pullSpeed = 30f, cari Runner di Start, lalu tarik seperti di atas.
  4. Di Road, tambahkan magnetPrefab. Di akhir Fill, float roll = Random.value; dan jika roll < 0.06f, tempatkan magnet di jalur acak pada y 1, z -6.

Coba sendiri

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

Semua pelajaran di Game Unity: Sky Lanes

Latihan sendiri: Playground Unity