Menu
CoddyTech

Daha Yoğun Satırlar

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

Bir engelin olduğu bir sırada diğer iki şerit boştur. Koşu ilerledikçe sıralarda iki ya da üç engel bulunmalıdır. made parça sayısını zaten sayar, bu yüzden bir sıranın ne kadar dolu olabileceğini belirleyebilir:

int busy = Mathf.Min(3, 1 + made / 12);
int count = Random.Range(1, busy + 1);

İki engel aynı şeritte bulunmamalıdır. Boş şeritleri bir listede tut ve her şeridi kullandıktan sonra listeden çıkar. Ayrıca art arda üç duvar geçiş yolu bırakmaz; bu yüzden iki duvar olduğunda bunun yerine bir bariyer ya da çubuk seç.

List<int> lanes = new List<int> { -1, 0, 1 };
int pick = Random.Range(0, lanes.Count);
int lane = lanes[pick];
lanes.RemoveAt(pick);
challenge icon

Görev

Orta
  1. Fill içinde, yukarıdaki gibi busy ve count değerlerini hesapla.
  2. count kadar engeli, her birini lanes listesinden çıkarılan bir şeride yerleştir.
  3. Duvarları say; kind == 2 olduğunda ve zaten iki duvar varsa, bunun yerine Random.Range(0, 2) seç.

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 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();
        }
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

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

Kendi başına pratik yap: Unity playground