الوقوف على الأرض
جزء من قسم الفيزياء وأسلوب اللعب في رحلة Unity على Coddy. الدرس 11 من 63.
لكل تماس عمودي: اتجاه طوله 1، عمودي على السطح الذي لمسته، ويشير مبتعدًا عنه نحو جسمك. يمثّل collision.GetContact(0) أول نقطة تماس، ويخبرك normal بأي جانب لمست. عند الوقوف على أرض مستوية تكون قيمته (0, 1, 0)؛ وعند ملامسة جدار على يمينك تكون (-1, 0, 0)؛ وعند اصطدام رأسك بسقف تكون (0, -1, 0).
يميز هذا الصندوق بين الهبوط والارتطام بجانب:
void OnCollisionEnter(Collision collision)
{
Vector3 normal = collision.GetContact(0).normal;
if (normal.y > 0.5f)
{
Debug.Log("Landed on " + collision.gameObject.name);
}
else
{
Debug.Log("Bumped the side of " + collision.gameObject.name);
}
}الاختبار هو normal.y > 0.5f بدلًا من أن يساوي 1 تمامًا، لكي تُحتسب المنحدرات أرضًا أيضًا: تكون قيمة y هي 0.5 على منحدر بزاوية 60 درجة، وهو أشد انحدارًا مما يمكن لأي شخص صعوده مشيًا. وهناك رسالتان إضافيتان تفيدان في أي شيء يستمر: تعمل OnCollisionStay في كل خطوة فيزيائية ما دام التماس قائمًا، وتعمل OnCollisionExit مرة واحدة عند انتهائه. لا تحتوي حالة الخروج على نقاط تماس، لأن لا شيء يعود يلامس شيئًا، لذا لا تستدعِ GetContact هناك.
التحدي
سهليمكن للاعب المشي والقفز، لكن زر المسافة يعمل أيضًا في الهواء، لذا يمكنه تسلّق السماء قفزةً تلو الأخرى، والقفز مبتعدًا عن جانب الجدار. (مُصادِم اللاعب مصنوع من مادة عديمة الاحتكاك، لذا ينزلق على الجدران بدلًا من الالتصاق بها.) اجعل اللاعب يقفز فقط عندما يكون واقفًا على شيء ما.
- احتفظ بقيمة
bool grounded: تكون true ما دام اللاعب يلامس شيئًا يتجه عمودي التلامس معه إلى الأعلى (y أكبر من 0.5)، وتكون false بمجرد أن يتوقف عن ملامسته. - لا تقفز إلا إذا تم الضغط على زر المسافة وكانت قيمة
groundedهي true. يتم تجاهل الضغط في الهواء، ولا يُحفظ حتى الهبوط.
اضغط على Play، وحاول القفز مرتين وتسلق الجدار، ثم اضغط على Check.
جرّب بنفسك
using UnityEngine;
public class Hopper : MonoBehaviour
{
public float speed = 4f;
public float jump = 6f;
private Rigidbody rb;
private bool jumpPressed;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
jumpPressed = true;
}
}
void FixedUpdate()
{
float h = Input.GetAxisRaw("Horizontal");
rb.linearVelocity = new Vector3(h * speed, rb.linearVelocity.y, 0);
if (jumpPressed)
{
rb.AddForce(Vector3.up * jump, ForceMode.Impulse);
jumpPressed = false;
}
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الفيزياء وأسلوب اللعب
1الجسم الصلب (Rigidbody)
الجاذبية والكتلةالدفع باستخدام AddForceالقفز باستخدام دفعةFixedUpdate للفيزياءالسرعة المتجهةالأجسام الحركيةمراجعة: منصة الإطلاق