Menu
CoddyTech

Çarpışma

Coddy'nin Unity Oyunu: Gökyüzü Şeritleri kursunda ders 11 / 20.

Engeller tetikleyicidir: koşucuyu itmeden onu algılarlar. Koşucunun CharacterController bileşeniyle bir tetikleyici karşılaştığında Unity, tetikleyicinin çarpıştırıcısıyla birlikte koşucunun betiklerinde OnTriggerEnter yöntemini çağırır:

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

GameOver koşuyu bitirir: over true olur, yolun durması için hız 0'a iner ve ekranın ortasındaki mesaj bunu belirtir. over true olduğu sürece GameManager mesafeyi saymayı, Runner ise tuşları okumayı durdurur.

challenge icon

Görev

Orta
  1. GameManager içinde public TMP_Text messageText; ve public bool over; ekle.
  2. public void GameOver() ekle: zaten over ise geri dön; aksi takdirde over = true, speed = 0f ve messageText.text = "Game over" olarak ayarla.
  3. GameManager'ın Update metodunun en başına if (over) return; ekle.
  4. Runner içinde, Start metodunda GameManager'ı bul, tuşları yalnızca !game.over iken oku ve yukarıdaki gibi OnTriggerEnter ekle.

Kendin dene

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

Unity Oyunu: Gökyüzü Şeritleri bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground