Метод не возвращает переменные?! Что не так?[РЕШЕНО]

Программирование на Юнити.

Метод не возвращает переменные?! Что не так?[РЕШЕНО]

Сообщение greatPretender 06 янв 2017, 09:52

День бодрый. Совет прошу)
Проясните, плис, не могут понять.
---- -----Ситуация
У меня в скрипте есть метод1, вызываемый кнопкой, в нём 2 блока:
1) вызывается метод2.
2) потом следуют другие вычисления.
Этот Метод2 - void, он что-то считает, используя объявленные на весь скрипт private переменные, придаёт этим переменным новые int значения.
Далее идёт 2-ой блок:набор инструкций, которые используют эти новые значения private int переменных.
---------Результат:
Но по дебагу (внутри 2-го блока) я вижу, что те переменные не изменились, т.е. будто бы метод1 не сообщил эти новые значения в цикл выполнения программы. Я ведь НЕ про внутренние переменные, объявленные внутри метода2.
--------- Вывод
Такое бывает? Я сколько уже год кодю и не попадалось такое))) Или мне нужно дальше искать какую-н ошибку в коде?
Я полагаю, нужно делать метод не void, так? и раз там у меня не одна переменная, то через кортеж возвращать... :ymhug:
Последний раз редактировалось greatPretender 06 янв 2017, 17:47, всего редактировалось 1 раз.
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Метод не возвращает переменные?! Что не так?

Сообщение ilka 06 янв 2017, 11:05

@-)
код можно увидеть методов?
ilka
UNIверсал
 
Сообщения: 478
Зарегистрирован: 21 авг 2015, 19:32

Re: Метод не возвращает переменные?! Что не так?

Сообщение greatPretender 06 янв 2017, 11:14

Вот.
Синтаксис:
Используется csharp
    int curLine;                    
    int curPoint;                    
void Start (){
        curLine = countLines - 1;
        curPoint = countPoint - 1;

}
    // при нажатии на кнопку RIGHT --------------------------
    public void CameraRight()    { // <- метод 1
        FindClosePointCam();   // это мметод2
        if (curPoint == 0){    
            btnLeft.interactable = true;  
        }
        curPoint++;            <span style="font-weight: bold">//  curPoint, curLine - не меняется после выхода из метода2</span>
        curVect = dictPoints [curLine].ElementAt (curPoint);    
        if (curPoint == countPoint - 1){
            btnRight.interactable = false;    
        }
        isReady = true;
    }
//--- метод2
    void FindClosePointCam(){
        float distQuadClosePoint = 0;    // обнуляем
        Vector3 vectClosePoint = Vector3.zero;
        foreach (var item in dictPoints){
            int line = item.Key;
            for (int point = 0; point < countLines; point++) {
                Vector3 vectPoint = item.Value.ElementAt (point);
                distQuadPoint = (tr.position - vectPoint).sqrMagnitude;
                if (distQuadPoint < distQuadClosePoint || distQuadPoin == 0) {
                    curLine = line;                
                    curPoint = point;            
                    distQuadClosePoint = distQuadPoint;
                    vectClosePoint = vectPoint;
                }
            }
        }
    }


 
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Метод не возвращает переменные?! Что не так?

Сообщение ilka 06 янв 2017, 11:24

а вы уверены что поля curPoint и curLine меняются в самом методе2? - может у вас условие в методе 2 не выполняется и поэтому эти поля не меняются?
ilka
UNIверсал
 
Сообщения: 478
Зарегистрирован: 21 авг 2015, 19:32

Re: Метод не возвращает переменные?! Что не так?

Сообщение greatPretender 06 янв 2017, 11:30

На 100% - не уверен. Но они точно меняются. При нажатии других кнопок, на которых тоже навешены такие же методы, но там условия просто другие, типо не <0, а >0, или <> какой-л величины.
Есть ещё подозрение , что цикл расчёта расстояния не правильно работает, т.е. это строчка странности даёт:
Синтаксис:
Используется csharp
distQuadPoint = (tr.position - vectPoint).sqrMagnitude;

По идее когда tr.position асболютно равено vectPoint , то этот vectPoint и должен проходить как самая ближайшая точка и метод2 должен выдавать соответствующие этой координате curPoint и curLine, но не, он не выдаёт их, а находит другую точку. И не знаю.
Т.к. этот метод вычисления наименьшего расст-я уже себя зарекомендовал, проверен, работает.
Вот бьюсь пока ...
То ли т.к. это не Update , то tr.position - не актуальные данные имеет.
Вот так уже начинаю ниспровергать основы))))
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Метод не возвращает переменные?! Что не так?

Сообщение ilka 06 янв 2017, 11:35

На 100% - не уверен.

1) Расстояние не может быть меньше 0.
2) Сравнение float с 0 не всегда сработает лучше округлять их до целых чисел или сравнивать приближенно типа < 0.1f вмеcто == 0
ilka
UNIверсал
 
Сообщения: 478
Зарегистрирован: 21 авг 2015, 19:32

Re: Метод не возвращает переменные?! Что не так?

Сообщение greatPretender 06 янв 2017, 11:44

ilka писал(а):
На 100% - не уверен.

1) Расстояние не может быть меньше 0.
2) Сравнение float с 0 не всегда сработает лучше округлять их до целых чисел или сравнивать приближенно типа < 0.1f вмеcто == 0

1. Нет. т.к. там проверяет квадрат расстояния
2. Про это с float в курсе. Но если оно не равно нулю, то подпадает под условие >0 и всё равно в итоге должно проходить )))
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Метод не возвращает переменные?! Что не так?

Сообщение ilka 06 янв 2017, 12:02

1. Нет. т.к. там проверяет квадрат расстояния

и что он вернет значение меньше нуля?
Но если оно не равно нулю, то подпадает под условие >0 и всё равно в итоге должно проходить

это как?
У вас условие
distQuadPoint < distQuadClosePoint || distQuadPoin == 0

где distQuadClosePoint = 0f изначально, а distQuadPoin == 0f не всегда сработает
ilka
UNIверсал
 
Сообщения: 478
Зарегистрирован: 21 авг 2015, 19:32

Re: Метод не возвращает переменные?! Что не так?

Сообщение greatPretender 06 янв 2017, 12:37

Не могу понять где вы увидели пробел.
Ведь в коде никак не может возникнуть отрицательное число.
1. distQuadClosePoint изначально равно 0 и в дальнейшем при проверки КВАДРАТА расст-я отриц-ым быть не может.
2. distQuadPoint - это квадрат расст-я (судя из формулы), там тоже отриц-ого не может быть .
)))
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Метод не возвращает переменные?! Что не так?

Сообщение samana 06 янв 2017, 12:52

ilka писал(а):У вас условие
distQuadPoint < distQuadClosePoint || distQuadPoin == 0

где distQuadClosePoint = 0f изначально, а distQuadPoin == 0f не всегда сработает


Здесь ilka верно говорит. distQuadClosePoint будет назначено значение, только если сработает условие

Синтаксис:
Используется csharp
if (distQuadPoint < distQuadClosePoint || distQuadPoin == 0)


а оно может никогда и не сработать, ведь distQuadPoin вряд ли будет равна нулю.

Предлагаю просто прописать дебаг и убедиться в том, что условие выполняется

Синтаксис:
Используется csharp
if (distQuadPoint < distQuadClosePoint || distQuadPoin == 0) {
                    Debug.Log("условие выполнилось"); // <<
                    curLine = line;                
                    curPoint = point;            
                    distQuadClosePoint = distQuadPoint;
                    vectClosePoint = vectPoint;
                }
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Метод не возвращает переменные?! Что не так?

Сообщение greatPretender 06 янв 2017, 16:20

Всё ясно, да, согласен.
В общем, тут чуть-чуть другие обст-ва, но это сильно всё поменяло и поэтому использованный и ранее проверенный фильтр if-ов здесь работал не верно.
Несколько раз в результате логических размышлений приходил к выработке всё более нового фильтра, кажущегося рабочим, но на проверке оказалось , что они все не работали. Но в итоге пришёл к такому, и он наконец-тоо работает , хех всё верно:
Синтаксис:
Используется csharp
void FindClosePointCam(){
        float distQuadClosePoint = 0;   // обнуляем
        foreach (var item in dictPoints){
                int line = item.Key;
                for (int point = 0; point < countPoint; point++) {
                        Vector3 vectPoint = item.Value.ElementAt (point);
                        distQuadPoint = (tr.position - vectPoint).sqrMagnitude;
                        if (distQuadPoint == 0f) {
                                curLine = line;
                                curPoint = point;
                                break;
                        } else {
                                if (distQuadClosePoint == 0f || distQuadPoint < distQuadClosePoint){
                                        Debug.Log ("условие выполнилось");
                                        curLine = line;
                                        curPoint = point;
                                        distQuadClosePoint = distQuadPoint;
                                }
                        }
                }
        }
        Debug.Log (curLine + "+" + curPoint);
}

Так что , всем ещё раз большое благодарю)))
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51


Вернуться в Скрипты

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

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