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: נתיבי שמיים

תרגלו בעצמכם: Unity אונליין