#if UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_5 || UNITY_5_4_OR_NEWER #define UNITY_FEATURE_UGUI #endif using UnityEngine; #if UNITY_FEATURE_UGUI using UnityEngine.UI; using System.Collections; using System.Collections.Generic; //----------------------------------------------------------------------------- // Copyright 2015-2018 RenderHeads Ltd. All rights reserverd. //----------------------------------------------------------------------------- namespace RenderHeads.Media.AVProVideo.Demos { /// /// A demo that shows multiple videos being loaded and displayed at once /// Each time a button is pressed a new video instance is added/removed /// public class SampleApp_Multiple : MonoBehaviour { [SerializeField] private string m_videoPath = "BigBuckBunny_360p30.mp4"; private int m_NumVideosAdded = 0; private List m_aAddedVideos = new List(); private void Update() { #if UNITY_ANDROID // To handle 'back' button on Android devices if (Input.GetKeyDown(KeyCode.Escape)) { Application.Quit(); } #endif foreach( DisplayUGUI gui in m_aAddedVideos ) { if( gui.gameObject != null && gui.gameObject.activeSelf == false && gui._mediaPlayer != null && gui._mediaPlayer.Control != null && ( gui._mediaPlayer.Control.IsPlaying() ) ) { gui.gameObject.SetActive( true ); } } } private void UpdateVideosLayout() { GameObject canvasPanel = GameObject.Find("Canvas/Panel"); RectTransform canvasRectTransform = ( canvasPanel ) ? canvasPanel.GetComponent() : null; if( canvasRectTransform ) { Vector2 canvasSize = canvasRectTransform.sizeDelta; Vector2 halfCanvasSize = new Vector2( canvasSize.x * 0.5f, canvasSize.y * 0.5f ); int iNumMovies = m_aAddedVideos.Count; int iNumColRows = Mathf.CeilToInt (Mathf.Sqrt( iNumMovies )); float fWidth = (1.0f / iNumColRows) * canvasSize.x; float fHeight = (1.0f / iNumColRows) * canvasSize.y; for( int i = 0; i < iNumMovies; ++i ) { DisplayUGUI gui = m_aAddedVideos[ i ]; int x = i % iNumColRows; int y = i / iNumColRows; gui.rectTransform.anchoredPosition = new Vector2( ((fWidth * x) - halfCanvasSize.x), ((fHeight * -y) + halfCanvasSize.y) ); gui.rectTransform.sizeDelta = new Vector2( fWidth, fHeight ); } } } public void AddVideoClicked() { ++m_NumVideosAdded; // New media player GameObject newMediaPlayerGameObject = new GameObject( "AVPro MediaPlayer " + m_NumVideosAdded.ToString() ); MediaPlayer newMediaPlayer = newMediaPlayerGameObject.AddComponent(); newMediaPlayer.m_VideoPath = m_videoPath; newMediaPlayer.m_AutoStart = true; newMediaPlayer.m_Loop = true; // New uGUI object GameObject canvasPanel = GameObject.Find("Canvas/Panel"); if( canvasPanel != null ) { // New game object, and make it a child of the canvas panel GameObject newGuiGameObject = new GameObject( "AVPro Video uGUI " + m_NumVideosAdded.ToString() ); newGuiGameObject.transform.parent = canvasPanel.transform; newGuiGameObject.SetActive( false ); // Add the components newGuiGameObject.AddComponent(); newGuiGameObject.AddComponent(); // Add the DisplayUGUI; DisplayUGUI newGuiObject = newGuiGameObject.AddComponent(); newGuiObject._mediaPlayer = newMediaPlayer; newGuiObject._scaleMode = ScaleMode.StretchToFill; newGuiObject.rectTransform.localScale = Vector3.one; newGuiObject.rectTransform.pivot = new Vector2( 0.0f, 1.0f ); m_aAddedVideos.Add( newGuiObject ); // Update layout UpdateVideosLayout(); } } public void RemoveVideoClicked() { if (m_aAddedVideos.Count > 0) { // Pick a random element to remove int index = Random.Range(0, m_aAddedVideos.Count); DisplayUGUI gui = m_aAddedVideos[index]; // Stop and destroy the MediaPlayer if (gui._mediaPlayer != null) { gui._mediaPlayer.CloseVideo(); GameObject.Destroy(gui._mediaPlayer.gameObject); gui._mediaPlayer = null; } // Destroy the Display object GameObject.Destroy(gui.gameObject); // Update variables m_aAddedVideos.RemoveAt(index); m_NumVideosAdded--; } } void OnDestroy() { foreach( DisplayUGUI gui in m_aAddedVideos ) { if( gui._mediaPlayer ) { gui._mediaPlayer = null; } } m_aAddedVideos.Clear(); } } } #endif