Выравнивание в Unity - PullRequest
       18

Выравнивание в Unity

0 голосов
/ 20 января 2020

Я новичок в программировании и не знаю, как создать счетчик уровня, который будет доступен в любой сцене.

Я создал 3D-игру. Когда игрок завершил уровень 1, я хочу, чтобы уровень 2 был разблокирован с использованием этого метода:

Когда игрок завершил уровень, значение счетчика уровня меняется на 2, и триггер может получить доступ к этому уровню counter.

Ниже приведен не мой код, а просто чтобы прояснить его:

var level = "level counter which is 2 in this case"
if level == 3
active the trigger (trigger teleports the player to level 3)
else {
floatMessage("You haven't finished level (?) yet.")
}

Ответы [ 3 ]

0 голосов
/ 20 января 2020

Есть несколько способов справиться с этим. Я рекомендую хранить данные о ходе игры в файле или базе данных вне области видимости (хорошее решение для файловой базы данных - SQLite - здесь - пост вики, который я сделал о том, как я реализовал SQLite в одном из моих недавних проектов).

Однако, если вы сохраняете игровой прогресс только в течение жизненного цикла игры (он всегда начинается с уровня 1, когда вы его запускаете), то Singletons и DontDestroyOnLoad также хорошее решение, как упомянул @BugFinder.

public class LevelManager : MonoBehaviour
{
    private static LevelManager instance;
    public static LevelManager Instance { get => instance; }

    int levelNum = 1;
    public int LevelNum { get => levelNum; }

    private void Awake()
    {
        //Check to see if an instance of the LevelManager already exists.
        if(instance != null && instance != this)
        {
            Destroy(this.gameObject);
            return;
        }
        instance = this;
        DontDestroyOnLoad(this.gameobject);
    }

    public void LevelComplete()
    {
        levelNum++;
    }
}

Пока вышеуказанный код прикреплен к игровому объекту в вашей сцене, вы можете вызывать следующее из сценария другого игрового объекта. Вы заметите, что я инкапсулирую levelNum и экземпляр. Это сделано для обеспечения хорошей практики в моем другом коде. Я знаю, что единственным сценарием, который может изменять levelNum или экземпляр, является LevelManager, поэтому я не буду случайно что-то нарушать, случайно меняя одно из этих значений в другом сценарии. игровой объект, который может сохраняться между сценами. Мне нравится создавать пустой игровой объект "Одиночки", который просто содержит мои синглеты.

Пример использования при победе над финальным боссом (если это способ побить ваши уровни):

void BossDefeated()
{
    LevelManager.Instance.LevelComplete();
}

Пример использование при проверке возможности открытия портала:

int portalNum = 3;
bool CheckPortal()
{
    if(LevelManager.Instance.LevelNum >= portalNum)
        return true;
    return false;
}
0 голосов
/ 20 января 2020

Не могли бы вы просто использовать Stati c int, если вы просто хотите что-то быстрое:

public static int level;

Затем из любого места назовите имя класса, например LevelManager.level;

Если вы Если вы хотите, чтобы он что-то вызывал, вам лучше иметь какой-то обратный вызов и сделать его закрытым с помощью publi c get, который, в свою очередь, вызывает что-то вроде UnityEvent. Этот ответ, вероятно, будет не очень популярен, но это быстро сделать:)

0 голосов
/ 20 января 2020

Похоже, вам нужна система сопротивления.

Есть много способов сохранить состояние игры. Самым простым и доступным остается PlayerPrefs, хотя он не оптимален для более сложных сохранений.

Вы можете сохранить количество разблокированных уровней (при условии, что оно является инкрементным), используя этот вызов:

    PlayerPrefs.SetInt("levelsUnlocked", 3);

и затем вы можете получить значение с помощью:

levelsUnlocked = PlayerPrefs.GetInt("levelsUnlocked", 0);

Примечание : вторым параметром здесь является значение по умолчанию, назначаемое в случае, если вы ранее не сохраняли.

Надеюсь, это поможет. Если вы хотите обновить свою сохраненную игру, подумайте о написании собственного класса сохраняемых файлов и сериализации, используя JSON. https://docs.unity3d.com/Manual/JSONSerialization.html

Первый вариант остается удобным для простого проекта.

...