מדריך עבור Player 3D ו- 2D Wall Jump in Unity

Wall jumping, מכונאי נפוץ בפלטפורמות ומשחקי פעולה, מאפשר לשחקנים לקפוץ מהקירות, ומוסיף מורכבות ורב-גוניות לניווט. מדריך זה נועד לשלב קפיצת קיר בבקר ה-FPS המסופק. עד הסוף, דמות השחקן תוכל לבצע קפיצות קיר גם בהגדרות דו-ממד וגם בתלת-ממד.

יישום Wall Jump עבור תלת מימד באמצעות הסקריפט 'SC_FPSController'

החל מקוד הבסיס הנתון ממדריך Unity FPS Controller, נציג את מכונאי הקפיצה לקיר.

שלב 1: הגדרת זיהוי קיר

  • הוסף שכבה חדשה ב-Unity בשם "Wall" עבור אובייקטים שניתן לקפוץ מהם מהקיר.
  • עדכן את המחלקה 'SC_FPSController', אותה תוכל לקבל מהמדריך שלנו Unity FPS Controller, עם המשתנים הבאים:
public LayerMask wallLayer;
public float wallJumpForce = 10f;
private bool isTouchingWall = false;

שלב 2: זיהוי הקיר

  • שלבו את ההיגיון הבא בתוך שיטת 'Update()' כדי לזהות קיר:
RaycastHit hit;
if (Physics.Raycast(transform.position, transform.right, out hit, 1f, wallLayer) || Physics.Raycast(transform.position, -transform.right, out hit, 1f, wallLayer))
{
    isTouchingWall = true;
}
else
{
    isTouchingWall = false;
}

השידור הזה בקוד למעלה יזהה קירות משמאל וימין של השחקן.

שלב 3: יישום ה-Wall Jump עבור תלת מימד

  • בתוך שיטת 'Update()', לאחר ההיגיון של קפיצת הקרקע, הכנס:
else if (Input.GetButton("Jump") && canMove && isTouchingWall)
{
    moveDirection.y = wallJumpForce;

    // This adds a bit of horizontal force opposite the wall for a more dynamic jump
    if (Physics.Raycast(transform.position, transform.right, 1f, wallLayer))
    {
        moveDirection += -transform.right * wallJumpForce / 2.5f; // Adjust the divisor for stronger/weaker push.
    }
    else if (Physics.Raycast(transform.position, -transform.right, 1f, wallLayer))
    {
        moveDirection += transform.right * wallJumpForce / 2.5f;
    }
}

ההיגיון הזה בקוד למעלה בודק אם השחקן לוחץ על כפתור הקפיצה, יכול לזוז ונוגע בקיר. אם כן, הוא מעניק כוח אנכי וכוח אופקי קל הרחק מהקיר.

יישום Wall Jump עבור דו-ממד באמצעות הסקריפט 'CharacterController2D'

החל מקוד הבסיס הנתון מבקר התווים 2D עבור הדרכה Unity, נציג את המכונאי קפיצת קיר.

שלב 1: הגדרת זיהוי קיר

  • הוסף שכבה חדשה ב-Unity בשם "Wall" עבור אובייקטים שניתן לקפוץ מהם מהקיר.
  • עדכן את מחלקת 'CharacterController2D', אותה תוכל לקבל מבקר התווים 2D שלנו עבור הדרכה Unity, עם המשתנים הבאים:
public LayerMask wallLayer;
public float wallJumpForce = 10f;
private bool isTouchingWall = false;

שלב 2: זיהוי הקיר בדו מימד

  • שלבו את ההיגיון הבא בתוך שיטת 'Update()' כדי לזהות קיר:
RaycastHit2D wallHitLeft = Physics2D.Raycast(transform.position, Vector2.left, 1f, wallLayer);
RaycastHit2D wallHitRight = Physics2D.Raycast(transform.position, Vector2.right, 1f, wallLayer);

if (wallHitLeft.collider != null || wallHitRight.collider != null)
{
    isTouchingWall = true;
}
else
{
    isTouchingWall = false;
}

שלב 3: יישום ה-Wall Jump עבור 2D

  • בתוך שיטת 'Update()', לאחר ההיגיון של קפיצת הקרקע, הכנס:
if (Input.GetKeyDown(KeyCode.W) && isTouchingWall && !isGrounded)
{
    r2d.velocity = new Vector2(r2d.velocity.x, jumpHeight);
    if (wallHitLeft.collider != null)
    {
        r2d.AddForce(new Vector2(wallJumpForce, 0)); // Push to the right when wall is on the left
    }
    else if (wallHitRight.collider != null)
    {
        r2d.AddForce(new Vector2(-wallJumpForce, 0)); // Push to the left when wall is on the right
    }
}

שאלות שנדונו:

  1. איך דמות יכולה לזהות קיר ב-Unity?: דמות יכולה לזהות קירות באמצעות raycasting. על ידי ירי קרן בלתי נראית מהשחקן לכיוון הרצוי, ניתן לקבוע אם חפץ, כמו קיר, מצטלב עם קרן זו.
  2. מה ההבדל בין מימוש דו-ממד ותלת-ממד לקפיצה בקיר ב-Unity?: ב-Unity, פיזיקה דו-ממדית משתמשת בשיטות 'Physics2D' (כמו 'Physics2D.Raycast()'), בעוד שפיסיקה תלת-ממדית משתמשת בשיטות 'Physics' (כמו 'Physics.Raycast()'). ההיגיון נשאר דומה יחסית, אבל השיטות והכיוונים (וקטור 2 עבור 2D, Vector3 עבור 3D) משתנים.

סיכום

תוספת זו מאפשרת לדמות במרחב הדו-ממדי לקפוץ מקירות. ייתכן שיהיה צורך בניסוי עם ערכי הכוח כדי להבטיח משחק חלק. על ידי שילוב שלבים אלה, השחקנים ימצאו את התנועה של הדמות הדו-ממדית יותר צדדית ודינמית בסביבות עם קירות.