Menu
CoddyTech

أعِد تدوير الطريق

الدرس 7 من 20 في دورة لعبة Unity: مسارات السماء على Coddy.

سبع قطع تساوي 140 وحدة من الطريق. وعند سرعة 10 وحدات في الثانية، ينفد الطريق خلال 14 ثانية. يمكن إنشاء قطعة جديدة كلما دعت الحاجة إليها وإتلاف القطع القديمة، لكن هناك طريقة أقل تكلفة: تُنقل القطعة التي تجاوزت العدّاء إلى المقدمة ويُعاد استخدامها.

تكون القطعة خلف العدّاء بالكامل بمجرد أن يتجاوز مركزها -chunkLength. وبما أن القطع السبع متراصة في صف واحد، فإن نقلها إلى الأمام بمقدار سبعة أطوال يضعها مباشرة بعد القطعة الأخيرة:

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

تُسمى إعادة استخدام الكائنات بدلًا من إتلافها وإنشاء كائنات جديدة تجميع الكائنات. وتُكوّن سبع قطع طريقًا لا نهاية له.

challenge icon

التحدي

سهل
  1. في Road.Update، بعد تحرّك قطعة، انقلها إلى الأمام بمجرد أن تصبح خلفك بالكامل، كما سبق.

جرّب بنفسك

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: مسارات السماء

تدرّب بنفسك: Playground لـ Unity