Тема
Всех приветствую! Сегодня я хочу немного рассказать о том, как я писал свою систему достижений. А гуру могли бы дать совет, хороший ли мой
способ или нет.
Итак, достижения я реализовывал через 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" переводится как "взять", а брать-то и нечего =)
Не сочти, что докапываюсь, место действительно вызвало недоумение.
24
DasBro, у тебя в проекте не предусмотрены достижения, в которых шаг прогресса меньше 1 сотой максимума? Иначе точность в любом случае теряется, даже если данные временно хранятся где-то еще и пересчитываются в прогресс только в конце какого-то этапа, хотя так и меньше потерь, чем от пересчета при каждом инкременте.
Что касается локализации - это отдельная тема, название то тоже надо было бы локализовать, если бы была предусмотрена локализация. Меня удивило именно отсутствие описания как такового - как игроку понять что делать надо, если он только название достижения видит. Разве что все достижения "секретные" и выдаются только по завершению.
13
Clamp, Да, но по факту я "беру" достижение из списка по идентификатору
prog,
у тебя в проекте не предусмотрены достижения, в которых шаг прогресса меньше 1 сотой максимума?
Разве что все достижения "секретные" и выдаются только по завершению
Да, именно. ИМХО, но мне кажется, что достижения должны быть без описания, так как описание требует от игрока что-то сделать, а так, ты ничего
не требуешь + игроку может стать любопытно, как получить то, или иное достижение.
19
Неоднократно видел реализацию, где о достижениях изначально игроку неизвестно ничего, кроме того. что они существуют. Порой это подталкивает на совершение безумных вещей и, как следствие, получение особого опыта от игры, даже если не приведет к получению ачивки. И тем более это реалистично в играх с пермасмертью - в духе "ура, я покоритель высочайшей горы!" "а че, ачивку не дали?" "ладно, будет гора еще круче, я ж сюда добрался"
Чтобы оставить комментарий, пожалуйста, войдите на сайт.