Мои Заметки. Система внутриигровых достижений в Unity3d

» опубликован
Всех приветствую! Сегодня я хочу немного рассказать о том, как я писал свою систему достижений. А гуру могли бы дать совет, хороший ли мой
способ или нет.
Итак, достижения я реализовывал через 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, поэтому у меня нет сложности записывать все данные по достижениям.

 

Просмотров: 242

Мышкоблудка #1 - 2 месяца назад 1
2-я картинка битая
А так вполне познавательно выглядит, даже я вполне поняла =D
DasBro #2 - 2 месяца назад 0
Мышкоблудка, Исправил, спасибо за отзыв :)
BrEd Pitt #3 - 2 месяца назад 0
Как всегда полезно, делаю заметки для себя (пока оформляю диздок одной своей штукенции)
DasBro #4 - 2 месяца назад 0
BrEd Pitt, Что за штукенция?)
BrEd Pitt #5 - 2 месяца назад 0
рогалик
DasBro #6 - 2 месяца назад 0
BrEd Pitt, А где нибудь можно узнать о твоём проекте?
BrEd Pitt #7 - 2 месяца назад 0
пока что нет. Я только начал утверждаться с концепцией, да и учеба будет отнимать достаточно времени, поэтому разработка будет идти очень медленно. Как пример приведу лишь то, что саму идею оформлял около года, "работая напильником" и учитывая возможные недостатки.
я ж очень педантичный и дотошливый
prog #8 - 2 месяца назад (отредактировано ) 2
DasBro,
А как же локализуемый описательный текст достижения, неужели одного названия достаточно?
Ну и хранение прогресса в процентах в целочисленной переменной приведет к сбоям если инкремент будет больше одной сотой от максимума.
ИМХО, я бы вобще напроч разделил описательную часть и реализацию подсчета результатов - глобальная библиотека со всеми доступными достижениями отдельно, подсчет прогресса по каждому из них отдельно.
Clamp #9 - 2 месяца назад 0
Прошу прощения, но...
public void Get...
Оно точно так должно выглядеть?
DasBro #10 - 2 месяца назад 0
prog, На счёт локализации согласен, но т.к. я приводил пример со своего проекта, где локализация не предусмотрена, то я обошёлся только названием. На счёт сбоя, тут тоже верно подмечено, моя ошибка, что привёл пример со своего проекта т.к. у меня планируются достижения без постоянного подсчёта прогресса.
А так, ваша мысль любопытна для более серьезных проектов. Только вот как вы бы связывали прогресс с достижением?
Clamp, Смотря что вы подчеркиваете, модификатор доступа или префикс, или может то, что метод ничего не возвращает? Если дело в префиксе, то
не знаю, мне показалось это наиболее значимым для данного метода.
BrEd Pitt, Занятно, будет любопытно взглянуть, когда будет что посмотреть/почитать
Clamp #11 - 2 месяца назад 0
то, что метод ничего не возвращает?
Это самое. "Get" переводится как "взять", а брать-то и нечего =)
Не сочти, что докапываюсь, место действительно вызвало недоумение.
prog #12 - 2 месяца назад (отредактировано ) 0
DasBro, у тебя в проекте не предусмотрены достижения, в которых шаг прогресса меньше 1 сотой максимума? Иначе точность в любом случае теряется, даже если данные временно хранятся где-то еще и пересчитываются в прогресс только в конце какого-то этапа, хотя так и меньше потерь, чем от пересчета при каждом инкременте.
Что касается локализации - это отдельная тема, название то тоже надо было бы локализовать, если бы была предусмотрена локализация. Меня удивило именно отсутствие описания как такового - как игроку понять что делать надо, если он только название достижения видит. Разве что все достижения "секретные" и выдаются только по завершению.
DasBro #13 - 2 месяца назад 0
Clamp, Да, но по факту я "беру" достижение из списка по идентификатору
prog,
у тебя в проекте не предусмотрены достижения, в которых шаг прогресса меньше 1 сотой максимума?
Разве что все достижения "секретные" и выдаются только по завершению
Да, именно. ИМХО, но мне кажется, что достижения должны быть без описания, так как описание требует от игрока что-то сделать, а так, ты ничего
не требуешь + игроку может стать любопытно, как получить то, или иное достижение.
BrEd Pitt #14 - 2 месяца назад 0
Неоднократно видел реализацию, где о достижениях изначально игроку неизвестно ничего, кроме того. что они существуют. Порой это подталкивает на совершение безумных вещей и, как следствие, получение особого опыта от игры, даже если не приведет к получению ачивки. И тем более это реалистично в играх с пермасмертью - в духе "ура, я покоритель высочайшей горы!" "а че, ачивку не дали?" "ладно, будет гора еще круче, я ж сюда добрался"