Tutorial per il salto a muro del giocatore 3D e 2D per Unity

Salto sui muri, una meccanica prevalente nei platform e nei giochi d'azione, consente ai giocatori di saltare dai muri, aggiungendo complessità e versatilità alla navigazione. Questo tutorial mira a integrare il salto sul muro nel controller FPS fornito. Alla fine, il personaggio del giocatore sarà in grado di eseguire salti sul muro sia in modalità 2D che 3D.

Implementazione del Wall Jump per il 3D utilizzando lo script 'SC_FPSController'

Partendo dal codice base fornito dal tutorial Unity FPS Controller, introdurremo la meccanica del salto sul muro.

Passaggio 1: impostazione del rilevamento dei muri

  • Aggiungi un nuovo livello in Unity chiamato "Wall" per gli oggetti da cui è possibile saltare dal muro.
  • Aggiorna la classe 'SC_FPSController', che puoi ottenere dal nostro tutorial Unity FPS Controller, con le seguenti variabili:
public LayerMask wallLayer;
public float wallJumpForce = 10f;
private bool isTouchingWall = false;

Passaggio 2: rilevamento del muro

  • Incorpora la seguente logica all'interno del metodo 'Update()' per rilevare un muro:
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;
}

Questo raycast nel codice sopra rileverà i muri a sinistra e a destra del giocatore.

Passaggio 3: implementazione del Wall Jump per il 3D

  • All'interno del metodo 'Update()', dopo la logica del salto a terra, inserire:
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;
    }
}

Questa logica nel codice sopra controlla se il giocatore sta premendo il pulsante di salto, può muoversi e sta toccando un muro. Se è così, impartisce una forza verticale e una leggera forza orizzontale lontano dal muro.

Implementazione del Wall Jump per il 2D utilizzando lo script 'CharacterController2D'

Partendo dal codice base fornito dal tutorial 2D Character Controller per Unity, introdurremo la meccanica salto sul muro.

Passaggio 1: impostazione del rilevamento dei muri

  • Aggiungi un nuovo livello in Unity chiamato "Wall" per gli oggetti da cui è possibile saltare dal muro.
  • Aggiorna la classe 'CharacterController2D', che puoi ottenere dal nostro tutorial 2D Character Controller per Unity, con le seguenti variabili:
public LayerMask wallLayer;
public float wallJumpForce = 10f;
private bool isTouchingWall = false;

Passaggio 2: rilevamento del muro in 2D

  • Incorpora la seguente logica all'interno del metodo 'Update()' per rilevare un muro:
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;
}

Passaggio 3: implementazione del Wall Jump per il 2D

  • All'interno del metodo 'Update()', dopo la logica del salto a terra, inserire:
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
    }
}

Domande affrontate:

  1. Come può un personaggio rilevare un muro in Unity?: Un personaggio può rilevare i muri usando raycasting. Sparando un raggio invisibile dal giocatore nella direzione desiderata, è possibile determinare se un oggetto, come un muro, si interseca con questo raggio.
  2. Qual è la differenza tra l'implementazione del salto sul muro 2D e 3D in Unity?: In Unity, la fisica 2D utilizza i metodi 'Physics2D' (come 'Physics2D.Raycast()'), mentre la fisica 3D utilizza metodi 'Physics' (come 'Physics.Raycast()'). La logica rimane relativamente simile, ma i metodi e le direzioni (Vector2 per 2D, Vector3 per 3D) variano.

Conclusione

Questa aggiunta consente al personaggio nello spazio 2D di saltare dai muri. La sperimentazione con i valori di forza potrebbe essere necessaria per garantire un gameplay fluido. Integrando questi passaggi, i giocatori scopriranno che il movimento del personaggio 2D sarà più versatile e dinamico negli ambienti con muri.

Articoli suggeriti
Aggiunta del supporto per il doppio salto a un controller di personaggi platform 2D in Unity
Tutorial sul controller del lettore top-down per Unity
Implementazione del sistema Parkour in Unity
Tutorial sulla torcia elettrica per Unity
Tutorial sul controller worm 3D per Unity
Controller per lettori RTS e MOBA per Unity
Controllore di elicottero per Unity