Menu
CoddyTech

أنشئ الطريق

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

حتى الآن، كان العداء يقف على كتلة عادية اسمها Ground. من هنا، ينشئ السكربت Road الطريق، وتختفي الكتلة.

يتكوّن الطريق من قطع طول كل منها 20 وحدة، موضوعة واحدة تلو الأخرى. القطعة عبارة عن GameObject فارغ اسمه Chunk، وكل ما على تلك القطعة هو عنصر فرعي لها: الأرضية، والشرطات بين المسارات، والحافتان. تحريك القطعة سيحرّك كل ما عليها.

Transform chunk = new GameObject("Chunk").transform;
chunk.position = new Vector3(0f, 0f, i * chunkLength);
Instantiate(floorPrefab, chunk.position + new Vector3(0f, -0.25f, 0f), Quaternion.identity, chunk);

الوسيط الأخير في Instantiate هو العنصر الأب. يبلغ سمك الأرضية نصف وحدة، لذا يقع منتصفها على ارتفاع ربع وحدة أسفل سطح الطريق عند y 0.

يتكوّن خط كل مسار من أربع شرطات، طول كل منها 3، تفصل بينها 5 وحدات، عند x -laneWidth / 2f وlaneWidth / 2f. تقع الحافتان عند x -4.1 و4.1، وy 0.05.

challenge icon

التحدي

سهل
  1. في Road أضف حقول النماذج الأولية floorPrefab وstripePrefab وedgePrefab (كلها من النوع public GameObject)، وأضف chunkCount = 7 وchunkLength = 20f وlaneWidth = 2.5f. يملأ المفتش حقول النماذج الأولية.
  2. في Start، أنشئ chunkCount قطعة، واجعل القطعة i عند z i * chunkLength، مع أرضية لكل قطعة.
  3. في كل قطعة، ومن أجل d من 0 إلى 3، ضع خطين متقطعين عند z -7.5f + d * 5f وy 0.01، واحدًا على كل خط من خطوط المسارات.
  4. ضع الحافتين.

جرّب بنفسك

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