Autoincrement Build Number for WebPlayer

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

Autoincrement Build Number for WebPlayer

Сообщение DbIMok 22 апр 2015, 00:40

Чего обычно хочется при работе с вебом? Правильного кэширования билда и контроля его версии. Как обычно борются с кэшированием? Добавляют в html параметр, например build.unity3d?0.0.1 Чтобы не обновлять его каждый раз вручную, проделаем следующее:

1. создадим в проекте папку WebPlayerTemplates и скопируем в нее один из дефолтных шаблонов, например %UNITY%\Data\Resources\WebPlayerTemplates\Default и переименуем его, например, в Test

2. отредактируем index.html, добавив кастомный тэг в строчку
u.initPlugin(jQuery("#unityPlayer")[0], "%UNITY_WEB_PATH%?%UNITY_CUSTOM_BUILD%");

3. теперь открываем Edit > Project Settings > Player, выбираем наш шаблон и записываем с поле Build наш номер версии, например, 0.0.1
Изображение

4. теперь сделаем так, чтобы после каждого билда его номер (последняя цифра независимо от их количества) автоматически увеличивался, добавим следующий скрипт в папку Editor.
Синтаксис:
Используется csharp
using System;
using UnityEditor;
using UnityEditor.Callbacks;
using Debug = UnityEngine.Debug;

public class WebBuiladAutoInc {

        [MenuItem("Tools/Inc Build Num")]
        static void BuildIncNum() {
                SerializedObject serializedObject = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/ProjectSettings.asset")[0]);
                SerializedProperty customTags = serializedObject.FindProperty("m_TemplateCustomTags");
                SerializedProperty data;
                for (int i = 0; i < customTags.arraySize; i++) {
                        data = customTags.GetArrayElementAtIndex(i);
                        if (data.FindPropertyRelative("first").stringValue == "BUILD") {
                                SerializedProperty build = data.FindPropertyRelative("second");
                                string value = IncLastNum(build.stringValue);
                                Debug.Log(string.Format("Build: {0} > {1}", build.stringValue, value));
                                build.stringValue = value;
                                break;
                        }
                }
                serializedObject.ApplyModifiedProperties();
        }

        [PostProcessBuild]
        private static void BuildIncNum(BuildTarget target, string pathToBuildProject) {
                EditorApplication.update += OnEditorUpdate;
        }

        public static void OnEditorUpdate() {
                        EditorApplication.update -= OnEditorUpdate;
                        BuildIncNum();
        }

        private static string IncLastNum(string source) {
                string[] parts = source.Split('.');
                string last = parts[parts.Length - 1];
                string result = "";
                int num;
                if (Int32.TryParse(last, out num)) {
                        for (int i = 0; i < parts.Length - 1; i++) {
                                result += parts[i] + ".";
                        }
                        return result + (num + 1);
                }
                return source;
        }
}


5. осталось вывести номер билда в GUI
Синтаксис:
Используется csharp
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif

public class ShowBuildNum : MonoBehaviour {
        private Rect rect = new Rect(5f, 5f, 40f, 20f);
        [SerializeField]
        private string version = "";

        void Start() {
#if UNITY_EDITOR
                version = GetBuildNum();
#else
                version = Application.absoluteURL.Split('?')[1];
#endif         
        }

#if UNITY_EDITOR
        static string GetBuildNum() {
                SerializedObject serializedObject = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/ProjectSettings.asset")[0]);
                SerializedProperty customTags = serializedObject.FindProperty("m_TemplateCustomTags");
                SerializedProperty data;
                for (int i = 0; i < customTags.arraySize; i++) {
                        data = customTags.GetArrayElementAtIndex(i);
                        if (data.FindPropertyRelative("first").stringValue == "BUILD") {
                                SerializedProperty build = data.FindPropertyRelative("second");
                                return build.stringValue;
                        }
                }
                return "";
        }
#endif
        void OnGUI() {
                GUI.Label(rect, version);
        }
}
 

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

Re: Autoincrement Build Number for WebPlayer

Сообщение gnoblin 22 апр 2015, 01:25

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

Re: Autoincrement Build Number for WebPlayer

Сообщение DbIMok 22 апр 2015, 01:37

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


Вернуться в Editor

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

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