2018年5月11日 星期五

Unity內將檔案上傳到FTP

在做專案時有時會需要將檔案上傳到FTP去,像是照片或影片等,所以這邊便記錄一下做法。

我分別遇過需上傳到一般FTP、SFTP和使用主動模式FTP的情況,因此實做過三種方式:FTP的兩種,SFTP和使用主動模式FTP的一種。

這邊只記錄FTP的兩種,第三種有點麻煩,之後有空整理再另外放上來。

使用WebClient的第一種:
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Threading;
using UnityEngine;

public class XXX : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(FTPUpload1());
    }
    
    void Update()
    {

    }
    
    IEnumerator FTPUpload1()
    {
        var filename = "D:/XXX.png";
        bool isUploading = false;

        UnityEngine.Debug.Log("開始!!");

        ThreadPool.QueueUserWorkItem((o) =>
        {
            using (WebClient client = new WebClient())
            {
                client.Credentials = new NetworkCredential("kim", "123");
                client.UploadFile("ftp://127.0.0.1/XXX.png", "STOR", filename);
            }
            isUploading = true;
        });

        while (!isUploading)
        {
            UnityEngine.Debug.Log("上傳中!!");
            yield return new WaitForSeconds(0.1f);
        }

        UnityEngine.Debug.Log("結束!!");
    }
}

使用ftpWebRequest的第二種:
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Threading;
using UnityEngine;

public class XXX : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(FTPUpload2());
    }
    
    void Update()
    {

    }
    
    IEnumerator FTPUpload2()
    {
        var filename = "D:/XXX.png";
        bool isUploading = false;

        UnityEngine.Debug.Log("開始!!");

        ThreadPool.QueueUserWorkItem((o) =>
        {
            FtpWebRequest ftpWebRequest = (FtpWebRequest)WebRequest.Create("ftp://127.0.0.1/XXX.png");

            ftpWebRequest.Method = WebRequestMethods.Ftp.UploadFile;
            ftpWebRequest.Credentials = new NetworkCredential("kim", "123");
            ftpWebRequest.UsePassive = true;
            ftpWebRequest.UseBinary = true;
            ftpWebRequest.KeepAlive = true;

            StreamReader sourceStream = new StreamReader(filename);
            byte[] fileBytes = File.ReadAllBytes(filename);
            sourceStream.Close();
            ftpWebRequest.ContentLength = fileBytes.Length;

            Stream requestStream = ftpWebRequest.GetRequestStream();
            requestStream.Write(fileBytes, 0, fileBytes.Length);
            requestStream.Close();

            FtpWebResponse ftpWebResponse = (FtpWebResponse)ftpWebRequest.GetResponse();
            ftpWebResponse.Close();

            isUploading = true;
        });

        while (!isUploading)
        {
            UnityEngine.Debug.Log("上傳中!!");
            yield return new WaitForSeconds(0.1f);
        }

        UnityEngine.Debug.Log("結束!!");
    }
}

2018年2月22日 星期四

Unity內使用Tab切換輸入框的方式

話說我之前有個案子要求可以使用Tab來切換到其他輸入框,如果是Windows程式或是網頁,根本不用為此花功夫;但是Unity就沒這種天經地義的功能了,只好來動手寫一個試看看。

先確立觀念是當按下Tab時,便讓Unity去Focus到某一個介面上,如果先前已點在某一個介面上,便要像是順理成章般地到下一個介面去。

因此做了個簡單的介面:

然後在程式一開始時便Focus在帳號輸入框上,接著按Tab便可在兩個輸入框內不斷切換:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class XXX : MonoBehaviour {

    private GameObject account;
    private GameObject password;

    void Start ()
    {
        account = GameObject.Find("Account");
        password = GameObject.Find("Password");

        EventSystem.current.SetSelectedGameObject(account);
    }

    void Update ()
    {
        if (Input.GetKeyDown(KeyCode.Tab))
        {
            if (EventSystem.current.currentSelectedGameObject == account)
            {
                EventSystem.current.SetSelectedGameObject(password);
            }
            else if (EventSystem.current.currentSelectedGameObject == password)
            {
                EventSystem.current.SetSelectedGameObject(account);
            }
        }
    }
}


所以其實很單純,使用兩個API來取得當前Focus的GUI、和設定想Focus的GUI就好了。

EventSystem.current.currentSelectedGameObject可取得當前Focus的GUI。
EventSystem.current.SetSelectedGameObject()可設定想Focus的GUI。

用這方式可以再配合一個List來做出在複雜輸入介面上輕鬆切換的效果,我想可能有更好的觀念和寫法吧,但我自己是喜歡這個很直觀又方便修改的架構。