После билда проект ведет себя не так как в среде

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

После билда проект ведет себя не так как в среде

Сообщение Summerscream 19 авг 2011, 22:51

Приветствую.
Друзья, имеется весьма странная проблема, бьющая кирпичем по лицу.
Есть 3 файла со скриптами. В юнити при пробном запуске все работает как надо. Логика выполняется безукоризненно от начала и до конца. Но вот беда - если это дело сбилдить и запустить, то ничего не происходит. Картинка стоит, скрипты не действуют. Я уж и по колесам стучал, и в капот заглядывал, и даж креститься пробовал - ничего не помогает. В среде все работает, а в сбилденном состоянии - нет.

Если в кратце о внутренностях:
Скрипты по тегу ищут такие же объекты как и те, к которым они привязаны, далее чекают расстояние и либо просто убиваются, либо убиваются и создают на своем месте другой объект из префаба.
Изначально все объекты в сцене выставлены так, чтобы объекты нашли друг друга и сразу заменились на нужный объект, то есть я поставил 2 объекта друг на друга. Если я делаю пробный запуск в среде, то все работает, объекты моментально исчезают, найдя друг друга и на их месте появляется другой нужный мне объект из префаба. Но вот в конечном билде такого не происходит, картинка стоит.
Честно признаюсь, раньше по тегу объекты искать не пробовал, может тут есть какая-о тонкость.

Прошу помощи бывалых шаманов или может психиатров, я уже склонен начать верить в демонов...
Последний раз редактировалось Summerscream 19 авг 2011, 23:12, всего редактировалось 1 раз.
Summerscream
UNIт
 
Сообщения: 62
Зарегистрирован: 01 фев 2011, 00:34
Откуда: msc

Re: После билда проект ведет себя не так как в среде

Сообщение raul82 19 авг 2011, 23:03

сцену в билд добавлял?
5 годиков 7 месяцев
Аватара пользователя
raul82
Старожил
 
Сообщения: 506
Зарегистрирован: 21 янв 2011, 17:48
Откуда: Алматы

Re: После билда проект ведет себя не так как в среде

Сообщение Summerscream 19 авг 2011, 23:12

сцену в билд добавлял?

Разумеется, ее при запуске вполне себе даже видно.
Возможно я не совсем верно описал проблему. Стартовая часть работает. У меня там в начале скрипт расставляет стартовые объекты. Не работает именно та часть где объекты ищутся по тегам, она начинает свою работу сразу после стартового скрипта на каждом из расставленных объектов.
Возможно код наведет на мысль:
Синтаксис:
Используется javascript

private var ClosestBirthplace : GameObject;
private var dist : float;

var BirthplaceColliderPrefab : GameObject;

function FindClosestBirhtplace (TagToChange, TagToFind) : GameObject  //функция поиска ближайшего объекта с тегом
{
        gameObject.tag = TagToChange;
    var gos : GameObject[];
    gos = GameObject.FindGameObjectsWithTag(TagToFind);
    var closest : GameObject;
    var distance = Mathf.Infinity;
    var position = transform.position;
    for (var go : GameObject in gos)  {
        var diff = (go.transform.position - position);
        var curDistance = diff.sqrMagnitude;
        if (curDistance < distance) {
            closest = go;
                        dist = curDistance;
            distance = curDistance;
        }
    }
        gameObject.tag = TagToFind;
        return closest;
}

function BirthPlaceColliderSearch()
{
        if (ClosestBirthplace == 0) ClosestBirthplace = FindClosestBirhtplace("Finish", "BirthPointCollider"); //если еще не находили объект с нашим тегом ищем и записываем этот объект в переменную

        if (ClosestBirthplace != null && dist >= 0.15f) ClosestBirthplace = null; //если нашли ближайшего, но он слишком далеко - сбрасываем переменную хранения найденного ближайшего
       
        if (ClosestBirthplace != null && dist < 0.15f) //если переменная под ближайший объект с тегом не пуста и дистанция до него соответствует требованиям
        {
                var BirthplaceColliderTrue : GameObject;
                BirthplaceColliderTrue = Instantiate(BirthplaceColliderPrefab); //создаем коллидер для будущего юнита
                BirthplaceColliderTrue.transform.position = Vector3(gameObject.transform.position.x, gameObject.transform.position.y, gameObject.transform.position.z); //ставим его на место объекта под коллидер
                BirthplaceColliderTrue.transform.parent = gameObject.transform.parent; //делаем его детем юнита
                Destroy(ClosestBirthplace); //убиваем объект под коллидер
                Destroy(gameObject); //и второй тоже убиваем
        }              
}


function FixedUpdate ()
{
        BirthPlaceColliderSearch();
}
 
Summerscream
UNIт
 
Сообщения: 62
Зарегистрирован: 01 фев 2011, 00:34
Откуда: msc

Re: После билда проект ведет себя не так как в среде

Сообщение Zaicheg 19 авг 2011, 23:34

Вам нужно проверить логи плеера на предмет ошибок.
http://unity3d.com/support/documentatio ... Files.html

Комбинирование JS и C# в проекте есть? Оно иногда вызывает всякие непонятные штуки.
Разница в работе веб- и стандалон-сборки есть?
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: После билда проект ведет себя не так как в среде

Сообщение Summerscream 19 авг 2011, 23:46

Вам нужно проверить логи плеера на предмет ошибок.
http://unity3d.com/support/documentatio ... Files.html

Первым делом полез в логи, там все чисто.

Комбинирование JS и C# в проекте есть?

Нет, в проекте только JS.

Разница в работе веб- и стандалон-сборки есть?

Никакой.

Есть один момент, который возможно как-то мог повлиять на работоспособность проекта, а именно: дома я открываю его в Pro версии, а на работе в Trial. Помимо этого синхронизирую я все это добро через систему контроля версий, а она не очень хорошо переносит постоянное движение Temp файлов Unity.
Summerscream
UNIт
 
Сообщения: 62
Зарегистрирован: 01 фев 2011, 00:34
Откуда: msc

Re: После билда проект ведет себя не так как в среде

Сообщение Zaicheg 19 авг 2011, 23:54

Систему контроля версий из цепочки конечно надо исключить. То есть, проверить работоспособность в редакторе, собрать, посмотреть работоспособость в сборке.
И надо делать print() где только можно и смотреть их результаты в логах сборки, искать отклонения от этих же принтов в редакторе. Значения переменных, возвращаемые методами значения, принты-сигналы об успешном вызове метода и т. д.
Можно проект сюда выложить, чтобы проверить воспроизводимость проблемы.
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: После билда проект ведет себя не так как в среде

Сообщение Summerscream 20 авг 2011, 00:09

Систему контроля версий из цепочки конечно надо исключить. То есть, проверить работоспособность в редакторе, собрать, посмотреть работоспособость в сборке.

Скопировал проект отдельно, запустил, сбилдил - все тоже самое.

И надо делать print() где только можно и смотреть их результаты в логах сборки, искать отклонения от этих же принтов в редакторе. Значения переменных, возвращаемые методами значения, принты-сигналы об успешном вызове метода и т. д.

Ух, с трудом представляю как это делается, но если уж совсем без вариантов - разберусь

Можно проект сюда выложить, чтобы проверить воспроизводимость проблемы.

Добавил к посту.
У вас нет доступа для просмотра вложений в этом сообщении.
Summerscream
UNIт
 
Сообщения: 62
Зарегистрирован: 01 фев 2011, 00:34
Откуда: msc

Re: После билда проект ведет себя не так как в среде

Сообщение Summerscream 20 авг 2011, 09:20

Поэкспериментировал со своими старыми проектами. Они билдятся и работают нормально. Видимо проблемой является именно блок кода, отвечающий за поиск объекта по тегу, ибо такую штуку в этом прокте я использовал первый раз в жизни.
Синтаксис:
Используется javascript
function FindClosestBirhtplace (TagToChange, TagToFind) : GameObject  //функция поиска ближайшего объекта с тегом
{
         gameObject.tag = TagToChange;
     var gos : GameObject[];
     gos = GameObject.FindGameObjectsWithTag(TagToFind);
     var closest : GameObject;
     var distance = Mathf.Infinity;
     var position = transform.position;
     for (var go : GameObject in gos)  {
         var diff = (go.transform.position - position);
         var curDistance = diff.sqrMagnitude;
         if (curDistance < distance) {
             closest = go;
                         dist = curDistance;
             distance = curDistance;
         }
     }
         gameObject.tag = TagToFind;
         return closest;
}
 


Попробую переделать все это на поиск по имени.
Summerscream
UNIт
 
Сообщения: 62
Зарегистрирован: 01 фев 2011, 00:34
Откуда: msc

Re: После билда проект ведет себя не так как в среде

Сообщение Zaicheg 20 авг 2011, 11:13

По методу раскидать
print("====New Call====");
foreacht (GameObject go in gos)
print(go);
print(diff);
print(curDistance);
print(closest)
и дальше в таком духе. И смотреть, что выдаёт в сборке.
Кстати, это можно не только через логи посмотреть, но и через GUI, перенаправив туда дебажные сообщения посредством Application.RegisterLogCallback
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: После билда проект ведет себя не так как в среде

Сообщение Summerscream 20 авг 2011, 19:13

Кое-что удалось прояснить. Код с поиском объектов по тегу не при чем, он в билде работает нормально. Проблема начинается далее когда я использую его результат, в частности:
Синтаксис:
Используется javascript
function BirthPlaceColliderSearch()
{
        if (ClosestBirthplace != null && dist < 0.15f) //если переменная под ближайший объект с тегом не пуста и дистанция до него соответствует требованиям
        {
                GameObject.Find("GUIText").GetComponent(TestGuiText).distmin = "yes";
                var BirthplaceColliderTrue : GameObject;
                BirthplaceColliderTrue = Instantiate(BirthplaceColliderPrefab); //создаем коллидер для будущей точки
                BirthplaceColliderTrue.transform.position = Vector3(gameObject.transform.position.x, gameObject.transform.position.y, gameObject.transform.position.z); //ставим его на место объекта под коллидер
                BirthplaceColliderTrue.transform.parent = gameObject.transform.parent; //делаем его детем точки
                Destroy(ClosestBirthplace); //убиваем объект под коллидер
                Destroy(gameObject); //и второй тоже убиваем
        }              
        else if (ClosestBirthplace != null && dist >= 0.15f)
        {
        ClosestBirthplace = null; //если нашли ближайшего, но он слишком далеко - сбрасываем переменную хранения найденного ближайшего
        GameObject.Find("GUIText").GetComponent(TestGuiText).SetClosestBirthNull = "yes";
        }
        else if (ClosestBirthplace == 0)
        {
        ClosestBirthplace = FindClosestBirhtplace("Finish", "BirthPointCollider"); //если еще не находили объект с нашим тегом ищем и записываем этот объект в переменную
        GameObject.Find("GUIText").GetComponent(TestGuiText).ClosestBirth = ClosestBirthplace;
        }
}
 

Именно эта функция не работает в билде. А именно вот эта ее часть:
Синтаксис:
Используется javascript
        if (ClosestBirthplace != null && dist < 0.15f) //если переменная под ближайший объект с тегом не пуста и дистанция до него соответствует требованиям
        {
                GameObject.Find("GUIText").GetComponent(TestGuiText).distmin = "yes";
                var BirthplaceColliderTrue : GameObject;
                BirthplaceColliderTrue = Instantiate(BirthplaceColliderPrefab); //создаем коллидер для будущей точки
                BirthplaceColliderTrue.transform.position = Vector3(gameObject.transform.position.x, gameObject.transform.position.y, gameObject.transform.position.z); //ставим его на место объекта под коллидер
                BirthplaceColliderTrue.transform.parent = gameObject.transform.parent; //делаем его детем точки
                Destroy(ClosestBirthplace); //убиваем объект под коллидер
                Destroy(gameObject); //и второй тоже убиваем
        }              
 


Теряюсь в догадках, быть может еще чего-нибудь накопаю.
Summerscream
UNIт
 
Сообщения: 62
Зарегистрирован: 01 фев 2011, 00:34
Откуда: msc

Re: После билда проект ведет себя не так как в среде

Сообщение Summerscream 20 авг 2011, 19:50

Товарищи, уж извините за флуд, но я в некотором шоке. Проблему нашел, она столь абсурдна, что почти пугает.
В чем собственно дело.
Имеем конструкцию:
Синтаксис:
Используется javascript
if (ClosestBirthplace != null && dist < 0.15f) ЧТО-ТО ДЕЛАЕМ;               
 

Делаем тестовый запуск в среде и видим, что условие проверяется верно, если в переменной не пусто и расстояние до объекта меньше 0.15 все работает как надо. !НО, если это сбилдить, то условие не проходит, в совершенно идентичных обстоятельствах, даже если в объекте действительно не 0.
Далее видоизменяем условие с "!= null" на "!= 0". Производим теже действия и о чудо, и в среде и после билда все работает как надо, условие проверяется корректно.
Я возможно что-то не понимаю, но какого дьявола?! Уж извините за эмоции.
[curved_hands]
Summerscream
UNIт
 
Сообщения: 62
Зарегистрирован: 01 фев 2011, 00:34
Откуда: msc

Re: После билда проект ведет себя не так как в среде

Сообщение gnoblin 20 авг 2011, 21:27

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

Re: После билда проект ведет себя не так как в среде

Сообщение defint 20 авг 2011, 21:59

может 0 в данном случае приводится к тому типу с которым сравниваете, а нулл подменяет себя на целочисленный 0 уже после того как приведёт типы?
defint
UNIт
 
Сообщения: 94
Зарегистрирован: 10 авг 2009, 12:17

Re: После билда проект ведет себя не так как в среде

Сообщение Summerscream 20 авг 2011, 22:03

может 0 в данном случае приводится к тому типу с которым сравниваете, а нулл подменяет себя на целочисленный 0 уже после того как приведёт типы?

Там вобще GameObject =). То есть тут идет тупо проверка записался ли в переменную GameObject.
Но даже если бы и было так, то вы правда считаете, что это нормальное поведение работать в тестовом запуске и не работать в билде?
Summerscream
UNIт
 
Сообщения: 62
Зарегистрирован: 01 фев 2011, 00:34
Откуда: msc

Re: После билда проект ведет себя не так как в среде

Сообщение defint 20 авг 2011, 22:15

ну дебаг версия обычно подстраивается под код, обнуляет неинициализированные переменные и т.д., а релиз такого не прощает.
попробуйте сделать новую сцену. заполнить простой объект и проверить. возможно дело в каких-то логических связках по другим участкам кода, где используется этот объект (ваш код я не читал :) ).
defint
UNIт
 
Сообщения: 94
Зарегистрирован: 10 авг 2009, 12:17


Вернуться в Почемучка

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

Сейчас этот форум просматривают: Google [Bot], Yandex [Bot] и гости: 21