Переменная Static

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

Переменная Static

Сообщение konstantin666 17 фев 2017, 18:21

Есть у меня шарики, которые рандомно появляются, по нажатию по ним, они удаляются, предварительно уменьшая итерацию в тексте CountBallText.text = CountBall-- + "шт"; Все хорошо, но, при перезагрузки сцены, к примеру даже Application.LoadLevel(Application.loadedLevel); переменная естественно сохраняется, и выдает сообщение о том, что уровень пройден, как это можно поправить? обнуление переменной в начале сцены не вариант, кроме статической переменной как можно еще сделать, что бы по нажатию по рандомным объектам, уменьшалось число, при этом не сохранялось при перезагрузке сцены?
Синтаксис:
Используется csharp
 public static int  CountBall = 4;
    public Text CountBallText;
    public AnimationFormsUI PanelResult;
    public GameObject SpawnDestroy;

    void Update()
    {
        TapsCounter();
    }

    public void ClickBalloonRed()
    {
        CountBallText.text = CountBall-- + "шт";
        Destroy(this.gameObject);
    }

    void TapsCounter()
    {
        if (CountBall == -1)
        {
            Destroy(SpawnDestroy);
            PanelResult.EnableBoolInAnimatorResult();
           
           
        }
    }

ИзображениеИзображение
konstantin666
UNIт
 
Сообщения: 106
Зарегистрирован: 19 июл 2016, 18:11

Re: Переменная Static

Сообщение samana 17 фев 2017, 18:30

Я так понимаю, что скрипт ниже висит на каждом шарике? Это не очень хорошая идея, ведь шарик не должен контролировать уровень, он просто может лететь и лопнуть, большое от него ничего не нужно.
Ваша переменная кол-ва шариков, должна находится в каком нибудь менеджере уровня. Просто пустой объект со скриптом, который знает нужную информацию об уровне.
При лопании шарика, я бы слал событие "шарикЛопнул". А менеджер уровня ловил бы это событие и менял уже переменную кол-ва шариков, менял текст и прочее.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Переменная Static

Сообщение konstantin666 17 фев 2017, 20:34

samana писал(а):Я так понимаю, что скрипт ниже висит на каждом шарике? Это не очень хорошая идея, ведь шарик не должен контролировать уровень, он просто может лететь и лопнуть, большое от него ничего не нужно.
Ваша переменная кол-ва шариков, должна находится в каком нибудь менеджере уровня. Просто пустой объект со скриптом, который знает нужную информацию об уровне.
При лопании шарика, я бы слал событие "шарикЛопнул". А менеджер уровня ловил бы это событие и менял уже переменную кол-ва шариков, менял текст и прочее.

Как примерно посылать такие события?
konstantin666
UNIт
 
Сообщения: 106
Зарегистрирован: 19 июл 2016, 18:11

Re: Переменная Static

Сообщение konstantin666 17 фев 2017, 20:43

Как то вот так?
Скрипт 1 - Шарика
Синтаксис:
Используется csharp
public class LogicBalloon : MonoBehaviour
{
    public AnimationFormsUI PanelResult;
    public GameObject SpawnDestroy;
    public NewBehaviourScript K;

    public void Brust()
    {
        K.isBallBurst = true;
        Destroy(this.gameObject);
    }

}


Скрипт 2 - Менеджер

Синтаксис:
Используется csharp
public class NewBehaviourScript : MonoBehaviour {
    public LogicBalloon L;
    int CountBall = 4;
    public Text CountBallText;
    public bool isBallBurst = false;
    public void ClickBalloonRed()
    {
        if (isBallBurst == true)
        {
            GameObject.Find("Canvas/TaskPanel/CountBall").GetComponent<Text>().text = CountBall-- + "шт";
        }
     }
}
konstantin666
UNIт
 
Сообщения: 106
Зарегистрирован: 19 июл 2016, 18:11

Re: Переменная Static

Сообщение samana 17 фев 2017, 22:12

Вы главное не волнуйтесь. А то сейчас увидите незнакомый вам код и подумаете "Что-то непонятное.. как это работает? Хочу чтобы было проще.".
Но вы ведь хотите научится делать игры, а события - это не страшно, а очень удобная штука связи между объектами.
Ваш код должен быть примерно такого вида:

Менеджер:

Синтаксис:
Используется csharp
using UnityEngine;

public class Manager : MonoBehaviour
{
    // при активации, этот менеджер начинает "принимать" событие шарика, точнее его лопание
    private void OnEnable()
    {
        Balloon.BOOM += onBalloonBoomHandler;
    }

    // при деактивации, этот менеджер ОБЯЗАТЕЛЬНО должен перестать "принимать" любые события,
    // которые он "принимал"
    private void OnDisable()
    {
        Balloon.BOOM -= onBalloonBoomHandler;
    }

    // этот метод автоматически сработает, когда выполнится метод Brust у любого шарика.
    private void onBalloonBoomHandler(Balloon balloon)
    {
        Debug.Log("Только что лопнул шарик с именем "+ balloon.name);
       
        // вся остальная логика
        // отнимание очков, обновление текста и тп.
    }

}


Шарик

Синтаксис:
Используется csharp
using System;
using UnityEngine;

public class Balloon : MonoBehaviour
{
    // это событие, которое срабатывает при лопании
    // любой объект может принять его.
    // так же это событие имеет ссылку на тот шарик, который лопнул,
    // это возможно пригодится для чего-то.
    public static event Action<Balloon> BOOM;

    public void Brust()
    {
        // "возникновение события"
        if (BOOM != null) BOOM(this);
        Destroy(this.gameObject);
    }
}
 
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Переменная Static

Сообщение konstantin666 17 фев 2017, 23:16

samana писал(а): // при активации, этот менеджер начинает "принимать" событие шарика, точнее его лопание
private void OnEnable()
{
Balloon.BOOM += onBalloonBoomHandler;
}

// при деактивации, этот менеджер ОБЯЗАТЕЛЬНО должен перестать "принимать" любые события,
// которые он "принимал"
private void OnDisable()
{
Balloon.BOOM -= onBalloonBoomHandler;
}

// этот метод автоматически сработает, когда выполнится метод Brust у любого шарика.
private void onBalloonBoomHandler(Balloon balloon)
{
Debug.Log("Только что лопнул шарик с именем "+ balloon.name);

// вся остальная логика
// отнимание очков, обновление текста и тп.
}

}[/syntax]

Метод OnEnable() срабатывает когда выполнился метод, а OnDisable() когда метод уже перестал выполняться? А как он определяет какой метод выполнять "private void onBalloonBoomHandler(Balloon balloon)" ищет события BOOM ? Спасибо большое за помощь и подробные комментарии))
konstantin666
UNIт
 
Сообщения: 106
Зарегистрирован: 19 июл 2016, 18:11

Re: Переменная Static

Сообщение samana 17 фев 2017, 23:46

OnEnable и OnDisable принадлежат к MonoBehaviour, вы можете прописать эти методы в любом вашем скрипте, наследуемые от него.
Вы можете найти описание этих методов и не только в справке - https://docs.unity3d.com/ru/530/Manual/ ... Order.html
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск


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

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

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