Écran titre et rejouer
Leçon 20 sur 20 du cours Jeu Unity : Voies célestes de Coddy.
Enfin, le jeu a un début et une fin. Il s’ouvre sur un écran titre : le nom, le meilleur score et « Sauter pour jouer ». La route reste immobile et les touches ne font rien jusqu’à ce qu’une touche de saut (Espace ou W) lance la partie.
Il faut un deuxième état en plus de over : running. GameOver met fin à la partie et, après cela, une touche de saut recharge la scène, ce qui rétablit tout comme au début :
if (over && (Input.GetKeyDown(KeyCode.Space) || Input.GetKeyDown(KeyCode.W)))
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}Le meilleur score est stocké dans PlayerPrefs ; il est donc conservé après le rechargement.
Défi
Moyen- Dans
GameManager, ajouteusing UnityEngine.SceneManagement;etpublic bool running;. Start définitspeed = 0fet le message de titre. - Dans Update : appuyer sur Space ou W lorsque le jeu n’est ni en cours ni terminé lance la partie (
running = true, message vide) ; appuyer sur Space ou W après une fin de partie recharge la scène ; et, lorsque le jeu n’est pas en cours, exécute return. - GameOver retourne maintenant si le jeu n’est pas en cours, définit
running = falseet termine le message par"\nJump to run again". - Dans
Runner, lis les touches et vérifie les déclencheurs uniquement lorsquegame.runningest vrai.
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 float magnetTime = 8f;
public int lane;
public float magnet;
public bool shield;
private CharacterController controller;
private GameManager game;
private Renderer body;
private float fallSpeed;
private float slide;
private Color color;
void Start()
{
controller = GetComponent<CharacterController>();
game = FindFirstObjectByType<GameManager>();
body = GetComponent<Renderer>();
color = body.material.color;
}
void Update()
{
if (!game.over)
{
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 (magnet > 0f) magnet -= Time.deltaTime;
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);
body.material.color = shield ? new Color(0.3f, 0.9f, 1f) : color;
ShowPower();
}
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;
}
void ShowPower()
{
string text = "";
if (magnet > 0f) text = "Magnet " + Mathf.CeilToInt(magnet);
if (shield) text += (text == "" ? "" : " ") + "Shield";
game.powerText.text = text == "" ? " " : text;
}
void OnTriggerEnter(Collider other)
{
if (game.over) return;
if (other.CompareTag("Obstacle"))
{
if (shield)
{
shield = false;
Destroy(other.gameObject);
return;
}
game.GameOver();
}
else if (other.CompareTag("Coin"))
{
game.AddCoin();
Destroy(other.gameObject);
}
else if (other.CompareTag("Magnet"))
{
magnet = magnetTime;
Destroy(other.gameObject);
}
else if (other.CompareTag("Shield"))
{
shield = true;
Destroy(other.gameObject);
}
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Jeu Unity : Voies célestes
Entraînez-vous par vous-même : Playground Unity