مضرب عريض
الدرس 14 من 16 في دورة لعبة Unity: تحطيم الطوب على Coddy.
تجعل قوة التعزيز «عريض» المضرب أعرض لبضع ثوانٍ عند التقاطها. تكتشف قوة التعزيز التقاطها: يلامس مصادم المشغّل الخاص بها مصادم المضرب، وكلا الجسمين حركيان، وهذا يكفي لتشغيل OnTriggerEnter. كما أنها تمر عبر الكرة أثناء سقوطها، لذا تتحقق من الوسم. ويُميّز تعدادٌ يضم الأنواع، ويُحدَّد لكل عنصر مسبق في نافذة Inspector، بين قوى التعزيز المختلفة.
التأثير المحدد بوقت هو coroutine: غيّر، وانتظر، ثم أعد التغيير. إذا حدث التقاط ثانٍ بينما لا يزال الأول قيد التشغيل، فيجب أن يبدأ الوقت من جديد؛ لذا احتفظ بالكائن Coroutine الذي تُعيده StartCoroutine وأوقفه قبل بدء واحد جديد. وإلا سينتهي الأول مبكرًا ويلغي تأثير الثاني. إليك تعزيز السرعة:
Coroutine boost;
public void Boost()
{
if (boost != null) StopCoroutine(boost);
boost = StartCoroutine(BoostFor(3f));
}
IEnumerator BoostFor(float seconds)
{
speed = normalSpeed * 2f;
yield return new WaitForSeconds(seconds);
speed = normalSpeed;
boost = null;
}يضبط التعزيز السرعة انطلاقًا من normalSpeed، التي حُفظت مرة واحدة، بدلًا من مضاعفة السرعة الحالية ثم تنصيفها لاحقًا: فتعزيزان متتاليان سيجعلان السرعة أكبر بأربع مرات. ويقرأ حدّ المضرب عرضه في كل خطوة بالفعل، لذا يظل المضرب العريض يتوقف عند الجدران.
التحدي
صعب- في
PowerUp، أضفpublic enum Kind { Wide, Multiball }وpublic Kind kind(حدّد كل عنصر جاهز نوعه). أضفOnTriggerEnter: عندما يلامس عنصر القوة الجسم الموسوم بـPaddle، يستدعي عنصر Wide الدالةWiden()في سكربتPaddleالخاص بذلك الجسم، ويُدمّر كلا النوعين عنصر القوة. - في
Paddle، أضفpublic float wideFactor = 1.6fوpublic float wideSeconds = 8f، واحفظ العرض الطبيعي للمضرب، أي مقياسه على المحور x، فيAwake(). - اكتب
public void Widen(): تبدأ دالةً روتينية تضبط مقياس المضرب على المحور x ليكونwideFactorمضروبًا في العرض الطبيعي، وتنتظرwideSeconds، ثم تعيد العرض الطبيعي. عند التقاط عنصر قوة أثناء التوسّع، يُعاد تشغيل المؤقت.
يُلتقط عنصر قوة Multiball ولا يفعل شيئًا حتى الآن.
اضغط Play، والتقط عنصر قوة أخضر، ثم اضغط Check.
جرّب بنفسك
using UnityEngine;
using UnityEngine.InputSystem;
public class Paddle : MonoBehaviour
{
public float speed = 14f;
public float wallX = 8f; // تقع الأوجه الداخلية للجدارين الجانبيين عند -wallX وwallX
Rigidbody rb;
void Awake()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
float input = 0f;
if (Keyboard.current.leftArrowKey.isPressed || Keyboard.current.aKey.isPressed) input -= 1f;
if (Keyboard.current.rightArrowKey.isPressed || Keyboard.current.dKey.isPressed) input += 1f;
Vector3 target = rb.position + Vector3.right * input * speed * Time.fixedDeltaTime;
float halfWidth = transform.localScale.x / 2f;
target.x = Mathf.Clamp(target.x, -wallX + halfWidth, wallX - halfWidth);
rb.MovePosition(target);
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.