Menu
CoddyTech

الانزلاق

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

تتدلّى بعض العوائق على ارتفاع كبير لا يمكن القفز فوقه: ينزلق العداء تحتها. يجعل الانزلاق العداء أقصر إلى النصف للحظة.

يؤدي تصغير الجسم أيضًا إلى تصغير CharacterController الخاص به، لكنه يتقلّص حول المنتصف، لذا ستطفو القدمان على ارتفاع نصف وحدة فوق الطريق. حرّك العداء إلى الأسفل بمقدار نصف الوحدة نفسه. يجب تعطيل وحدة التحكّم أثناء تحريكها يدويًا، وإلا فستُبطل الدالة Move التالية التغيير:

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;
}

يعدّ مؤقّت slide تنازليًا مدة الانزلاق. وعندما ينفد، يقف العداء مجددًا باستخدام StopSlide:

void StopSlide()
{
    if (transform.localScale.y < 1f) Resize(1f);
    slide = 0f;
}
challenge icon

التحدي

سهل
  1. أضف public float slideTime = 0.7f; وprivate float slide;.
  2. أضف Resize وStopSlide كما سبق.
  3. عندما يُضغط على S أو سهم الأسفل أثناء وجود العداء على الأرض، عيّن slide = slideTime واستدعِ Resize(0.5f).
  4. في كل إطار، إذا كانت slide > 0f، اطرح منها Time.deltaTime، واستدعِ StopSlide() بمجرد أن تصل إلى 0.
  5. تنهي القفزة الانزلاق: استدعِ StopSlide() عندما يقفز العداء.

جرّب بنفسك

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 int lane;

    private CharacterController controller;
    private float fallSpeed;

    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);
        }

        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);
    }
}

جميع دروس لعبة Unity: مسارات السماء

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