using RenderHeads.Media.AVProVideo; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class OptionsAudioTrackPage : MonoBehaviour { [Header("Media Player")] [SerializeField] private MediaPlayer _MediaPlayer; [Header("Options Menu")] [SerializeField] private OptionsMenu _OptionsMenu; [Header("Content")] [SerializeField] private Transform _Content; [SerializeField] private RectTransform _ScrollViewRectTransform; [SerializeField] private RectTransform _ViewportRectTransform; [SerializeField] private GameObject _AudioTrackLinePrefab; private string m_SetupForAudioPath; private class CAudioTrackSet { public GameObject m_LineGO = null; } private List<CAudioTrackSet> m_lAudioTrackSets = new List<CAudioTrackSet>(); void Start() { UpdateSets(); } void Update() { UpdateSets(); } private void AddAudioTrackSet( string title, bool bEnabled ) { GameObject newLineGO = GameObject.Instantiate( _AudioTrackLinePrefab, _Content ); if( newLineGO != null ) { // Setup text Transform titleTransform = newLineGO.transform.Find( "TitleText" ); Text titleText = ( titleTransform != null ) ? titleTransform.GetComponent<Text>() : null; if( titleText != null ) { titleText.text = title; } // Tick icon if( bEnabled ) { Transform tickIconTransform = newLineGO.transform.Find( "TickIcon" ); Image tickIconImage = ( tickIconTransform != null ) ? tickIconTransform.GetComponent<Image>() : null; if( tickIconImage != null ) { tickIconImage.enabled = true; } } // On click if( _OptionsMenu ) { Button button = newLineGO.GetComponent<Button>(); if( button ) { int iIndex = m_lAudioTrackSets.Count; button.onClick.AddListener( delegate { _OptionsMenu.ChangeAudioTrack( iIndex ); } ); } } // Add it to the list CAudioTrackSet cAudioTrackSet = new CAudioTrackSet(); cAudioTrackSet.m_LineGO = newLineGO; m_lAudioTrackSets.Add( cAudioTrackSet ); } } public void UpdateSets() { if( _MediaPlayer != null && _MediaPlayer.Control.HasMetaData() ) { if( m_SetupForAudioPath == null || !m_SetupForAudioPath.Equals( _MediaPlayer.MediaPath.Path ) ) { m_SetupForAudioPath = _MediaPlayer.MediaPath.Path; foreach( CAudioTrackSet AudioTrackSet in m_lAudioTrackSets ) { GameObject.Destroy( AudioTrackSet.m_LineGO ); AudioTrackSet.m_LineGO = null; } // Remove everything m_lAudioTrackSets.Clear(); // Add all subtitle sets foreach( AudioTrack AudioTrack in _MediaPlayer.AudioTracks.GetAudioTracks() ) { AddAudioTrackSet( AudioTrack.DisplayName, false ); } if( m_lAudioTrackSets.Count > 1 ) { // Reposition everything float fLineHeight = 40.0f; float fTotalHeight = fLineHeight * m_lAudioTrackSets.Count; RectTransform contentRectTransform = ( _Content != null ) ? _Content.GetComponent<RectTransform>() : null; if( contentRectTransform != null ) { contentRectTransform.sizeDelta = new Vector2( contentRectTransform.sizeDelta.x, fTotalHeight ); } float fY = (fTotalHeight * 0.5f) - (fLineHeight * 0.5f); foreach( CAudioTrackSet AudioTrackSet in m_lAudioTrackSets ) { RectTransform rectTransform = AudioTrackSet.m_LineGO.GetComponent<RectTransform>(); if ( rectTransform ) { rectTransform.anchoredPosition = new Vector2( 0.0f, fY ); fY -= fLineHeight; } } if( _ViewportRectTransform && _ScrollViewRectTransform ) { float fMaxHeight = 222.0f; float fNewHeight = Mathf.Clamp( fTotalHeight, fLineHeight, fMaxHeight ); float fBottomPadding = 12.0f; RectTransform rectTransform = transform.GetComponent<RectTransform>(); rectTransform.sizeDelta = new Vector2( rectTransform.sizeDelta.x, 60.0f + fNewHeight + fBottomPadding ); _ScrollViewRectTransform.sizeDelta = new Vector2( _ScrollViewRectTransform.sizeDelta.x, fNewHeight ); _ViewportRectTransform.sizeDelta = new Vector2( _ViewportRectTransform.sizeDelta.x, fNewHeight ); } } ChangeAudioTrack( _MediaPlayer.AudioTracks.GetAudioTracks().GetActiveTrackIndex(), false ); } } } public void ChangeAudioTrack( int iTrackIndex, bool bSetTrack = true ) { AudioTracks audioTracks = ( _MediaPlayer ) ? _MediaPlayer.AudioTracks.GetAudioTracks() : null; if( audioTracks != null ) { if( bSetTrack ) { // Change Audio track on the media player _MediaPlayer.AudioTracks.SetActiveAudioTrack( ( iTrackIndex > -1 && iTrackIndex < audioTracks.Count ) ? audioTracks[ iTrackIndex ] : null ); } // Sort out UI int iIndex = 0; foreach ( CAudioTrackSet AudioTrackSet in m_lAudioTrackSets ) { Transform tickIconTransform = AudioTrackSet.m_LineGO.transform.Find( "TickIcon" ); Image tickIconImage = ( tickIconTransform != null ) ? tickIconTransform.GetComponent<Image>() : null; if ( tickIconImage != null ) { tickIconImage.enabled = ( iIndex == iTrackIndex ); } ++iIndex; } } } }