Menu
CoddyTech

Koin

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

Koin memberi pemain alasan untuk berpindah jalur saat tidak ada penghalang. Setiap bagian memiliki deretan empat koin di satu jalur, setelah rintangan, pada posisi 4, 7, 10, dan 13 sepanjang bagian, serta y 1.

Koin berputar sendiri, dengan skripnya sendiri:

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

Prefab koin terletak miring, sehingga sumbu z-nya mengarah ke atas: berputar mengelilingi z membuatnya berputar seperti koin di atas meja.

Mengumpulkan koin adalah tugas Runner, di OnTriggerEnter yang sama: koin menambahkan satu melalui game.AddCoin() lalu dihancurkan.

challenge icon

Tantangan

Mudah
  1. Di Coin, tambahkan public float spinSpeed = 180f; dan Update di atas.
  2. Di Road, tambahkan coinPrefab, lalu di akhir Fill, tempatkan 4 koin di jalur acak pada z 4f + i * 3f.
  3. Di GameManager, tambahkan public TMP_Text coinText;, public int coins;, dan public void AddCoin() (tambahkan satu koin, lalu ShowScore()). ShowScore juga mengatur coinText.text = "Coins: " + coins;.
  4. Di Runner.OnTriggerEnter, pada else if (other.CompareTag("Coin")): tambahkan koin dan hancurkan objeknya.

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

Semua pelajaran di Game Unity: Sky Lanes

Latihan sendiri: Playground Unity