Код: Выделить всё
'using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.IO;
using UnityEngine.Networking;
public class OpenFile : MonoBehaviour
{
private string path;
public Image image;
public ImageContainer imageContainer; // Reference to your ScriptableObject
// Specify the folder path for saved sprites
private string savedSpritesFolder = "Assets/loadingImag/";
public void OpenExplorer()
{
#if UNITY_WEBGL
// Call a JavaScript function to trigger file selection
CallJSOpenFileDialog();
#else
path = UnityEditor.EditorUtility.OpenFilePanel("Overwrite With Png", "", "png");
GetImage();
#endif
}
private void CallJSOpenFileDialog()
{
// Call a JavaScript function to open file dialog
Application.ExternalEval("OpenFileDialog()");
}
// JavaScript function to handle file selection
public void OnFileSelected(string filePath)
{
path = filePath;
GetImage();
}
private void Awake()
{
string folderPath = Application.dataPath + "/loadingImag/";
if (Directory.Exists(folderPath))
{
string[] files = Directory.GetFiles(folderPath);
foreach (string file in files)
{
if (File.Exists(file))
{
File.Delete(file);
Debug.Log("Deleted: " + file);
}
}
Debug.Log("All files in loadingImag folder have been deleted.");
}
else
{
Debug.LogWarning("The loadingImag folder does not exist.");
}
}
private void GetImage()
{
if (!string.IsNullOrEmpty(path))
{
StartCoroutine(UpdateImage());
}
}
private IEnumerator UpdateImage()
{
using (UnityWebRequest www = UnityWebRequestTexture.GetTexture("file:///" + path))
{
yield return www.SendWebRequest();
if (www.result == UnityWebRequest.Result.ConnectionError || www.result == UnityWebRequest.Result.ProtocolError)
{
Debug.LogError("Failed to load image: " + www.error);
}
else
{
Texture2D texture = DownloadHandlerTexture.GetContent(www);
// Create a sprite from the texture
Sprite sprite = ConvertTextureToSprite(texture);
// Assign the sprite to the Image component
image.sprite = sprite;
// Save changes to the ImageContainer asset
#if UNITY_EDITOR
UnityEditor.EditorUtility.SetDirty(imageContainer);
UnityEditor.AssetDatabase.SaveAssets();
UnityEditor.AssetDatabase.Refresh();
#endif
// Save the sprite as an asset in the specified folder
ImportTextureAsSprite(texture, savedSpritesFolder + Path.GetFileNameWithoutExtension(path) + ".png");
}
}
}
Sprite ConvertTextureToSprite(Texture2D texture)
{
// Create a sprite from the texture
Rect rect = new Rect(0, 0, texture.width, texture.height);
Sprite sprite = Sprite.Create(texture, rect, new Vector2(0.5f, 0.5f));
return sprite;
}
void ImportTextureAsSprite(Texture2D texture, string assetPath)
{
// Save the texture asset
byte[] bytes = texture.EncodeToPNG();
File.WriteAllBytes(assetPath, bytes);
#if UNITY_EDITOR
UnityEditor.AssetDatabase.Refresh();
// Import the saved texture as a sprite
UnityEditor.TextureImporter importer = UnityEditor.AssetImporter.GetAtPath(assetPath) as UnityEditor.TextureImporter;
importer.textureType = UnityEditor.TextureImporterType.Sprite;
importer.spriteImportMode = UnityEditor.SpriteImportMode.Single;
importer.spritePixelsPerUnit = 100; // Отрегулируйте по мере необходимости
importer.alphaIsTransparency = true;
importer.SaveAndReimport();
#endif
}`
Мне нужна помощь со сценарием Unity, предназначенным для открытия локального файлового менеджера пользователя и позволяющего ему выбрать изображение. Затем выбранное изображение должно отображаться в элементе пользовательского интерфейса изображения на холсте. Кроме того, я стремлюсь импортировать выбранное изображение в виде текстуры в спрайт, поместив его в указанную папку. Важно отметить, что в настоящее время эта функция работает исключительно в среде редактора Unity. Я с нетерпением жду решений, которые расширят эту возможность для автономных сборок EXE или развертываний WebGL. Будем очень признательны за любые идеи или рекомендации по адаптации сценария для этих контекстов.
Я успешно реализовал сценарий Unity, который открывает локальный файловый менеджер и позволяет пользователям выбирать изображение. Затем выбранное изображение отображается в элементе пользовательского интерфейса изображения на холсте, и сценарий импортирует изображение в виде текстуры в спрайт, помещая его в назначенную папку. Однако важно отметить, что эта функциональность в настоящее время ограничена редактором Unity.
Сейчас я изучаю варианты, позволяющие обеспечить беспрепятственную работу этого сценария в автономных сборках EXE или развертываниях WebGL. Я попробовал несколько подходов, но ни один из них пока не дал желаемых результатов. Мне нужны рекомендации или предложения о том, как адаптировать сценарий для этих сред, обеспечив такой же удобный выбор изображений и функциональность отображения.
Источник: https://stackoverflow.com/questions/781 ... le-manager