فقدان كرة
الدرس 8 من 16 في دورة لعبة 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 إلى إطلاقها مجددًا.
التحدي
متوسط- في
Ball، اكتبpublic void ResetToPaddle(): لم تعد الكرة مُطلَقة وتتوقف عن الحركة. - أضف
OnTriggerEnterإلىBall: عندما تدخل إلى الكائن ذي الوسمDeathZone، استدعِGameManager.Instance.BallLost(this). - في
GameManager، أضفpublic int lives = 3وpublic void BallLost(Ball lost): تنقص حياة واحدة، وتعود الكرة المفقودة إلى المضرب.
لا توجد نهاية للعبة بعد، لذا سيقل عدد الحيوات إلى ما دون 0 في الوقت الحالي.
اضغط على Play، وتعمد تفويت الكرة، ثم أطلقها مجددًا، وبعد ذلك اضغط على Check.
جرّب بنفسك
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;
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.