Menu
CoddyTech

اخسر كرة

الدرس 8 من 19 في دورة لعبة Unity: كاسر الطوب على Coddy.

تُفقد الكرة إذا تجاوزت المضرب. أصبح في المشهد الآن، أسفل المضرب، منطقة موت (DeathZone): كائن له مصادم صندوقي مضبوط على Is Trigger والوسم DeathZone. لا يوقف المُحفِّز أي شيء؛ بل يرسل OnTriggerEnter(Collider other) عندما يدخل إليه شيء له Rigidbody. تُبلغ الكرة GameManager بالخسارة، إذ يتولى إدارة الأرواح ويقرر ما يحدث بعد ذلك.

تبدأ الكرة الزجاجية من جديد عند نقطة ظهورها إذا سقطت في الماء:

void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Water")) Respawn();
}

void Respawn()
{
    rb.linearVelocity = Vector3.zero;
    transform.position = spawnPoint.position;
}

تحتاج الكرة إلى أقل مما تحتاج إليه الكرة الزجاجية. يضعها Update() بالفعل على المضرب في كل إطار ما دامت launched تساوي false، لذا لا يتطلب إعادة الضبط سوى مسح هذا العلم وإيقاف الكرة: في الإطار التالي تعود إلى مكانها، ثم يؤدي الضغط على Space إلى إطلاقها مجددًا.

challenge icon

التحدي

متوسط

يؤدي تفويت الكرة إلى خسارة حياة وإعادتها إلى المضرب.

  1. في Ball، اكتب public void ResetToPaddle(): launched = false; واجعل السرعة Vector3.zero.
  2. في OnTriggerEnter الخاص بـ Ball، يؤدي دخول الكائن الموسوم بـ DeathZone إلى استدعاء GameManager.Instance.BallLost(this).
  3. في GameManager، أضف public int lives = 3; وpublic void BallLost(Ball lost): حياة واحدة أقل، ثم lost.ResetToPaddle();

اضغط «العب» ودع الكرة تفوتك: ستنتظر على المضرب مجددًا. ثم اضغط «تحقق».

جرّب بنفسك

using UnityEngine;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

    public Brick brickPrefab;
    public Transform wall;
    public int rows = 5;
    public int columns = 9;
    public float spacingX = 1.75f;
    public float spacingY = 0.75f;
    public float topY = 6f;
    public int[] rowHits = { 2, 1, 1, 1, 1 };

    int score;

    void Awake()
    {
        Instance = this;
    }

    void Start()
    {
        BuildWall();
    }

    void BuildWall()
    {
        float left = -(columns - 1) * spacingX / 2f;
        for (int row = 0; row < rows; row++)
        {
            for (int col = 0; col < columns; col++)
            {
                Vector3 pos = new Vector3(left + col * spacingX, topY - row * spacingY, 0f);
                Brick brick = Instantiate(brickPrefab, pos, Quaternion.identity, wall);
                brick.SetHits(rowHits[row]);
            }
        }
    }

    public void BrickBroken(Brick brick)
    {
        score += brick.points;
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس لعبة Unity: كاسر الطوب

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