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

Лааааааги

СообщениеДобавлено: 16 июл 2018, 02:21
X_T_F
Нужна помощь. У меня есть игровой объект со скриптом, в скрипте вот что прописано
Синтаксис:
Используется csharp
    private GameObject gameManager;
    private Coin scriptCoin;
    public int lvl;

        void Start () {
       // gameManager = GameObject.Find("Coin");
        }
       
        void Update () {
        if (lvl > 0)
        {
            Thread.Sleep(10000);
            GameObject.Find("Coin").GetComponent<Coin>().rrr += 100;
            GameObject.Find("Coin").GetComponent<Coin>().ScoreText.text = GameObject.Find("Coin").GetComponent<Coin>().rrr + "";
        }
    }

    public void OnMouseDown() {
        lvl++;
    }


То есть при нажатии на объект, очки на другом объекте увеличиваются на 100 каждые 10 секунд. И это должно продолжаться бесконечно. Но когда запускаю у меня начинает все дико тормозить. Подскажите в чем проблема.

Re: Лааааааги

СообщениеДобавлено: 16 июл 2018, 04:19
Anonymyx
А вы знаете что такое Thread.Sleep()?
1. Метод .Sleep 'заморозит' поток в котором он вызван, а вызываете вы его в потоке 'Main', т.е. в главном потоке, или как его еще называют - UI поток, поток взаимодействия с пользователем.
2. У вас за 1 вызов Update() в данном классе происходит 6 относительно 'дорогих' операций, Find() и GetComponent<>(). Почитайте про кэширование компонентов.

А так, задачу можно решить через корутинку:

Синтаксис:
Используется csharp
IEnumerator IncreaseRRR()
{
while(true)
{
//Здесь делаете то что надо
yield return new WaitForSeconds(10);
}
}

Re: Лааааааги

СообщениеДобавлено: 16 июл 2018, 14:25
X_T_F
Точно, я совсем забыл про yield. Спасибо. Только у меня теперь другой вопрос. Как мне правильно его вызвать. Точнее где??? Если вызывать его в Update, то задержки вроде как нету, ведь на сколько я знаю Update вызывается с каждым новым кадром. А в классе просто так(не в методе) не пропишешь
Синтаксис:
Используется csharp
    if (lvl > 0)
        {
            StartCoroutine(IncreaseRRR());
        }

То есть мне нужна функция, которая при определенной значении переменной начинает вызывать сама себя. Можете подсказать как это сделать??

Re: Лааааааги

СообщениеДобавлено: 16 июл 2018, 15:12
1max1
Синтаксис:
Используется csharp
GameObject gameManager;
    Coin coin;
    public int lvl;

    void Start()
    {
        coin = GameObject.Find("Coin").GetComponent<Coin>();
    }

    void OnMouseDown()
    {
        ++lvl;

        if (lvl > 0)
        {
            StartCoroutine(IncreaseRRR());
        }
    }

    IEnumerator IncreaseRRR()
    {
        while (true)
        {          
            coin.rrr += 100;
            coin.ScoreText.text = coin.rrr + "";

            yield return new WaitForSeconds(10.0f);
        }
    }
 

Re: Лааааааги

СообщениеДобавлено: 16 июл 2018, 16:30
X_T_F
Аааааааааааааа, я думал что она сработает только 1 раз при клике и все, а дальше не будет считать. Спасибо.

Re: Лааааааги

СообщениеДобавлено: 16 июл 2018, 20:00
Anonymyx
1max1, не, так не пойдет, при каждом клике будет создаваться новый экзеспляр корутины, и эффект будет суммироваться.

Re: Лааааааги

СообщениеДобавлено: 16 июл 2018, 20:05
1max1
Мне кажется ему это и нужно, там же еще лвл повышается, хотя я хз, может и не так (popcorn1)

Re: Лааааааги

СообщениеДобавлено: 17 июл 2018, 00:17
Fox_game
У меня такая идея. Может всяких новичков, которые используют команды, даже не зная их предназначение, вместо того, чтоб тыкать в их ошибки, отправлять в самую (полная Ж) , читать мануалы, чтоб небыло глупых вопросов....

Re: Лааааааги

СообщениеДобавлено: 17 июл 2018, 08:47
seaman
А Вы не заходите в "Почемучку"