ممنوع الدوران للخلف
الدرس 3 من 14 في دورة لعبة الثعبان ثلاثية الأبعاد في Unity على Coddy.
إذا عاد الثعبان مباشرةً إلى الخلف، فسيصطدم بعنقه، لذا يتم تجاهل الانعطاف إلى الاتجاه المعاكس لاتجاه حركته. الاتجاه المعاكس للاتجاه هو سالبه: عندما يتحرك الثعبان إلى اليمين، تكون -direction هي Vector3.left.
Vector3 heading = Vector3.right;
Vector3 back = -heading; // (-1, 0, 0), Vector3.left
bool reverse = Vector3.left == back; // trueلا تكفي المقارنة مع direction عندما يؤدي الضغط على زر إلى تغيير direction فورًا. أثناء التحرك إلى اليمين، يضغط اللاعب على الأعلى ثم اليسار خلال نبضة واحدة. يُسمح بالاتجاه إلى الأعلى. ثم تتم مقارنة اليسار بالاتجاه إلى الأعلى، أي بالانعطاف الذي لم يحدث بعد، ويُسمح به أيضًا، لذا تكون الخطوة التالية إلى اليسار، مباشرةً إلى الخلف عبر العنق.
يحلّ ذلك الاحتفاظ باتجاهين. يشير direction إلى الاتجاه الذي تحرك فيه الرأس في خطوته الأخيرة؛ أما nextDirection فيشير إلى الانعطاف المنتظر للخطوة التالية. يغيّر أحد الأزرار nextDirection، لكن فقط بعد مقارنة الانعطاف مع direction، وتبدأ الخطوة بتحويل الانعطاف المنتظر إلى اتجاه فعلي. في الحالة المذكورة أعلاه، تتم مقارنة اليسار باليمين، وهو الاتجاه الذي يتحرك فيه الرأس فعلًا، ويُتجاهل.
التحدي
سهل- أضف
private Vector3 nextDirection = Vector3.right;، أي الاتجاه الذي ينتظر الخطوة التالية. - اكتب
void Turn(Vector3 newDirection): فهي تعيّنnextDirectionإلىnewDirection، ما لم يكنnewDirectionعكسdirection. - في
Update()، يستدعي كل مفتاحTurnمع اتجاهه بدلًا من تعيينdirection. - في بداية
Step()، عيّنdirectionإلىnextDirection.
اضغط على Play وحاول الانعطاف للخلف، ثم اضغط على Check.
جرّب بنفسك
using UnityEngine;
using UnityEngine.InputSystem;
public class Snake : MonoBehaviour
{
public float tick = 0.15f; // الثواني بين خطوتين
private float timer;
private Vector3 direction = Vector3.right;
void Update()
{
Keyboard keyboard = Keyboard.current;
if (keyboard != null)
{
if (keyboard.upArrowKey.wasPressedThisFrame || keyboard.wKey.wasPressedThisFrame) direction = Vector3.forward;
if (keyboard.downArrowKey.wasPressedThisFrame || keyboard.sKey.wasPressedThisFrame) direction = Vector3.back;
if (keyboard.leftArrowKey.wasPressedThisFrame || keyboard.aKey.wasPressedThisFrame) direction = Vector3.left;
if (keyboard.rightArrowKey.wasPressedThisFrame || keyboard.dKey.wasPressedThisFrame) direction = Vector3.right;
}
timer += Time.deltaTime;
if (timer >= tick)
{
timer -= tick;
Step();
}
}
void Step()
{
transform.position += direction;
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.