• UNITY3D中調(diào)用winform文件選擇框選擇路徑和文件名方法

    2023/3/31??????點(diǎn)擊:

    UNITY3D中設(shè)置文件選擇框的范例:


    using OpenWinForm = System.Windows.Forms;
    在unity3d中,使用FileDialog應(yīng)該把System.Windows.Forms.dll拷貝到unity工程的plugins目錄,
    并且把Player Setting中Other Settings下的api compatibility Level改為.NET2.0。要不無法編譯通過。
    //比如unity3d要讓用戶選擇某個(gè)音樂文件播放;
    private void SelectMusic(){
            OpenWinForm.OpenFileDialog op = new OpenWinForm.OpenFileDialog();
            op.Title = "音樂";
            op.Filter = "音頻文件(*.wiseglove;*.ogg)|*.wiseglove;*.ogg";
            if (op.ShowDialog() == OpenWinForm.DialogResult.OK || op.ShowDialog() == OpenWinForm.DialogResult.Yes)
            {
                string selectName = op.FileName;
                customBgmPath.text = selectName;
    
                string path = customBgmPath.text;      
                WWW www = new WWW("file://"+path);
                if(www.audioClip){
                    AudioClip clip = www.audioClip;
                    AudioPlayCtr.instance.ChangeBgMusic(clip);
                }
            }
            else {
                return;
            }
        }
        //自定義文件保存文件夾;
        private void SaveCutScreenPath()
        {
            OpenWinForm.FolderBrowserDialog fb = new OpenWinForm.FolderBrowserDialog();
            fb.ShowNewFolderButton = true;
            fb.RootFolder = Environment.SpecialFolder.MyDocuments;
            fb.SelectedPath = "C:";
            fb.Description = "請選擇截圖保存目錄";
            fb.RootFolder = Environment.SpecialFolder.MyDocuments;
            if (fb.ShowDialog() == OpenWinForm.DialogResult.OK || fb.ShowDialog() == OpenWinForm.DialogResult.Yes)
            {
                string selectName = fb.SelectedPath;
                customCutScreenPath.text = selectName;
            }
            else {
                return;
            }
        }
    
    //比如unity3d截圖后,彈出對話框用戶選擇保存路徑;
    public IEnumerator CutScreent() {
            int width = Screen.width;
            int height = Screen.height;
            yield return new WaitForEndOfFrame(); 
            Texture2D tex = new Texture2D(width, height, TextureFormat.RGB24, false);//設(shè)置Texture2D
            tex.ReadPixels(new Rect(0, 0, width, height), 0, 0);//獲取Pixels           
            tex.Apply();//應(yīng)用改變
            byte[] bytes = tex.EncodeToPNG();//轉(zhuǎn)換為byte[]
            Destroy(tex);
    
            OpenWinForm.SaveFileDialog saveFileDialog = new OpenWinForm.SaveFileDialog();
            saveFileDialog.Filter = "圖像文件(*.png)|*.png";
            saveFileDialog.FilterIndex = 2;
            saveFileDialog.RestoreDirectory = true;
            if (saveFileDialog.ShowDialog() == OpenWinForm.DialogResult.OK)
            {
                string fName = saveFileDialog.FileName;
                Stream flstr = new FileStream(fName, FileMode.Create);//文件操作
                BinaryWriter sw = new BinaryWriter(flstr, System.Text.Encoding.Unicode);
                sw.Write(bytes);
                sw.Close();
                flstr.Close();
            }
        }


    不忙啊, 調(diào)用winform還有個(gè)坑, 得注冊組件才不會(huì)出現(xiàn) oop, could not register... 等等文字

        /* 注冊winform對話框*/
        #region winform
        private System.Threading.Thread CloseOops;
        private bool ThreadRunning = true;
        private void OopsWindowsThreadStart()
        {
            CloseOops = new System.Threading.Thread(ClearOopsWindows) { IsBackground = true };
            ThreadRunning = true;
            CloseOops.Start();
        }
        private void ClearOopsWindows()
        {
            while (ThreadRunning)
            {
                FindAndCloseWindow();
            }
        }
    
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
    
        public const int WM_SYSCOMMAND = 0x0112;
        public const int SC_CLOSE = 0xF060;
    
        public static void FindAndCloseWindow()
        {
            IntPtr lHwnd = FindWindow(null, "Oops");
            if (lHwnd != IntPtr.Zero)
            {
                SendMessage(lHwnd, WM_SYSCOMMAND, SC_CLOSE, 0);
            }
        }
        #endregion

    記得在腳本程序的 start()函數(shù)里調(diào)用下  OopsWindowsThreadStart(), 到此較好呈現(xiàn)winform對話框。