اركب المنصة
جزء من قسم إنشاء ألعاب حقيقية في رحلة Unity على Coddy. الدرس 51 من 60.
لا ينتقل كائن CharacterController مع ما يقف عليه: فعلى منصة متحركة، يبقى في مكانه بينما تنزلق المنصة من تحته. لا يفيد تحريك transform.position، لأن استدعاء Move التالي يبدأ من الموضع الذي رآه فيه نظام الفيزياء آخر مرة، فيلغي التغيير.
لذلك يضيف اللاعب حركة المنصة إلى حركته. تُستدعى OnControllerColliderHit(ControllerColliderHit hit) مع كل مصادم يلامسه استدعاء Move؛ وتكون قيمة hit.normal.y قريبة من 1 عند الاصطدام من الأسفل. إليك مثالًا على عبّارة تحمل صندوقًا بالطريقة نفسها:
private Ferry ferry;
void OnControllerColliderHit(ControllerColliderHit hit)
{
if (hit.normal.y > 0.7f && hit.gameObject.TryGetComponent(out Ferry f))
{
ferry = f;
}
}التحدي
متوسطاجعل اللاعب يركب المنصة المتحركة.
- في
Player، أضفprivate MovingPlatform platform;وOnControllerColliderHit: عندما يكونhit.normal.y > 0.5fويحتوي الكائن علىMovingPlatform، احتفظ به فيplatform. - في
Update()، ضع(move + velocity) * Time.deltaTimeفيVector3 motion. إذا كانplatform != null، فأضفplatform.deltaواجعلplatform = null. - استدعِ
controller.Move(motion).
اضغط «العب» واقفز إلى المنصة: ستحملك. ثم اضغط «تحقق».
جرّب بنفسك
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
[SerializeField] private float speed = 5f;
[SerializeField] private float jumpHeight = 1.5f;
[SerializeField] private float gravity = -9.81f;
private CharacterController controller;
private InputAction moveAction;
private InputAction jumpAction;
private Vector3 velocity;
void Start()
{
controller = GetComponent<CharacterController>();
moveAction = InputSystem.actions.FindAction("Move");
jumpAction = InputSystem.actions.FindAction("Jump");
}
void Update()
{
if (controller.isGrounded && velocity.y < 0f)
{
velocity.y = -2f;
}
Vector2 input = moveAction.ReadValue<Vector2>();
Vector3 move = new Vector3(input.x, 0f, input.y) * speed;
if (jumpAction.WasPressedThisFrame() && controller.isGrounded)
{
velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
velocity.y += gravity * Time.deltaTime;
controller.Move((move + velocity) * Time.deltaTime);
}
}
جميع دروس إنشاء ألعاب حقيقية
4المشاهد والمستويات
تحميل مشهدإعادة تشغيل المستوىالمستوى التاليالاحتفاظ بالبيانات بين المشاهدمراجعة: اختيار المستوى10مشروع: لعبة منصات ثلاثية الأبعاد
المسارمنصات متحركة2الأزرار والشاشات
الأزرار وonClickالتعبيرات Lambdaالربط في Inspectorتشغيل اللوحات وإيقافهاأشرطة الصحةمراجعة: متجر الترقيات5الحفظ باستخدام PlayerPrefs
حفظ رقمالتحميل بقيمة افتراضيةأعلى نتيجةحفظ الإعداداتمراجعة: العملات في البنك6مشروع: عدّاء لا نهاية له
ثلاثة مساراتعقبات أمامكتدرّب بنفسك: Playground لـ Unity