Всех приветствую! Сегодня я хочу немного рассказать о том, как я писал свою систему достижений. А гуру могли бы дать совет, хороший ли мой
способ или нет.
способ или нет.
Итак, достижения я реализовывал через ScriptableObject. Почему я выбрал этот способ?
- Гибкость
- Удобство
Сама структура достижения выглядит так:
В данном случае, обращение к достижениям идёт через id элемент, так как название достижения (по крайней мере у меня) может быть длинным
и через него обращаться было бы крайне сложно.
и через него обращаться было бы крайне сложно.
progressCompleted - это переменная, отвечающая за прогресс достижения, так как существуют достижения, которые выполняются по мере
выполнение чего-либо. Например игроку необходимо прыгнуть 20 раз, тогда мы при каждом прыжке обращаемся к нужному достижению
и прибавляем некоторое значение. Его можно посчитать через простецкую пропорцию (20 - 100%, 1 - x%, где 20 - это ваше произвольное кол-во), ваш капитан.
выполнение чего-либо. Например игроку необходимо прыгнуть 20 раз, тогда мы при каждом прыжке обращаемся к нужному достижению
и прибавляем некоторое значение. Его можно посчитать через простецкую пропорцию (20 - 100%, 1 - x%, где 20 - это ваше произвольное кол-во), ваш капитан.
Собственно если достижение должны получать сразу, то просто (+= 100) к переменной.
А так происходит обращение к достижению
Данный метод не совсем точен, так как это моя вариация, по-хорошему он должен выглядеть так:
public void GetAchievement(string id, byte count)
{
Achievement getAchievement = achievementList.achievementList.Find(idAchievement => idAchievement.id.Contains(id));
if(getAchievement.progressCompleted != 100)
getAchievement.progressCompleted += countComplete;
else CompleteAchievement(getAchievement.name, getAchievement.icon);
}
Где CompleteAchievement() - метод, отвечающий за получение достижения и вывод его на экран
Удобство и гибкость в том, что все достижения можно легко добавить/удалить/изменить вот в таком файлике
А для сохранение полученных достижений, необходимо просто сохранять параметр progressCompleted через цикл. А далее в скрипте
делать проверку на то, равно ли значение достижения 100 или нет, также через цикл.
делать проверку на то, равно ли значение достижения 100 или нет, также через цикл.
Вот и всё. Лично я записываю все игровые данные в JSON, поэтому у меня нет сложности записывать все данные по достижениям.
А так вполне познавательно выглядит, даже я вполне поняла =D
я ж очень педантичный и дотошливый
Ред. prog
А как же локализуемый описательный текст достижения, неужели одного названия достаточно?
Ну и хранение прогресса в процентах в целочисленной переменной приведет к сбоям если инкремент будет больше одной сотой от максимума.
ИМХО, я бы вобще напроч разделил описательную часть и реализацию подсчета результатов - глобальная библиотека со всеми доступными достижениями отдельно, подсчет прогресса по каждому из них отдельно.
А так, ваша мысль любопытна для более серьезных проектов. Только вот как вы бы связывали прогресс с достижением?
Clamp, Смотря что вы подчеркиваете, модификатор доступа или префикс, или может то, что метод ничего не возвращает? Если дело в префиксе, то
не знаю, мне показалось это наиболее значимым для данного метода.
BrEd Pitt, Занятно, будет любопытно взглянуть, когда будет что посмотреть/почитать
Не сочти, что докапываюсь, место действительно вызвало недоумение.
Ред. prog
prog, Да, именно. ИМХО, но мне кажется, что достижения должны быть без описания, так как описание требует от игрока что-то сделать, а так, ты ничего
не требуешь + игроку может стать любопытно, как получить то, или иное достижение.