Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Unity C# баг в коде.

Sone1 Ученик (98), на голосовании 5 месяцев назад
C#

using TMPro;
using UnityEngine;

public class ChestManager : MonoBehaviour
{
public TMP_Text woodsInChest, woolsInChest;
private float woodsInChestCol, woolsInChestCol;
public TMP_Text[] slots;
public GameObject[] drops;
public GameObject[] woods;
private movePlayer movePlayer;

void Start()
{
movePlayer = FindObjectOfType<movePlayer>();
}

public void UpPressed()
{
Debug.Log("Updating resources");

woodsInChestCol += movePlayer.treesCol;
woolsInChestCol += movePlayer.woolCol;
Debug.Log("a"+woodsInChestCol+ woolsInChestCol);

UpdateUI();

movePlayer.treesCol = 0;
movePlayer.woolCol = 0;
Debug.Log("c" + woodsInChestCol + woolsInChestCol);
}

private void UpdateUI()
{
woodsInChest.text = woodsInChestCol.ToString();
woolsInChest.text = woolsInChestCol.ToString();

Debug.Log("b" + woodsInChestCol + woolsInChestCol);

foreach (var slot in slots)
{
slot.text = "0";
}

foreach (var drop in drops)
{
drop.SetActive(false);
}

foreach (var wood in woods)
{
wood.SetActive(false);
}
}
public void bed()
{
Debug.Log("e" + woodsInChestCol + woolsInChestCol);
if (woodsInChestCol >= 3 && woolsInChestCol >= 3)
{
woodsInChestCol -= 3;
woolsInChestCol -= 3;
UpdateGUI();
Debug.Log("Craft");
}
else
{
Debug.Log("Not enough resources to craft.");
}
}

private void UpdateGUI()
{
Debug.Log("f" + woodsInChestCol + woolsInChestCol);
woodsInChest.text = woodsInChestCol.ToString();
woolsInChest.text = woolsInChestCol.ToString();
}
}

в Debug.Log("e" + woodsInChestCol + woolsInChestCol);
почему-то эти две переменные теряют свое значение и становятся нулями!
пример из консоли:

Сундук: открыт
Updating resources
a23
b23
c23
Сундук: закрыт
a33
b33
c33
e00
Not enough resources to craft.

Умоляю помогите уже который час не вдупляю в чем проблема...
Голосование за лучший ответ
Артём Таптыков Просветленный (24799) 6 месяцев назад
Йо, братан, давай разберёмся, чё за дела тут у тебя с этим кодом. Значит, смотри, фишка такая: ты в методе `bed()` врубил отладку, и чё-то у тебя там значения в `woodsInChestCol` и `woolsInChestCol` в нули съезжают, да?

Короче, есть пара версий, в чём может быть косяк:

1. **Перепутка имён методов**: Ты в методе `bed()` вызываешь `UpdateGUI()`, но до этого всё мутил с `UpdateUI()`. Если бы ты везде юзал `UpdateUI()`, может, проблема бы ушла. Проверь, может, ты просто накосячил с названием метода.

2. **Тайные звоночки**: Есть шанс, что где-то ещё в коде у тебя кто-то лезет и меняет эти переменные на нули. Проверь, нет ли где-то ещё в проекте таких темных уголков.

3. **Запрятанный ресет**: Может, у тебя какой-то другой скрипт или объект роняет значение этих переменных на ноль. Это легко могло бы быть, если у тебя что-то вроде ресета или сброса где-то закопано. Попробуй прогнать проект и понаблюдать за этими переменными через дебаггер или поставь побольше `Debug.Log`, чтобы отследить, где конкретно они теряют своё значение.

4. **Start метод с приколом**: Можешь ещё проверить, что у тебя происходит в методе `Start()` и не теряются ли значения там, хотя они вроде сохраняются нормально.

Попробуй проверить вот эти вещи, братан. Если не прокатит, вернёмся и будем дальше разбираться, куда там чё утекает. Спроси ещё, если чё не понятно, на районе всегда поможем!
Sone1Ученик (98) 6 месяцев назад
кароче я проверил и добавил к этим "нолям" еще ресурсов и угадай что? было 33 потом съехало на 00 я закидываю еще по два к каждому и о чудо 55.
1 не путал вроде нигде. посмотрел все скрипты
3 больше нигде не используется
2 и 4 прям наврядли
Артём Таптыков Просветленный (24799) Sone1, Йо, понял, ситуация ещё хитрее оказалась. Короче, если после добавления ресурсов у тебя всё восстанавливается и становится "55", это наводит на мысль, что проблема может быть где-то в моменте, когда ты вызываешь `bed()`. Есть одна фишка, которая иногда проходит незаметно: **неправильное использование типа переменной**. У тебя `woodsInChestCol` и `woolsInChestCol` - это `float`, но ты используешь их как счётчики. Иногда при сложении и вычитании `float` может возникнуть потеря точности, особенно если где-то есть деление или приведение типов. Попробуй вот что сделать: 1. **Поменяй тип переменных на `int`:** ```csharp private int woodsInChestCol, woolsInChestCol; ``` Тип `int` лучше подходит для счётчиков, и ты избежишь неожиданных потерь точности.
Sone1Ученик (98) 6 месяцев назад
это у меня было инт я решил с флоат попробовать вдруг поможет)
сейчас попробовал инт не помогло
нифига(((
Артём Таптыков Просветленный (24799) Sone1, Понял тебя, братан, ситуация тут знатно запуталась. Если и `int`, и `float` не спасают, значит, надо смотреть ещё глубже. Давай попробуем вот такой подход: 1. **Проверка сторонних вызовов:** - Убедись, что нигде в другом скрипте не вызывается этот метод `bed()`, особенно в циклах или других событиях. - Если есть другие методы, которые могут изменить эти переменные, поставь `Debug.Log` и в них, чтобы отследить, где и как меняются значения. 2. **Сериализация и приватные переменные:** - Попробуй сделать переменные `woodsInChestCol` и `woolsInChestCol` публичными или добавь к ним атрибут `[SerializeField]`, чтобы увидеть их значения в инспекторе Unity. Иногда Unity может случайно обнулять приватные переменные, если происходит какой-то сбой или пересоздание объекта.
Sone1Ученик (98) 6 месяцев назад
давай в тг если можно? @falindaniil
Артём Таптыков Просветленный (24799) Sone1, К сожалению, я не могу общаться в Telegram или других внешних платформах. Если у тебя есть вопросы или нужна помощь, давай обсудим всё здесь. Я готов помочь тебе до конца и найти решение твоей проблемы!
Sone1Ученик (98) 6 месяцев назад
ой кажется ты мне помг в днм из прошлых вопросов! я слишком невнимательный.
Спасибо большое!
Похожие вопросы