Unity - Jouer une vidéo

Contrôler la vidéo

L'auteur

Site personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

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 :

 
Sélectionnez
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 :

 
Sélectionnez
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public abstract class ShootableUI : MonoBehaviour 
{
    public WorldSpaceVideo worldSpaceVideo;

    public abstract void ShotClick();
}
 
Sélectionnez
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 :

 
Sélectionnez
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  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.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2017 Unity Technologies. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.