Menu
CoddyTech

اصطدام

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

العوائق هي مُحفِّزات: فهي تكتشف العداء دون أن تدفعه. عندما يلتقي مُتحكِّم شخصية العداء ومُحفِّز، تستدعي Unity الدالة OnTriggerEnter في نصوص العداء البرمجية، مع مُصادم المُحفِّز:

void OnTriggerEnter(Collider other)
{
    if (game.over) return;
    if (other.CompareTag("Obstacle"))
    {
        game.GameOver();
    }
}

تنهي GameOver الجولة: تصبح over true، وتصبح السرعة 0 ليتوقف الطريق، وتُظهر الرسالة في منتصف الشاشة ذلك. ما دامت over تساوي true، يتوقف GameManager عن حساب المسافة ويتوقف Runner عن قراءة المفاتيح.

challenge icon

التحدي

متوسط
  1. في GameManager أضف public TMP_Text messageText; وpublic bool over;.
  2. أضف public void GameOver(): إذا كانت over صحيحة بالفعل، فأعِد؛ وإلا فعيّن over = true وspeed = 0f وmessageText.text = "Game over".
  3. في بداية Update الخاص بـ GameManager، أضف if (over) return;.
  4. في Runner، اعثر على GameManager في Start، واقرأ المفاتيح فقط عندما تكون !game.over، وأضف OnTriggerEnter كما سبق.

جرّب بنفسك

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