Страница 1 из 1

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

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

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

Прошу помощи бывалых шаманов или может психиатров, я уже склонен начать верить в демонов...

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

СообщениеДобавлено: 19 авг 2011, 23:03
raul82
сцену в билд добавлял?

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

СообщениеДобавлено: 19 авг 2011, 23:12
Summerscream
сцену в билд добавлял?

Разумеется, ее при запуске вполне себе даже видно.
Возможно я не совсем верно описал проблему. Стартовая часть работает. У меня там в начале скрипт расставляет стартовые объекты. Не работает именно та часть где объекты ищутся по тегам, она начинает свою работу сразу после стартового скрипта на каждом из расставленных объектов.
Возможно код наведет на мысль:
Синтаксис:
Используется 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();
}
 

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

СообщениеДобавлено: 19 авг 2011, 23:34
Zaicheg
Вам нужно проверить логи плеера на предмет ошибок.
http://unity3d.com/support/documentatio ... Files.html

Комбинирование JS и C# в проекте есть? Оно иногда вызывает всякие непонятные штуки.
Разница в работе веб- и стандалон-сборки есть?

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

СообщениеДобавлено: 19 авг 2011, 23:46
Summerscream
Вам нужно проверить логи плеера на предмет ошибок.
http://unity3d.com/support/documentatio ... Files.html

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

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

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

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

Никакой.

Есть один момент, который возможно как-то мог повлиять на работоспособность проекта, а именно: дома я открываю его в Pro версии, а на работе в Trial. Помимо этого синхронизирую я все это добро через систему контроля версий, а она не очень хорошо переносит постоянное движение Temp файлов Unity.

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

СообщениеДобавлено: 19 авг 2011, 23:54
Zaicheg
Систему контроля версий из цепочки конечно надо исключить. То есть, проверить работоспособность в редакторе, собрать, посмотреть работоспособость в сборке.
И надо делать print() где только можно и смотреть их результаты в логах сборки, искать отклонения от этих же принтов в редакторе. Значения переменных, возвращаемые методами значения, принты-сигналы об успешном вызове метода и т. д.
Можно проект сюда выложить, чтобы проверить воспроизводимость проблемы.

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

СообщениеДобавлено: 20 авг 2011, 00:09
Summerscream
Систему контроля версий из цепочки конечно надо исключить. То есть, проверить работоспособность в редакторе, собрать, посмотреть работоспособость в сборке.

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

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

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

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

Добавил к посту.

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

СообщениеДобавлено: 20 авг 2011, 09:20
Summerscream
Поэкспериментировал со своими старыми проектами. Они билдятся и работают нормально. Видимо проблемой является именно блок кода, отвечающий за поиск объекта по тегу, ибо такую штуку в этом прокте я использовал первый раз в жизни.
Синтаксис:
Используется 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;
}
 


Попробую переделать все это на поиск по имени.

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

СообщениеДобавлено: 20 авг 2011, 11:13
Zaicheg
По методу раскидать
print("====New Call====");
foreacht (GameObject go in gos)
print(go);
print(diff);
print(curDistance);
print(closest)
и дальше в таком духе. И смотреть, что выдаёт в сборке.
Кстати, это можно не только через логи посмотреть, но и через GUI, перенаправив туда дебажные сообщения посредством Application.RegisterLogCallback

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

СообщениеДобавлено: 20 авг 2011, 19:13
Summerscream
Кое-что удалось прояснить. Код с поиском объектов по тегу не при чем, он в билде работает нормально. Проблема начинается далее когда я использую его результат, в частности:
Синтаксис:
Используется 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); //и второй тоже убиваем
        }              
 


Теряюсь в догадках, быть может еще чего-нибудь накопаю.

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

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

Делаем тестовый запуск в среде и видим, что условие проверяется верно, если в переменной не пусто и расстояние до объекта меньше 0.15 все работает как надо. !НО, если это сбилдить, то условие не проходит, в совершенно идентичных обстоятельствах, даже если в объекте действительно не 0.
Далее видоизменяем условие с "!= null" на "!= 0". Производим теже действия и о чудо, и в среде и после билда все работает как надо, условие проверяется корректно.
Я возможно что-то не понимаю, но какого дьявола?! Уж извините за эмоции.
[curved_hands]

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

СообщениеДобавлено: 20 авг 2011, 21:27
gnoblin
меня тоже пугает джаваскрипт! :ymdevil:

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

СообщениеДобавлено: 20 авг 2011, 21:59
defint
может 0 в данном случае приводится к тому типу с которым сравниваете, а нулл подменяет себя на целочисленный 0 уже после того как приведёт типы?

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

СообщениеДобавлено: 20 авг 2011, 22:03
Summerscream
может 0 в данном случае приводится к тому типу с которым сравниваете, а нулл подменяет себя на целочисленный 0 уже после того как приведёт типы?

Там вобще GameObject =). То есть тут идет тупо проверка записался ли в переменную GameObject.
Но даже если бы и было так, то вы правда считаете, что это нормальное поведение работать в тестовом запуске и не работать в билде?

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

СообщениеДобавлено: 20 авг 2011, 22:15
defint
ну дебаг версия обычно подстраивается под код, обнуляет неинициализированные переменные и т.д., а релиз такого не прощает.
попробуйте сделать новую сцену. заполнить простой объект и проверить. возможно дело в каких-то логических связках по другим участкам кода, где используется этот объект (ваш код я не читал :) ).