トマシープが学ぶ

Unity/VR/AR/デザイン好きのミーハー 記事内容は自分用のメモです

Unity製PCアプリでの外部からの画像/動画ファイル読み込み機能【Windows・Mac】

Unity製のPCアプリで、画像や動画などのファイルをPCアプリの画面にドラッグしたら、マテリアルやVideoPlayerにセットされて表示できるものを作ろうと思った。

ChatGPTに聞きながらやったけど、ファイルをドラック&ドロップするのはめんどくさそうだったので、ボタンを押したらファイル選択画面が出てきて選択できるようなものにする。

Windows版

Windows版はなんとかできた

以下のようなスクリプトを作って、OpenImageFile()とOpenMovieFile()をそれぞれ別のボタンから呼び出す

using System.Windows.Forms; // System.Windows.Forms.dll をインポートする
using UnityEngine;
using UnityEngine.Video;

public class SetFile : MonoBehaviour
{
    [SerializeField] private GameObject _Image;
    [SerializeField] private VideoPlayer _videoPlayer;

    public void OpenImageFile() // ファイル選択ボタンが押されたときに呼ばれる関数
    {
        OpenFileDialog dialog = new OpenFileDialog(); // ダイアログを作成する
        dialog.Filter = "Image files (*.png;*.jpeg;*.jpg)|*.png;*.jpeg;*.jpg"; // 画像ファイルのみ表示する
        dialog.Title = "画像ファイルを選択してください";
        if (dialog.ShowDialog() == DialogResult.OK) // ダイアログでOKが押されたら
        {
            string filePath = dialog.FileName; // 選択したファイルパスを取得する
            byte[] fileData = System.IO.File.ReadAllBytes(filePath); // ファイルデータをバイト配列として読み込む
            Texture2D texture = new Texture2D(2, 2); // 空のテクスチャを作成する
            texture.LoadImage(fileData); // テクスチャにファイルデータをロードする
            _Image.GetComponent<Renderer>().material.mainTexture = texture; // オブジェクトのマテリアルにテクスチャをセットする
        }
    }

    public void OpenMovieFile() // ファイル選択ボタンが押されたときに呼ばれる関数
    {
        OpenFileDialog dialog = new OpenFileDialog(); // ダイアログを作成する
        dialog.Filter = "Movie files (*.mp4)|*.mp4"; // 動画ファイルのみ表示する
        dialog.Title = "動画ファイルを選択してください";
        //dialog.ShowDialog();
        if (dialog.ShowDialog() == DialogResult.OK) // ダイアログでOKが押されたら
        {
            string filePath = dialog.FileName; // 選択したファイルパスを取得する
            StartCoroutine(PlayVideo(filePath));
        }
    }
    private System.Collections.IEnumerator PlayVideo(string filePath)
    {
        _videoPlayer.source = VideoSource.Url;
        _videoPlayer.url = "file:///" + filePath;
        _videoPlayer.Prepare();

        while (!_videoPlayer.isPrepared)
        {
            yield return new WaitForSeconds(0.1f);
        }

        _videoPlayer.Play();
    }
}

System.Windows.Forms.dllをC:\Program Files\Unity\Editor\Data\Mono\lib\mono\2.0からコピーしてAssts/Pluginsフォルダの下に入れた。

alpacatech.hateblo.jp

Unityを再起動しないとうまく動かなかった気がする。

 

成功したらUnityEditorでもボタンを押したらこういう古めかしいダイアログが出てきてファイルを選んだ読み込める

ちなみにWindowsのファイル読み込みは5年前にもやった。その時も同じような感じだったな~

bibinbaleo.hatenablog.com

Mac

Macでも同じようにファイルを読み込めるようにしたいという要望が出た。

UnityStandaloneFileBrowserというアセットを使う必要があるっぽい

zenn.dev

ここからUnityPackageをダウンロード

github.com

CanvasSampleSceneを開いて実行する

以下の記事にあるように.pngをpngに修正すると画像選択画面が出て、読み込まれた

namiton.hatenablog.jp

 

サンプルスクリプトやChatGPTをもとに、ファイル選択部分を作り替えた。

 

Windowsでは無事動いた。普通のエクスプローラー画面だった。

Macビルド

MacのUnityEditorで動かそうとしたらエラーでファイル選択ができない

こちらの記事をもとに、ありとあらゆるものをIntel 64-bitだけにしたらいけた!

qiita.com

必要だったか分からないけどPluginの中にあるもので、

Intel 64-bitを選べるものは全部そうした。

AppleSiliconのMacで作業してたので、AnyCPUにしないと動かないかと思ったけどそんなことなかった。

Editorでは結局動かなかったけど、Macビルドしたら無事動いた。