Всех приветствую! Сегодня я хочу немного рассказать о том, как я писал свою систему достижений. А гуру могли бы дать совет, хороший ли мой
способ или нет.
Итак, достижения я реализовывал через ScriptableObject. Почему я выбрал этот способ?
  • Гибкость
  • Удобство
Сама структура достижения выглядит так:
В данном случае, обращение к достижениям идёт через id элемент, так как название достижения (по крайней мере у меня) может быть длинным
и через него обращаться было бы крайне сложно.
progressCompleted - это переменная, отвечающая за прогресс достижения, так как существуют достижения, которые выполняются по мере
выполнение чего-либо. Например игроку необходимо прыгнуть 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 или нет, также через цикл.
Вот и всё. Лично я записываю все игровые данные в JSON, поэтому у меня нет сложности записывать все данные по достижениям.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
15
2-я картинка битая
А так вполне познавательно выглядит, даже я вполне поняла =D
19
Как всегда полезно, делаю заметки для себя (пока оформляю диздок одной своей штукенции)
19
пока что нет. Я только начал утверждаться с концепцией, да и учеба будет отнимать достаточно времени, поэтому разработка будет идти очень медленно. Как пример приведу лишь то, что саму идею оформлял около года, "работая напильником" и учитывая возможные недостатки.
я ж очень педантичный и дотошливый
24
DasBro,
А как же локализуемый описательный текст достижения, неужели одного названия достаточно?
Ну и хранение прогресса в процентах в целочисленной переменной приведет к сбоям если инкремент будет больше одной сотой от максимума.
ИМХО, я бы вобще напроч разделил описательную часть и реализацию подсчета результатов - глобальная библиотека со всеми доступными достижениями отдельно, подсчет прогресса по каждому из них отдельно.
30
Прошу прощения, но...
public void Get...
Оно точно так должно выглядеть?
13
prog, На счёт локализации согласен, но т.к. я приводил пример со своего проекта, где локализация не предусмотрена, то я обошёлся только названием. На счёт сбоя, тут тоже верно подмечено, моя ошибка, что привёл пример со своего проекта т.к. у меня планируются достижения без постоянного подсчёта прогресса.
А так, ваша мысль любопытна для более серьезных проектов. Только вот как вы бы связывали прогресс с достижением?
Clamp, Смотря что вы подчеркиваете, модификатор доступа или префикс, или может то, что метод ничего не возвращает? Если дело в префиксе, то
не знаю, мне показалось это наиболее значимым для данного метода.
BrEd Pitt, Занятно, будет любопытно взглянуть, когда будет что посмотреть/почитать
30
то, что метод ничего не возвращает?
Это самое. "Get" переводится как "взять", а брать-то и нечего =)
Не сочти, что докапываюсь, место действительно вызвало недоумение.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.