Menu
CoddyTech

Menabrak

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

Rintangan adalah pemicu: pemicu mendeteksi pelari tanpa mendorongnya. Saat CharacterController pelari bertemu pemicu, Unity memanggil OnTriggerEnter pada skrip pelari, dengan collider pemicu:

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

GameOver mengakhiri permainan: over menjadi true, kecepatan menjadi 0 sehingga jalan berhenti, dan pesan di tengah layar menjelaskan hal itu. Selama over bernilai true, GameManager berhenti menghitung jarak dan Runner berhenti membaca tombol.

challenge icon

Tantangan

Sedang
  1. Di dalam GameManager, tambahkan public TMP_Text messageText; dan public bool over;.
  2. Tambahkan public void GameOver(): jika sudah over, kembalikan; jika tidak, atur over = true, speed = 0f dan messageText.text = "Game over".
  3. Di bagian atas Update milik GameManager, tambahkan if (over) return;.
  4. Di dalam Runner, cari GameManager di Start, baca tombol hanya saat !game.over, dan tambahkan OnTriggerEnter seperti di atas.

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

Semua pelajaran di Game Unity: Sky Lanes

Latihan sendiri: Playground Unity