Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
using System;
using System.ComponentModel;
using System.IO;
using System.Net;
using UnityEditor;
using UnityEngine;
public sealed class FileDownloadWindow : EditorWindow
{
private string m_address ;
private UnityEngine.Object m_folder ;
private bool m_isDownloading ;
[MenuItem( "Window/File Download Window" )]
private static void Init()
{
var win = GetWindow<FileDownloadWindow>();
win.minSize = win.maxSize = new Vector2( 320, 80 );
}
private void OnGUI()
{
GUI.enabled = !m_isDownloading;
EditorGUIUtility.labelWidth = 50;
m_address = EditorGUILayout.TextField( "URL", m_address );
EditorGUI.BeginChangeCheck();
var folder = EditorGUILayout.ObjectField( "Folder", m_folder, typeof( UnityEngine.Object ), false );
if ( EditorGUI.EndChangeCheck() )
{
if ( folder != null )
{
var path = AssetDatabase.GetAssetPath( folder );
var attr = File.GetAttributes( path );
if ( ( attr & FileAttributes.Directory ) != 0 )
{
m_folder = folder;
}
}
else
{
m_folder = null;
}
}
EditorGUIUtility.labelWidth = 0;
GUI.enabled = !m_isDownloading && !string.IsNullOrEmpty( m_address ) && m_folder != null;
if ( GUILayout.Button( "Download" ) )
{
Download();
}
GUI.enabled = true;
}
private void Download()
{
var wc = new WebClient();
var address = new Uri( m_address );
var filename = Path.GetFileName( m_address );
var directory = AssetDatabase.GetAssetPath( m_folder );
var path = directory + "/" + filename;
wc.DownloadProgressChanged += OnChanged;
wc.DownloadFileCompleted += OnCompleted;
wc.DownloadFileAsync( address, path );
m_isDownloading = true;
}
private void OnChanged( object sender, DownloadProgressChangedEventArgs e )
{
var progress = e.ProgressPercentage / 100f;
var cancel = !EditorUtility.DisplayCancelableProgressBar
(
title : "FileDownloadWindow",
info : m_address,
progress : progress
);
if ( !cancel ) return;
var wc = sender as WebClient;
wc.CancelAsync();
}
private void OnCompleted( object sender, AsyncCompletedEventArgs e )
{
EditorUtility.ClearProgressBar();
AssetDatabase.Refresh();
m_isDownloading = false;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment