Menu
CoddyTech

Yolu Yeniden Kullan

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

Yedi parça, 140 birimlik yol eder. Saniyede 10 birim hızla yol 14 saniyede biter. Her gerektiğinde yeni bir parça oluşturup eskilerini yok etmek işe yarardı, ancak daha ucuz bir yol var: koşucunun arkasında kalan bir parça öne taşınır ve yeniden kullanılır.

Bir parçanın ortası -chunkLength değerini geçince parça tamamen geride kalmış olur. Arka arkaya yedi parça olduğundan, parçayı yedi uzunluk kadar ileri taşımak onu son parçanın hemen arkasına getirir:

if (chunk.position.z < -chunkLength)
{
    chunk.position += Vector3.forward * chunkLength * chunks.Count;
}

Nesneleri yok edip yenilerini oluşturmak yerine yeniden kullanmaya nesne havuzlama denir. Yedi parça sonsuz bir yol oluşturur.

challenge icon

Görev

Kolay
  1. Road.Update içinde, bir parça hareket ettikten sonra tamamen geride kaldığında, yukarıdaki gibi onu öne taşı.

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