Menu
CoddyTech

Scivola

Lezione 4 di 20 del corso Gioco Unity: Corsie nel cielo di Coddy.

Alcuni ostacoli sono troppo alti per saltarli: il corridore scivola sotto di essi. Per un momento, scivolando il corridore diventa alto la metà.

Riducendo le dimensioni dell'oggetto si riduce anche il suo CharacterController, ma la riduzione avviene attorno al centro, quindi i piedi resterebbero sospesi a mezza unità sopra la strada. Abbassa il corridore della stessa mezza unità. Il controller deve essere disattivato mentre lo sposti manualmente, altrimenti il successivo Move annulla la modifica:

void Resize(float height)
{
    controller.enabled = false;
    transform.position += Vector3.up * (height - transform.localScale.y);
    transform.localScale = new Vector3(1f, height, 1f);
    controller.enabled = true;
}

Un timer, slide, fa il conto alla rovescia della scivolata. Quando scade, il corridore si rialza con StopSlide:

void StopSlide()
{
    if (transform.localScale.y < 1f) Resize(1f);
    slide = 0f;
}
challenge icon

Sfida

Facile
  1. Aggiungi public float slideTime = 0.7f; e private float slide;.
  2. Aggiungi Resize e StopSlide come sopra.
  3. Quando si preme S o la freccia giù mentre si è a terra, imposta slide = slideTime e chiama Resize(0.5f).
  4. A ogni fotogramma, se slide > 0f, sottrai Time.deltaTime e chiama StopSlide() quando raggiunge 0.
  5. Un salto termina una scivolata: chiama StopSlide() quando il corridore salta.

Provalo tu

using UnityEngine;

public class Runner : MonoBehaviour
{
    public float laneWidth = 2.5f;
    public float laneSpeed = 16f;
    public float jumpHeight = 1.6f;
    public float gravity = -40f;

    public int lane;

    private CharacterController controller;
    private float fallSpeed;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.LeftArrow)) lane = Mathf.Max(-1, lane - 1);
        if (Input.GetKeyDown(KeyCode.D) || Input.GetKeyDown(KeyCode.RightArrow)) lane = Mathf.Min(1, lane + 1);
        bool jump = Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.Space);
        if (jump && controller.isGrounded)
        {
            fallSpeed = Mathf.Sqrt(jumpHeight * -2f * gravity);
        }

        if (controller.isGrounded && fallSpeed < 0f) fallSpeed = -2f;
        fallSpeed += gravity * Time.deltaTime;

        float targetX = lane * laneWidth;
        float x = Mathf.MoveTowards(transform.position.x, targetX, laneSpeed * Time.deltaTime);
        Vector3 move = new Vector3(x - transform.position.x, fallSpeed * Time.deltaTime, 0f);
        controller.Move(move);
    }
}

Tutte le lezioni di Gioco Unity: Corsie nel cielo

Esercitati da solo: Playground Unity