遇到一个需求是在Unity3D做编辑器工具时需要把生成的AssetBundle包上传到资源服务器,资源服务器用的Linux。

实现分为三部分:1,C#上传工具类;2,WinSCP脚本;3,传参调用使用上传功能。

1,C#上传工具类

using UnityEngine;using System.Collections;using System.IO;using System;using System.Diagnostics;public class UploadHelper{    public static void callUploadProcess(string arguments)    {        string winScpPath = Directory.GetParent(Application.dataPath) + "/WinSCP/WinSCP.exe";        try        {            Process proc = null;            bool redirectOutput = false;            proc = new Process();            proc.StartInfo.FileName = winScpPath;            proc.StartInfo.Arguments = arguments;            if (redirectOutput)            {                proc.StartInfo.UseShellExecute = false;                proc.StartInfo.RedirectStandardOutput = true;                proc.StartInfo.CreateNoWindow = true;            }            else            {                proc.StartInfo.CreateNoWindow = false;            }            proc.Start();            if (redirectOutput)            {                //重定向,显示上传工具输出                StreamReader sr = proc.StandardOutput;                while (!sr.EndOfStream)                {                    string s = sr.ReadLine();                    UnityEngine.Debug.Log(s);                }            }            proc.WaitForExit();            if (proc.ExitCode == 0)            {                UnityEngine.Debug.LogFormat("[{0}] 上传完毕!", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));            }            else            {                UnityEngine.Debug.LogFormat("[{0}] 上传失败! ExitCode:{1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), proc.ExitCode);            }        }        catch (Exception ex)        {            UnityEngine.Debug.LogError(String.Format("Exception Occurred :{0},{1}", ex.Message, ex.StackTrace.ToString()));        }    }}

2,WinSCP脚本,

UploadAssetBundles.script
option echo offoption batch onoption confirm offopen scp://"%1%":"%2%"@"%3%"option transfer binarysynchronize remote -mirror -delete %4% %5%chmod 755 %5%/*closeexit

3,C#程序内传参调用实现上传功能

private static void UploadToServer(BuildTarget target)    {        string remoteFolder = null;//远程服务器资源所在路径        switch (target)        {            case BuildTarget.StandaloneWindows64:                remoteFolder = "###/AssetBundle/PC";                break;            case BuildTarget.Android:                remoteFolder = "###/AssetBundle/Android";                break;            case BuildTarget.iOS:                remoteFolder = "###/AssetBundle/iOS";                break;            default:                return;        }        string uploaderPath = Application.dataPath + "/Uploader";        //脚本路径        string scriptPath = uploaderPath + "/UploadAssetBundles.script";        //Log路径        string logPath = Directory.GetParent(Application.dataPath) + "/upload.log";        string localFolder = Application.dataPath + "/ABs";//本地资源目录路径        string[] param ={                "test",//远程服务器登录用户名                "test1234",//远程服务器登录密码                                "192.168.1.xxx",//远程服务器IP或域名                                localFolder,                remoteFolder,                scriptPath,                logPath,            };        string arguments = String.Format("/console /log={6} /script={5} /parameter \"{0}\" \"{1}\" \"{2}\" \"{3}\" \"{4}\"", param);        UploadHelper.callUploadProcess(arguments);    }

arguments最后的

/parameter \"{0}\" \"{1}\" \"{2}\" \"{3}\" \"{4}\""

是传给WinSCP脚本的参数,对应脚本里的“%1%”到“%5%”.

关于WinSCP命令行调用说明可以查看官网。

WinSCP可以在这下载:。