build-compress-upload-to-ftp

Раздел, посвящённый всему, что связано с программированием для Редактора Юнити. Скрипты Редактора, Wizards и прочее.

build-compress-upload-to-ftp

Сообщение gnoblin 19 авг 2011, 16:16

Editor скрипт:
Выбираем в меню сверху "BuildAndUPLOAD/StandaloneServer",
билдит, архивирует папку с билдом в .zip, заливает на фтп.

Скрипт кладем в папку Editor в проекте,
меняем адрес, логин и пароль для фтп.

К посту приаттачен архив, там длл который кладем в папку Editor/Plugins/ в проекте.

Синтаксис:
Используется csharp
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Net;
using System.IO;

using Ionic.Zip;

public class BuildFacility
{
    [MenuItem("BuildAndUPLOAD/StandaloneServer")]
    public static void MyBuild5()
    {
        Debug.Log("started build: " + System.DateTime.Now +" Please Wait...");
        string[] levels = new string[] { "Assets/scenes/ServerGame.unity" };
        string build_name = "ServerBuild";
        string build_path = "server_autobuilds/";
        //1. билдим
        BuildPipeline.BuildPlayer(levels, "server_autobuilds/"+build_name+".exe", BuildTarget.StandaloneWindows, BuildOptions.None);

        string zip_name = build_name + ".zip";

        //2. архивируем (используем DotNetZip)
        Compress(build_path, zip_name);

        //3. заливаем на сервак
        string fp = Application.dataPath.Substring(0, Application.dataPath.Length - 7) + "/" + zip_name;
        ftpfile("/"+zip_name, fp);

        Debug.Log("finished build: " + System.DateTime.Now);
    }

    static void Compress(string build_path, string zip_name)
    {
        using (ZipFile zip = new ZipFile())
        {
            zip.UseUnicodeAsNecessary = true;  // utf-8
            string uncompressed_file_path = Application.dataPath.Substring(0, Application.dataPath.Length - 7) + "/" + build_path;
            string p = Application.dataPath.Substring(0, Application.dataPath.Length - 7) + "/" + zip_name;

            zip.AddDirectory(uncompressed_file_path);
            zip.Comment = "This zip was created at " + System.DateTime.Now.ToString("G");
            zip.Save(p);
        }
    }

    public static void ftpfile(string ftpfilepath, string inputfilepath)
    {
        string ftphost = "ip";
        string ftpfullpath = "ftp://" + ftphost + ftpfilepath;
        FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(ftpfullpath);
        ftp.Credentials = new NetworkCredential("login", "password");

        ftp.KeepAlive = true;
        ftp.UseBinary = true;
        ftp.Method = WebRequestMethods.Ftp.UploadFile;
        FileStream fs = File.OpenRead(inputfilepath);
        byte[] buffer = new byte[fs.Length];
        fs.Read(buffer, 0, buffer.Length);
        fs.Close();
        Stream ftpstream = ftp.GetRequestStream();
        ftpstream.Write(buffer, 0, buffer.Length);
        ftpstream.Close();
    }  
}
У вас нет доступа для просмотра вложений в этом сообщении.
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: build-compress-upload-to-ftp

Сообщение gnoblin 29 авг 2011, 23:06

Идея: программно читать эдитор лог после билда, писать в консоль список забилденных ассетов с размерами.
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: build-compress-upload-to-ftp

Сообщение gnoblin 03 сен 2011, 19:39

Редактор может козлиться из-за политики безопасности (если билдить и заливать вебплеер) - поэтому на сервере куда будет идти заливка можно запустить
sockpol --all (sockpol это полиси сервер, который поставляется вместе с юнити - лежит в Unity/DataTools/)

Им можно раздавать и файл crossdomain.xml, но у меня с ним что-то не срослось.

Альтернативное решение тут:
http://game.reneos.com/blog/archives/257

Еще более альтернативное решение от Дымка:
сделать консольную утилитку и запускать ее из редактора
sendtoftp.exe c:\test.txt ftp://user:pass@127.0.0.1
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: build-compress-upload-to-ftp

Сообщение gnoblin 03 сен 2011, 19:40

Если редактор говорит 550 permission denied,
значит у ftp-юзера нету прав на write и\или delete.
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: build-compress-upload-to-ftp

Сообщение DbIMok 01 ноя 2013, 21:43

gnoblin писал(а):Идея: программно читать эдитор лог после билда, писать в консоль список забилденных ассетов с размерами.

да, полезная штука для контроля, что попало с какими размерами, сколько в итоге получилось
Синтаксис:
Используется csharp
        /// <summary>
        /// /Users/name/Library/Logs/Unity/Editor.log
        /// C:\Documents and Settings\name\Local Settings\Application Data\Unity\Editor\Editor.log
        /// </summary>
        private static void TestEditorLog(string filename) {
                if (string.IsNullOrEmpty(filename)) return;
                using (FileStream fsSource = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)) {
                        int maxBuffSize = 5000; // десятки-сотни МБ в логе обычное дело, поэтому читаем небольшой кусок из конца
                        long length = fsSource.Length < maxBuffSize ? fsSource.Length : maxBuffSize;
                        byte[] bytes = new byte[length];

                        fsSource.Seek(-length, SeekOrigin.End);
                        int numBytesToRead = (int)length;
                        int numBytesRead = 0;
                        while (numBytesToRead > 0) {
                                int n = fsSource.Read(bytes, numBytesRead, numBytesToRead);
                                if (n == 0) break;
                                numBytesRead += n;
                                numBytesToRead -= n;
                        }
                        numBytesToRead = bytes.Length;
                        fsSource.Dispose();
                        if (numBytesToRead <= 0) return;
                        string result = Encoding.ASCII.GetString(bytes);
                        char[] splitChars = { Convert.ToChar(13), Convert.ToChar(10) };
                        string[] strings = result.Split(splitChars);
                        bool _log = false;
                        result = "";
                        // здесь фильтруем из строк то, что нам нужно
                        foreach (string s in strings) {
                                if (string.IsNullOrEmpty(s)) continue;
                                if (_log && s.StartsWith(" 0")) _log = false;
                                if (s.StartsWith("Level ")) result = s + " | " + result;
                                if (_log ) result += s + " | ";
                                if (s.StartsWith("Used Assets")) _log = true;
                        }
                        if (!string.IsNullOrEmpty(result)) Debug.Log(result);
                }
        }

        private static string GetEditorLogPath() {
                string path = "";
                switch (Application.platform) {
                        case RuntimePlatform.WindowsEditor:
                                path = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\Unity\Editor\Editor.log";
                                break;
                        case RuntimePlatform.OSXEditor:
                                path = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + @"/Library/Logs/Unity/Editor.log";
                                break;
                        default:
                                path = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + path;
                                Debug.LogWarning(Application.platform + ": " + path);
                                break;
                }
                if (!File.Exists(path)) return null;
                return path;
        }

вызов TestEditorLog(GetEditorLogPath());
в моем случае возвращает что-то типа:
Level 0 'C:/Work/Bundler/Assets/Bundles/Desktop/1136x640/DXT5/Loc_001_zoom1.assetbundle' uses 91.6 KB compressed / 0.5 MB uncompressed. | 512.1 kb 95.5% Assets/Scenes/Loc_001_zoom1/atlas0_0.png | 1.7 kb 0.3% Assets/Scenes/Loc_001_zoom1/Loc_001_zoom1.prefab | 1.2 kb 0.2% |

все что больше 1 кБ
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05


Вернуться в Editor

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4