I. Introduction▲
Cette série explique comment jouer une vidéo dans une scène Unity.
Vous pouvez retrouver les autres épisodes de cette série dans le sommaire dédié.
II. Vidéo▲
Unity - Jouer une vidéo
III. Résumé▲
Dans cette vidéo, vous allez écrire une classe pour contrôler la vidéo. Ajoutez le script suivant à votre objet :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Video;
public class WorldSpaceVideo : MonoBehaviour {
public Material playButtonMaterial;
public Material pauseButtonMaterial;
public Renderer playButtonRenderer;
private VideoPlayer videoPlayer;
void Awake()
{
videoPlayer = GetComponent<VideoPlayer> ();
}
void Start ()
{
}
void Update ()
{
}
public void PlayPause()
{
if (videoPlayer.isPlaying)
{
videoPlayer.Pause ();
playButtonRenderer.material = playButtonMaterial;
} else
{
videoPlayer.Play ();
SetTotalTimeUI ();
playButtonRenderer.material = pauseButtonMaterial;
}
}
}Ce script permet de mettre en pause ou de continuer la lecture de la vidéo ainsi que de modifier l'aspect du bouton de lecture.
Pour que le joueur puisse tirer sur les boutons afin de les actionner, vous devez ajouter les scripts suivants :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public abstract class ShootableUI : MonoBehaviour
{
public WorldSpaceVideo worldSpaceVideo;
public abstract void ShotClick();
}using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlaybuttonControl : ShootableUI
{
public override void ShotClick ()
{
worldSpaceVideo.PlayPause ();
}
}Le premier script permet de définir une classe abstraite dont tous les boutons pouvant être actionnés par le joueur devront hériter. Le second script permet d'indiquer que le bouton auquel il est attaché doit appeler la fonction PlayPause() lorsque le joueur tire dessus.
Finalement, il faut ce dernier script permettant de détecter le tir du joueur :
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
public class RayCastShootComplete : MonoBehaviour {
public int gunDamage = 1; // Définit le nombre de points de contact que l'arme retire aux objets touchés
public float fireRate = 0.25f; // Nombre de secondes déterminant le temps entre deux tirs
public float weaponRange = 50f; // Distance dans l'unité de Unity sur laquelle le joueur peut tirer
public float hitForce = 100f; // Force à ajouter aux objets physiques touchés
public Transform gunEnd; // Référence pointant le bout de l'arme
private Camera fpsCam; // Référence à la caméra FPS
private WaitForSeconds shotDuration = new WaitForSeconds(0.07f); // Objet WaitForSeconds utilisé pour la coroutine ShotEffect, déterminant le temps d'apparition de la ligne du laser
private AudioSource gunAudio; // Référence à la source audio qui jouera le son de l'arme
private LineRenderer laserLine; // Référence au composant LineRenderer servant à afficher le laser
private float nextFire; // Nombre à virgule flottante pour stocker le moment où le joueur pourra tirer à nouveau
void Start ()
{
// Récupère la référence du composant LineRenderer
laserLine = GetComponent<LineRenderer>();
// Récupère la référence du composant AudioSource
gunAudio = GetComponent<AudioSource>();
// Récupère la référence de la caméra en cherchant dans ce GameObject et ses parents
fpsCam = GetComponentInParent<Camera>();
}
void Update ()
{
// Vérifie si le joueur a appuyé sur le bouton de feu et si le temps entre deux tirs n'est pas trop court
if (Input.GetButtonDown("Fire1") && Time.time > nextFire)
{
// Met à jour le temps auquel le joueur a tiré
nextFire = Time.time + fireRate;
// Démarre la coroutine pour le laser
StartCoroutine (ShotEffect());
// Crée un vecteur au centre de la caméra
Vector3 rayOrigin = fpsCam.ViewportToWorldPoint (new Vector3(0.5f, 0.5f, 0.0f));
// Déclare un contact pour le lancer de rayon
RaycastHit hit;
// Définit la position d'origine pour l'effet de notre laser au bout de l'arme
laserLine.SetPosition (0, gunEnd.position);
// Vérifie si notre lancer de rayon a touché quoi que ce soit
if (Physics.Raycast (rayOrigin, fpsCam.transform.forward, out hit, weaponRange))
{
// Définit la position de fin de notre laser
laserLine.SetPosition (1, hit.point);
// Récupère une référence au script de vie attaché à l'objet touché
ShootableBox health = hit.collider.GetComponent<ShootableBox>();
// Si un tel script est attaché
if (health != null)
{
// Appelle la fonction appliquant les dégâts avec la variable gunDamage
health.Damage (gunDamage);
}
// Vérifie si l'objet que nous avons touché est un objet physique
if (hit.rigidbody != null)
{
// Applique une force à cet objet, dans la direction du rayon
hit.rigidbody.AddForce (-hit.normal * hitForce);
}
ShootableUI shotUI;
shotUI = hit.collider.GetComponent<ShootableUI> ();
if (shotUI != null)
{
shotUI.ShotClick ();
}
}
else
{
// Si nous n'avons rien touché, définit la fin de la ligne directement à la limite de la portée (weaponRange)
laserLine.SetPosition (1, rayOrigin + (fpsCam.transform.forward * weaponRange));
}
}
}
private IEnumerator ShotEffect()
{
// Joue l'effet de tir
gunAudio.Play ();
// Affiche le laser
laserLine.enabled = true;
// Attend .07 secondes
yield return shotDuration;
// Désactive le laser
laserLine.enabled = false;
}
}IV. Ressources▲
Vous pouvez télécharger les ressources pour ce projet ici.
V. Commenter▲
Vous pouvez commenter et donner vos avis dans la discussion associée sur le forum.




