Collision
Leçon 11 sur 20 du cours Jeu Unity : Voies célestes de Coddy.
Les obstacles sont des déclencheurs : ils détectent le coureur sans le repousser. Lorsque le CharacterController du coureur et un déclencheur se rencontrent, Unity appelle OnTriggerEnter dans les scripts du coureur, en lui transmettant le collider du déclencheur :
void OnTriggerEnter(Collider other)
{
if (game.over) return;
if (other.CompareTag("Obstacle"))
{
game.GameOver();
}
}GameOver met fin à la course : over devient true, la vitesse passe à 0 pour que la route s'arrête, et le message au milieu de l'écran l'indique. Tant que over est true, le GameManager cesse de compter la distance et le Runner cesse de lire les touches.
Défi
Moyen- Dans
GameManager, ajoutepublic TMP_Text messageText;etpublic bool over;. - Ajoute
public void GameOver(): sioverest déjà vrai, retourne ; sinon, définisover = true,speed = 0fetmessageText.text = "Game over". - Au début de Update de GameManager, ajoute
if (over) return;. - Dans
Runner, trouve le GameManager dans Start, lis les touches uniquement lorsque!game.over, et ajouteOnTriggerEntercomme ci-dessus.
Essayez vous-même
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 float slideTime = 0.7f;
public int lane;
private CharacterController controller;
private float fallSpeed;
private float slide;
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);
StopSlide();
}
if ((Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown(KeyCode.DownArrow)) && controller.isGrounded)
{
slide = slideTime;
Resize(0.5f);
}
if (slide > 0f)
{
slide -= Time.deltaTime;
if (slide <= 0f) StopSlide();
}
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);
}
void StopSlide()
{
if (transform.localScale.y < 1f) Resize(1f);
slide = 0f;
}
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;
}
}
Toutes les leçons de Jeu Unity : Voies célestes
Entraînez-vous par vous-même : Playground Unity