Menu
CoddyTech

حرّك الطريق

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

في لعبة الركض، يبقى اللاعب في مكانه ويأتيه العالم. يمكن أيضًا تحريك الكاميرا واللاعب إلى الأمام إلى ما لا نهاية، لكن الأرقام ستكبر بلا نهاية؛ أما تحريك الطريق فيُبقي كل شيء قريبًا من الصفر.

تعود السرعة إلى اللعبة بأكملها، لذا فهي موجودة في GameManager. يعثر الطريق عليها مرة واحدة في Start ويقرأ سرعته في كل إطار:

float step = game.speed * Time.deltaTime;
foreach (Transform chunk in chunks)
{
    chunk.position += Vector3.back * step;
}

تعني Vector3.back (0, 0, -1): باتجاه الكاميرا. لتحريك القطع لاحقًا، يجب أن يتذكرها الطريق في List<Transform>.

challenge icon

التحدي

سهل
  1. في GameManager أضف public float startSpeed = 10f; وpublic float speed;، واجعل speed = startSpeed في Start.
  2. في Road أضف private List<Transform> chunks = new List<Transform>(); (مع using System.Collections.Generic;) وprivate GameManager game;.
  3. في Start عيّن game = FindFirstObjectByType<GameManager>(); وأضف كل قطعة جديدة إلى chunks.
  4. اكتب 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