Créons nos obstacles. Dans le jeu flappy bird, les obstacles sont des tuyaux. Ils doivent se faire face, le tout contenu dans un seul GameObject.
Après avoir rajouté le tag Pipes aux tuyaux pour pouvoir les identifier, nous allons tuer le petit oiseau si jamais il les touche. Il faut également ajouter un BoxCollider2D.
using UnityEngine;
public class DieLittleBird : MonoBehaviour {
private Collider2D _collider
// Use this for initialization
void Start () {
_collider = GetComponent<Collider2D>();
}
void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "Flappy")
{
collision.gameObject.SetActive(false);
Time.timeScale = 0;
}
}
}
Le script est composé de la récupération du Collider, et d’une méthode événement OnCollisionEnter2D qui sera appelée à chaque fois que le GameObject entre en collision avec quelque chose. Nous allons vérifier le tag de l’objet ayant causé la collision et s'assurer qu'il s'agit bien de notre oiseau. Dans ce cas, nous désactiverons l’oiseau et arrêterons le temps, ce qui fera office de fin de jeu.
La raison pour laquelle nous avons mis le script de mort sur les tuyaux est purement arbitraire. Il était tout à fait possible de le mettre sur l'oiseau en testant le tag Pipes.
Nous allons maintenant déplacer nos tuyaux en altérant uniquement la position du contenant, ce qui aura pour effet d'également déplacer le contenu.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RunLittlePipes : MonoBehaviour {
[SerializeField]
private float Speed;
private Rigidbody2D _rb;
// Use this for initialization
void Start () {
_rb = gameObject.GetComponent<Rigidbody2D>();
_rb.velocity = Vector3.left * Speed;
}
}
Contrairement au script de vol de l’oiseau, nous ne modifirons pas en permamence la vitesse via des impulsions. Ce que l’on veux, c’est que les tuyaux se dirigent toujours vers la gauche sans jamais s’arrêter. Nous allons donc fixer leur vitesse dès le début. Nous allons également modifier légèrement leur RigidBody comme ci-dessus. En fixant les contraintes Y et Z, cela évitera les comportements imprévus en cas de collisions.
Occupons-nous désormais de faire apparaître et disparaître les tuyaux. Il va nous falloir un Préfab exploitable par le script d'apparition. Le Préfab est un élément important du moteur. C'est un GameObject qui va être sauvegardé avec une configuration par défaut. Il sera alors instantiable via les scripts directement par référence. Il ne nécessitera pas d'être présent dans la scène au démarrage de votre application. Afin de le créer, il faut Drag&Drop le conteneur des tuyaux dans le dossier projet.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SpawnLittlePipes : MonoBehaviour
{
private Transform _transform;
public GameObject LittlePipe;
[SerializeField]
private float IntervalSpawn;
private float timer;
// Use this for initialization
void Start()
{
_transform = gameObject.transform;
timer = IntervalSpawn;
}
// Update is called once per frame
void Update()
{
timer += Time.deltaTime;
if (timer > IntervalSpawn)
{
Instantiate(LittlePipe, _transform.position + new Vector3(0,Random.Range(-2,4),0), _transform.rotation);
timer = default(float);
}
}
}
Voici le script d’apparition. La variable privée LittlePipe va servir à indiquer au script quel est l’objet qu’il doit faire spawn. Ensuite, le script déclare un timer classique qui, une fois tous les X temps défini par le Game Designer, va faire apparaître le nouvel objet. Ici, pour l’axe verticale, on va également rajouter une attribution aléatoire afin de faire apparaître à des hauteur différents les tuyaux et donner un peu plus de complexité au jeu.
Occupons nous maintenant de faire disparaître ces petits tuyaux. Créons un nouveau GameObject dans lequel il y aura le script de destruction des tuyaux.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DispawnLittlePipes : MonoBehaviour {
void OnTriggerEnter2D(Collider2D other) {
if(other.gameObject.tag == "Pipes")
{
Destroy(other.gameObject);
}
}
}
Le script suivant, se base sur L’évènement OnTriggerEnter2D. Le Trigger, contrairement au Collider détecte juste l’entrée d’un élément dans une zone. Il détruira donc tout objet qui rentrera dans le Trigger si sont tag est « Pipes ».
Rajoutons maintenant un peu de retour sur l’avancée du joueur. Dans Flappy Bird, le but du jeu est de passer le plus d’obstacles possibles. Il va donc falloir détecter à chaque fois que l’oiseau dépasse un obstacle.
Pour le moment occupons nous de créer un GameObject qui va servir à compter les points. En créer un nouveau EmptyObject et lui ajoutant un script PointCount. Il n'existe pas de méthode unique pour compter les points, pour le moment nous allons passer par une variable static pour compter plus facilement le nombre de points. Pour ajouter un point on va une fois de plus passer par un nouveau trigger qui sera positionner en sortie d’obstacle.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PointCount {
public static int Count;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AddPoint : MonoBehaviour {
void OnTriggerEnter2D(Collider2D other)
{
if(other.gameObject.tag == "Flappy")
{
PointCount.Count++;
}
}
}
Avec ce script, on ajoute donc un point à chaque fois qu’un objet avec le flag Flappy entre dans le trigger.
Affichons maintenant le score. On va passer par le composant Text de l’UI d’Unity pour gagner en efficacité.
using UnityEngine;
using UnityEngine.UI;
public class DisplayScore : MonoBehaviour
{
private Text _text;
void Start()
{
_text = GetComponent<Text>();
}
void Update()
{
_text.text = PointCount.Count.ToString();
}
}
L’optimisation n’est pas terrible, mais l’idée est là, le composant Text est mise à jour à chaque frame avec la valeur du nouveau point.
Nous commençons à avoir quelque chose de presque divertissant ! Cependant, il est temps de rendre tout cela un peu plus beau et plus attrayant d'un point de vue expérience de jeu.
Commentaires :
Aucun commentaires pour le moment
Laissez un commentaire :