Menu
CoddyTech

اركب المنصة

جزء من قسم إنشاء ألعاب حقيقية في رحلة 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;
    }
}
challenge icon

التحدي

متوسط

اجعل اللاعب يركب المنصة المتحركة.

  1. في Player، أضف private MovingPlatform platform; وOnControllerColliderHit: عندما يكون hit.normal.y > 0.5f ويحتوي الكائن على MovingPlatform، احتفظ به في platform.
  2. في Update()، ضع (move + velocity) * Time.deltaTime في Vector3 motion. إذا كان platform != null، فأضف platform.delta واجعل platform = null.
  3. استدعِ 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);
    }
}

جميع دروس إنشاء ألعاب حقيقية

تدرّب بنفسك: Playground لـ Unity