Menu
CoddyTech

Aimant

Leçon 14 sur 20 du cours Jeu Unity : Voies célestes de Coddy.

Les bonus rendent chaque course différente de la précédente. Le premier est un aimant : pendant 8 secondes, toutes les pièces proches du coureur volent vers lui.

Le coureur garde le temps restant dans magnet et le décompte. Chaque pièce regarde le coureur et, tant que l’aimant est activé et que le coureur est proche, se déplace vers lui :

if (runner.magnet > 0f && Vector3.Distance(transform.position, runner.transform.position) < pullRange)
{
    transform.position = Vector3.MoveTowards(transform.position, runner.transform.position, pullSpeed * Time.deltaTime);
}

La pièce vole jusqu’au coureur et son déclencheur fait le reste. De temps en temps, un tronçon de route reçoit un bonus d’aimant rose, 6 unités avant ses obstacles.

challenge icon

Défi

Facile
  1. Dans Runner, ajoute public float magnetTime = 8f; et public float magnet;. Décrémente cette valeur à chaque image tant qu’elle est supérieure à 0.
  2. Dans OnTriggerEnter, une balise Magnet définit magnet = magnetTime et détruit l’objet ramassé.
  3. Dans Coin, ajoute pullRange = 7f et pullSpeed = 30f, trouve le Runner dans Start et attire la pièce comme ci-dessus.
  4. Dans Road, ajoute magnetPrefab. À la fin de Fill, utilise float roll = Random.value; et, si roll < 0.06f, place un aimant dans une voie aléatoire à y 1, z -6.

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 GameManager game;
    private float fallSpeed;
    private float slide;

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

    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 (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;
    }

    void OnTriggerEnter(Collider other)
    {
        if (game.over) return;
        if (other.CompareTag("Obstacle"))
        {
            game.GameOver();
        }
        else if (other.CompareTag("Coin"))
        {
            game.AddCoin();
            Destroy(other.gameObject);
        }
    }
}

Toutes les leçons de Jeu Unity : Voies célestes

Entraînez-vous par vous-même : Playground Unity