在 Windows 和 Mac 上运行时加载纹理

Load texture on runtime on Windows and Mac

我目前正在使用 NativeGallery 资产在运行时为 iOS 和 Android 更改一些纹理。该资产基本上会打开文件资源管理器,让您从手机图库中选择一个图像文件并将其加载到应用程序中。

因此使用的代码是:

public class DisplayHandler : MonoBehaviour
{
    public GameObject Display;

    public void PickImage(int maxSize)
    {
        NativeGallery.Permission permission = NativeGallery.GetImageFromGallery((path) =>
        {
            Debug.Log("Image path: " + path);
            if (path != null)
            {
                // Create Texture from selected image
                Texture2D texture = NativeGallery.LoadImageAtPath(path, maxSize);
                if (texture == null)
                {
                    Debug.Log("Couldn't load texture from " + path);
                    return;
                }

                Material material = Display.GetComponent<Renderer>().material;
                if (!material.shader.isSupported) // happens when Standard shader is not included in the build
                    material.shader = Shader.Find("Legacy Shaders/Diffuse");

                material.mainTexture = texture;

                // If a procedural texture is not destroyed manually, 
                // it will only be freed after a scene change
                //Destroy(texture, 5f);
            }
        }); // , "Wählen Sie ein Bild aus", mime: "image/*" );

        Debug.Log("Permission result: " + permission);
    }
}

Windows 和 Mac 是否有可能获得相同的行为?例如,单击按钮会打开 explorer/finder window,您可以在其中选择图像文件。 HTML 相当于

#if UNITY_EDITOR_WIN
        public void ShowExplorer(string itemPath)
        {
            itemPath = itemPath.Replace(@"/", @"\");   // explorer doesn't like front slashes
            System.Diagnostics.Process.Start("explorer.exe", "/select," + itemPath);
        }
#endif

#if UNITY_EDITOR_OSX
    public void ShowExplorer(string itemPath) {
         var path = Path.Combine(Application.dataPath, "Resources");
         var file = Directory.EnumerateFiles(path).FirstOrDefault();
         if (!string.IsNullOrEmpty(file))
             EditorUtility.RevealInFinder(Path.Combine(path, file));
         else
             EditorUtility.RevealInFinder(path);
         }
#endif

在 Windows 上打开资源管理器 window,在 Mac 上打开 Finder,但作为单独的 window,而不是作为从中选择纹理的对话框。

如果有人对解决方案感兴趣: 我使用了 https://github.com/gkngkc/UnityStandaloneFileBrowser 并像这样修改了脚本:

using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using SFB;

[RequireComponent(typeof(Button))]
public class CanvasSampleOpenFileImage : MonoBehaviour, IPointerDownHandler
{
    public GameObject output;

#if UNITY_WEBGL && !UNITY_EDITOR
    //
    // WebGL
    //
    [DllImport("__Internal")]
    private static extern void UploadFile(string gameObjectName, string methodName, string filter, bool multiple);

    public void OnPointerDown(PointerEventData eventData) {
        UploadFile(gameObject.name, "OnFileUpload", ".png, .jpg", false);
    }

    // Called from browser
    public void OnFileUpload(string url) {
        StartCoroutine(OutputRoutine(url));
    }
#else
    //
    // Standalone platforms & editor
    //
    public void OnPointerDown(PointerEventData eventData) { }

    void Start()
    {
        var button = GetComponent<Button>();
        button.onClick.AddListener(OnClick);
    }

    private void OnClick()
    {
        var extensions = new[] {
            new ExtensionFilter("Image Files", "png", "jpg", "jpeg" )
        };
        var paths = StandaloneFileBrowser.OpenFilePanel("Title", "", extensions, false);
        if (paths.Length > 0)
        {
            StartCoroutine(OutputRoutine(new System.Uri(paths[0]).AbsoluteUri));
        }
    }
#endif

    private IEnumerator OutputRoutine(string url)
    {
        var loader = new WWW(url);
        yield return loader;
        output.GetComponent<Renderer>().material.mainTexture = loader.texture;
        output.GetComponent<Renderer>().material.mainTextureScale = new Vector2(-1, -1);
    }
}

只需将一个游戏对象附加到脚本或使用 GameObject.Find 定义一个游戏对象,纹理将在运行时随着从您计算机的任意位置选择的图片而改变。