| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 | using UnityEngine;using UnityEngine.UI;//-----------------------------------------------------------------------------// Copyright 2015-2021 RenderHeads Ltd.  All rights reserved.//-----------------------------------------------------------------------------namespace RenderHeads.Media.AVProVideo{	/// <summary>	/// Update a standard uGUI Text element with subtitle text as it plays from the MediaPlayer	/// </summary>	[AddComponentMenu("AVPro Video/Subtitles uGUI", 201)]	[HelpURL("http://renderheads.com/products/avpro-video/")]	public class SubtitlesUGUI : MonoBehaviour	{		[SerializeField] MediaPlayer _mediaPlayer = null;		[SerializeField] Text _text = null;		[SerializeField] Image _backgroundImage = null;		[SerializeField] int _backgroundHorizontalPadding = 32;		[SerializeField] int _backgroundVerticalPadding = 16;		[SerializeField, Range(-1, 1024)] int _maxCharacters = 256;		public MediaPlayer Player		{			set { ChangeMediaPlayer(value); } 			get { return _mediaPlayer; }		}		public Text Text		{			set { _text = value; } 			get { return _text; }		}		void Start()		{			ChangeMediaPlayer(_mediaPlayer);		}		void OnDestroy()		{			ChangeMediaPlayer(null);		}		void Update()		{			// TODO: Currently we need to call this each frame, as when it is called right after SetText() 			// the ContentSizeFitter hasn't run yet, so effectively the box is a frame behind.			UpdateBackgroundRect();		}		public void ChangeMediaPlayer(MediaPlayer newPlayer)		{			// When changing the media player, handle event subscriptions			if (_mediaPlayer != null)			{				_mediaPlayer.Events.RemoveListener(OnMediaPlayerEvent);				_mediaPlayer = null;			}			SetText(string.Empty);			if (newPlayer != null)			{				newPlayer.Events.AddListener(OnMediaPlayerEvent);				_mediaPlayer = newPlayer;			}		}		private void SetText(string text)		{			_text.text = text;			UpdateBackgroundRect();		}		private string PrepareText(string text)		{			// Crop text that is too long			if (_maxCharacters >= 0 && text.Length > _maxCharacters)			{				text = text.Substring(0, _maxCharacters);			}			// Change RichText for Unity uGUI Text			text = text.Replace("<font color=", "<color=");			text = text.Replace("</font>", "</color>");			text = text.Replace("<u>", string.Empty);			text = text.Replace("</u>", string.Empty);			return text;		}		private void UpdateBackgroundRect()		{			if (_backgroundImage)			{				if (string.IsNullOrEmpty(_text.text))				{					_backgroundImage.enabled = false;				}				else				{					_backgroundImage.enabled = true;					_backgroundImage.rectTransform.sizeDelta = _text.rectTransform.sizeDelta;					_backgroundImage.rectTransform.anchoredPosition = _text.rectTransform.anchoredPosition;					_backgroundImage.rectTransform.offsetMin -= new Vector2(_backgroundHorizontalPadding, _backgroundVerticalPadding);					_backgroundImage.rectTransform.offsetMax += new Vector2(_backgroundHorizontalPadding, _backgroundVerticalPadding);				}			}		}		// Callback function to handle events		private void OnMediaPlayerEvent(MediaPlayer mp, MediaPlayerEvent.EventType et, ErrorCode errorCode)		{			switch (et)			{				case MediaPlayerEvent.EventType.Closing:				{					SetText(string.Empty);					break;				}				case MediaPlayerEvent.EventType.SubtitleChange:				{					SetText(PrepareText(_mediaPlayer.Subtitles.GetSubtitleText()));					break;				}			}		}	}}
 |