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.
Défi
Facile- Dans
Runner, ajoutepublic float magnetTime = 8f;etpublic float magnet;. Décrémente cette valeur à chaque image tant qu’elle est supérieure à 0. - Dans OnTriggerEnter, une balise
Magnetdéfinitmagnet = magnetTimeet détruit l’objet ramassé. - Dans
Coin, ajoutepullRange = 7fetpullSpeed = 30f, trouve le Runner dans Start et attire la pièce comme ci-dessus. - Dans
Road, ajoutemagnetPrefab. À la fin de Fill, utilisefloat roll = Random.value;et, siroll < 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