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;
}Sfida
Facile- Aggiungi
public float slideTime = 0.7f;eprivate float slide;. - Aggiungi
ResizeeStopSlidecome sopra. - Quando si preme S o la freccia giù mentre si è a terra, imposta
slide = slideTimee chiamaResize(0.5f). - A ogni fotogramma, se
slide > 0f, sottraiTime.deltaTimee chiamaStopSlide()quando raggiunge 0. - 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