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);
    }
}

כל השיעורים ביחידה בניית משחקים אמיתיים

תרגלו בעצמכם: Unity אונליין