Я создаю галерею просмотра видео .mp4 и фотографий .jpg в Unity;В галерее, если я выбираю кнопку «Добавить», я открываю браузер, где могу искать фотографию или видеофайл и сохраняю ссылку, чтобы назначить ее кнопке, если, например, я добавляю видео и даю его, воспроизведение работает без проблем,если я сделаю ту же процедуру на другой кнопке с вышеупомянутым, но на этот раз добавление равной фотографии воспроизводится без проблем.
Моя проблема в том, что я добавил фотографию, и я хочу снова воспроизвести видео, и оно не позволяет мне воспроизвести его, потому что каким-то образом кнопка назначила метод воспроизведения фотографий, если я добавляю больше фотографий, то нетпроблема.то же самое происходит, если я сначала добавляю фотографии, а затем видео.
Я действительно не могу найти способ ее решить, у меня заняло около 3 дней этой проблемы.
Я прикрепляю коды ся работаю.
Класс 1:
public string _filePath;
[SyncVar]
public string _file;
[SyncVar]
public int _filePlayIndex;
[SyncVar]
public int _fileExplorerIndex;
public bool isVideo;
public bool isPhoto;
#endregion
#region Metodos de inicializacion
private void Start()
{
FileBrowser.AddQuickLink( "Contenidos", _filePath, null );
_filePlayIndex = 1;
}
#endregion
public void SendRpcSetFileName( int serverOption )
{
if (isServer)
{
RpcSetFileName( serverOption );
}
SetFileName( serverOption );
}
[ClientRpc]
private void RpcSetFileName( int rpcOption )
{
SetFileName( rpcOption );
}
//Metodo que extrae el nombre del archivo seleccionado en el explorador, la asigna en una variable temporal, asigna su formato
//y al momento de aceptar en el boton del explorador lo sincronizara en todos los clientes
private void SetFileName( int option )
{
_galleryControlsScript._buttonFileName[_galleryControlsRPC._fileExplorerIndex].text
= _fileBrowserScript.filenameInputField.text;
if ( option == _galleryControlsRPC._fileExplorerIndex && _fileBrowserScript.filenameInputField.text.Contains( ".mp4" ) )
{
isVideo = true;
isPhoto = false;
//Obtenemos el nombre del archivo con su extencion
_galleryControlsScript._buttonFileName[_galleryControlsRPC._fileExplorerIndex].text
= _fileBrowserScript.filenameInputField.text.Replace( ".mp4", string.Empty ) ;
//Obtenemos el nombre del archivo, le quitamos la extencion .mp4 y la asignamos al texto del boton seleccionado//asignamos el nombre del archivo a la variable _file
_file = _galleryControlsScript._buttonFileName[_galleryControlsRPC._fileExplorerIndex].text + ".mp4";
//y la agregamos a la lista general de archivos agregandole nuevamente su extencion .mp4
_loadVideoFileScript._videoFiles[_galleryControlsRPC._fileExplorerIndex] = _file;
Debug.Log( "Nombre del archivo: " + _file + " " + " index del explorador: " + _galleryControlsRPC._fileExplorerIndex + " e indes de reproduccion " + _filePlayIndex );
Debug.Log( "Es Video" );
}
else if ( option == _galleryControlsRPC._fileExplorerIndex && _fileBrowserScript.filenameInputField.text.Contains( ".jpg" ) )
{
isPhoto = true;
isVideo = false;
//Obtenemos el nombre del archivo con su extencion
_galleryControlsScript._buttonFileName[_galleryControlsRPC._fileExplorerIndex].text
= _fileBrowserScript.filenameInputField.text.Replace(".jpg", string.Empty);
//Obtenemos el nombre del archivo, le quitamos la extencion .mp4 y la asignamos al texto del boton seleccionado//asignamos el nombre del archivo a la variable _file
_file = _galleryControlsScript._buttonFileName[_galleryControlsRPC._fileExplorerIndex].text + ".jpg";
//y la agregamos a la lista general de archivos agregandole nuevamente su extencion .mp4
_loadPhotoFileScript._photoFiles[_galleryControlsRPC._fileExplorerIndex] = _file;
Debug.Log( "Nombre del archivo: " + _file + " " + " index del explorador: " + _galleryControlsRPC._fileExplorerIndex + " e indes de reproduccion " + _filePlayIndex );
Debug.Log( "Es Foto" );
}
}
public void SendRpcSetPlayVideo( int serverOption )
{
if ( isServer )
{
RpcSetPlayVideo( serverOption );
}
SetPlayVideo( serverOption );
}
[ClientRpc]
public void RpcSetPlayVideo( int rpcOption )
{
SetPlayVideo( rpcOption );
}
//Metodo que manda a reproducir video por red
public void SetPlayVideo( int option )
{
_loadVideoFileScript.LoadVideo( _filePlayIndex );
}
//Metodo que manda a reproducir video por red
public void PlayPhoto( int option )
{
_loadPhotoFileScript.PhotoLoader( _filePlayIndex );
}
public void GetFileBrowserComponent()
{
GameObject file = GameObject.FindGameObjectWithTag( "fileExplorer" );
_fileBrowserScript = file.GetComponent<FileBrowser>();
}
Класс 2:
public GameObject _photoSphere;
public GameObject _videoSphere;
public TextMeshProUGUI[] _buttonFileName;
//Botones para la interfaz, agregar, borrar y plays
public Button[] _addFile;
public Button[] _deleteFile;
public Button[] _playFile;
//Iconos para los archivos
public SVGImage[] _photoIcon;
public SVGImage[] _videoIcon;
#region Metodos para inicializacion
private void Start()
{
AddFileListenerOnClick();
DeleteFileListenerOnClick();
PlayFilesOnClick();
}
#endregion
#region Metodos para botones
//Asiganamos metodo para abrir el explorador de archivo al Metodo OnClick _addFile basandonos en el index seleccionado
public void AddFileListenerOnClick()
{
for ( int i = 0; i < _addFile.Length; i++ )
{
int tempInt = i + 0;
_addFile[i].onClick.AddListener( () => _vRMEDExplorerScript.OpenFileBrowser( tempInt ) );
}
}
public void DeleteFileListenerOnClick()
{
for (int i = 0; i < _addFile.Length; i++)
{
int tempInt = i + 0;
//_deleteFile[i].onClick.AddListener(() => _galleryControlsRPC.DeleteFileName(tempInt));
}
}
//Asiganamos metodo para reproducir archivo al Metodo OnClick de PlayFliesOnClick basandonos en el index seleccionado
public void PlayFilesOnClick()
{
for (int i = 0; i < _playFile.Length; i++)
{
int tempInt = i + 1;
_playFile[i].onClick.AddListener(() => PlayFile(tempInt));
}
}
//Metodo que manda la instruccion de reproducir
public void PlayFile(int playIndex)
{
var video = Array.FindIndex(_loadVideoFileScript._videoFiles, row => row.Contains(".mp4"));
var photo = Array.FindIndex(_loadPhotoFileScript._photoFiles, row => row.Contains(".jpg"));
if (_galleryControlsRPC.isVideo == true)
{
for (int i = 0; i < _loadVideoFileScript._videoFiles.Length; i++)
{
if (video == i)
{
VideoReady(playIndex);
}
}
}
else if (_galleryControlsRPC.isPhoto == true)
{
for (int i = 0; i < _loadPhotoFileScript._photoFiles.Length; i++)
{
if (photo == i)
{
PhotoReady(playIndex);
}
}
}
}
private void VideoReady(int videoReadyIndex)
{
_galleryControlsRPC._filePlayIndex = videoReadyIndex;
_galleryControlsRPC.SendRpcSetPlayVideo(_galleryControlsRPC._filePlayIndex);
_photoSphere.SetActive(false);
_videoSphere.SetActive(true);
}
private void PhotoReady(int photoReadyIndex)
{
_galleryControlsRPC._filePlayIndex = photoReadyIndex;
_galleryControlsRPC.PlayPhoto(_galleryControlsRPC._filePlayIndex);
_ClassPlayer._VRMEDPlayer.CloseVideo();
_photoSphere.SetActive(true);
_videoSphere.SetActive(false);
}
//Este metodo se encarga de buscar en la lista principal los archivos con extencion
//.jpg y mp4 para almacenarlos en sus respectivas listas
public void AddFileToPlay()
{
if (_loadVideoFileScript._videoFiles[_galleryControlsRPC._fileExplorerIndex].Contains(".mp4"))
{
for (int i = 0; i < _loadVideoFileScript._videoFiles.Length; i++)
{
_videoIcon[_galleryControlsRPC._fileExplorerIndex].enabled = true;
_photoIcon[_galleryControlsRPC._fileExplorerIndex].enabled = false;
}
}
else if (_loadPhotoFileScript._photoFiles[_galleryControlsRPC._fileExplorerIndex].Contains(".jpg"))
{
for (int i = 0; i < _loadPhotoFileScript._photoFiles.Length; i++)
{
_videoIcon[_galleryControlsRPC._fileExplorerIndex].enabled = false;
_photoIcon[_galleryControlsRPC._fileExplorerIndex].enabled = true;
}
}
//_result = _photoFiles.ToList().Concat(_videoFiles.ToList()).ToArray();
}
Класс 3:
public GameObject _fileExplorer;
public GameObject _destroyExplorer;
public Button _submitButton;
public Button _cancelButton;
#region Metodos para Exporador de archivos
//Metodo que se encarga de inicializar los metodos de instanciado del
//explorador, obtener los botones "OK" y "Cancel" del explorador.
//Tambien hace un seguimiendo del boton seleccionado basandose de un index
//y busca el ta "fileExplorer" para mas adelante poder destruirlo
public void OpenFileBrowser(int buttonIndex)
{
Debug.Log("Boton de explorador = " + buttonIndex);
InstantiateExplorer(buttonIndex);
GetButtonExplorer();
_galleryControlsRPC._fileExplorerIndex = buttonIndex;
_destroyExplorer = GameObject.FindGameObjectWithTag("fileExplorer");
GetFileBrowserComponent();
_galleryControlsRPC.GetFileBrowserComponent();
_fileBrowserScript.GetScripts();
}
//Obtenermos los botones "OK" y "Cancelar" en base a su nombre de tag
//y se les agrega el metodo que destruira el explorador
public void GetButtonExplorer()
{
//Obtenermos el boton cancelar
GameObject getCancelButton = GameObject.FindGameObjectWithTag("buttonCancel");
_cancelButton = getCancelButton.GetComponent<Button>();
if ( _disableButtons )
{
_cancelButton.onClick.AddListener(() => StartCoroutine(ExplorerDestroy()));
_cancelButton.onClick.AddListener(() => _disableButtons.EnableDeleteButton(_galleryControlsRPC._fileExplorerIndex));
}
//Obtenemos el boton aceptar
GameObject getSubmitButton = GameObject.FindGameObjectWithTag("buttonOk");
_submitButton = getSubmitButton.GetComponent<Button>();
if (_galleryControlsRPC && _disableButtons && _galleryControlsScript )
{
_submitButton.onClick.AddListener(() => _galleryControlsRPC.SendRpcSetFileName(_galleryControlsRPC._fileExplorerIndex));
_submitButton.onClick.AddListener(() => StartCoroutine(ExplorerDestroy()));
_submitButton.onClick.AddListener(() => _disableButtons.DisableAddButton(_galleryControlsRPC._fileExplorerIndex));
_submitButton.onClick.AddListener(() => _galleryControlsScript.AddFileToPlay());
}
}
//Metodo que destruye el explorador
public IEnumerator ExplorerDestroy()
{
yield return new WaitForSeconds(0.01f);
DestroyImmediate(_destroyExplorer);
}
//Metodo que crea una instancia del explorador de archivos
private void InstantiateExplorer(int index)
{
GameObject goElement = (GameObject)Instantiate(_fileExplorer);
goElement.transform.localScale = new Vector3(1, 1, 1);
goElement.name = "FileBrowser_" + index;
}
//Buscamos el explorador de archivos por su nombre de tag
public void GetFileBrowserComponent()
{
GameObject file = GameObject.FindGameObjectWithTag("fileExplorer");
_fileBrowserScript = file.GetComponent<FileBrowser>();
}
#endregion