Здравствуйте. Вы находитесь на сайте Unreal Level. Данный ресурс посвящен редакторам карт игр серии Unreal, UT и Gears of War. Основная цель сайта , помочь всем желающим освоить любой из редакторов вышеперечисленных серий. Наибольшим приоритетом на этом сайте, обладает редактор UnrealED for Unreal Engine 3 и редактор движка Unreal Engine 3.5, входящий в комплект разработки UDK, поскольку это наиболее актуальная на сегодняшний день технология.
Save system
автор: Snoopy | 22 Июля 2010 | Просмотров: 5918
Автор: ???
Перевод: Лекс?
Оригинал: Savegames using the configuration system


Обзор

Конфигурация системы Unreal Engine довольно мощная и зачастую требует сохранения многих переменных. Эта статья представляет собой метод создания системы сохранения игр для RPG, созданных на UDK.
Система сохранения игры будет использовать систему хранения пользовательского интерфейса (UI DataStore System) и директивы PerObjectConfig.
Предполагается, что читатель знаком с конфигурационными файлами UDK и синтаксисом C#. Если же нет, то почитайте статьи на эту тему (оригинал).

Sapitu

Sapitu (Savegames Are Possible In The UDK/Возможность сохранения игры в UDK) реализует простую систему для сохранения игр жанра RPG. Он обладает способностью сохранять персонажа и его инвентарь.
Вы можете скачать полный исходный код этого примера отсюда.
Sapitu делится на 4 класса. Программа также содержит 2 дополнительных класса: SapituGame и SapituPC, используемые только для игр с внедренной системой Sapitu.
Четыре класса Sapitu заключаются в следующем:

Sapitu - это основной класс, который управляет различными частями системы сохранения игр.
SapituCharacter  - этот класс хранит информацию о персонаже.
SapituInventory  - этот класс предмета инвентаря, который может принадлежать к SapituCharacter.
SapituItem  - этот класс используется в качестве базы данных для создания записи SapituInventory. Экземпляры этого класса предназначены только для чтения в рамках системы.

Класс Sapitu

Этот класс определяет какой-либо метод для управления, сохранения и загрузки новых символов. Он также содержит методы для создания новых предметов инвентаря и сохраняет ссылку на них в базы данных.

База данных

Метод loadItemDB инициализирует базу данных SapituItem и является частью системы хранения пользовательского интерфейса в Unreal Engine. Эта система также используется для получения информации о типах игры, карты, и оружии в UDK.
Метод getItem предоставляет средство для поиска фактических SapituItem (например, в текущей базе данных имя объекта (Object.name свойства). Это имя (точнее, идентификатор) является лишь программным именем.
База данных используется в системе инвентаризации, чтобы найти статичные предметы инвентаря (точнее ссылку на них).

Персонаж

Класс Sapitu является опорной точкой при сохранении и загрузке SapituCharacter.
Метод getCharacters возвращает список всех зарегистрированных на персонаже идентификаторов. Так же, как идентификатор элементов базы данных он относится к свойству Object.name (еще раз напомню, это не удобное читаемое в игре имя, а внутренний идентификатор!). Этот идентификатор необходим во время загрузки или сохранения персонажей. На ИД есть одно важное ограничение - он не должен содержать пробелов, только буквы в диапазоне [Aa-Zz] и цифры. Могу посоветовать давать им понятные имена, чтобы потом не запутаться.
Загрузка и создание символов, на самом деле похожие процедуры. Обе они используют следующий код:

myChar = new(none, "MyCharId") class'SapituCharacter';

Второй параметр, собственно, определяет название создаваемого/загружаемого объекта.
Для того чтобы провести четкое различие между загрузкой и созданием новых символов в Sapitu, мы сначала проверяем, существует ли данный идентификатор, а затем, соответственно, принимаем или возвращаем значение. Если объяснять понятней, то при загрузке мы принимаем при существующем ИД, а при сохранении возвращаем при отсутствующем ИД.
Загрузка персонажа еще не закончена, это только начало. Нам также необходимо инициализировать его инвентарь. SapituCharacter хранит список идентификаторов для SapityInventory items (SapituCharacter.inventoryRecord).

Инвентарь. Создание предметов

Предметы инвентаря создаются специальным образом. CreateInventory – это способ создать новый элемент инвентаря на основе данных SapituItem. Он создает уникальный идентификатор для инвентаря, а затем выполняет специальную конструкцию new(none, inventoryId) class'SapituInventory' . После этого будут загружаться различные переменные, которые были не определены SapituItem (например, как уровень, вес и стоимость).

Класс SapituCharacter

Этот класс определяется как:

class SapituCharacter extends Object config(Sapitu) perobjectconfig;

Это означает, что некоторые из переменных в классе будут сохранены в файле конфигурации UTSapitu.ini, и что для каждого объекта будет создан отдельный раздел. Последние является результатом работы директивы класса perobjectconfig. Имя объекта имеет важное значение при сохранении, например, потому что оно определяет название раздела.
Этот класс хранит различные конфиги переменных для имени персонажа (уже понятного для человека имени, а не ИД), здоровья и т.д.
Инвентарь персонажа сохраняется иным способом. Добавление и удаление предметов инвентаря должно быть сделано с помощью методов addInventory и removeInventory. Этот способ позволяет обновить массивы inventory и inventoryRecords. Массив inventory не может быть изменен непосредственно. Класс Sapitu запрещает это, но это особый метод. 
Вы не можете принимать значения из SaveConfig, потому что инвентарь не сохранится должным образом. Метод save перебирает массив инвентаря и принимает значения SaveConfig. Таким образом, все, что относится к персонажу сохраняется правильно.

Класс SapituInventory

Этот класс является фактически самим инвентарем. Он основан на классе SapituItem. Работа с этим классом такая же, как и с SapituCharacter.

SapituItem


В отличие от классов SapituCharacter и SapituInventory этот класс является подклассом UTUIResourceDataProvider. Он не объявляется, как config , потому что в родительском классе уже определена его конфигурация (объявлялось при помощи PerObjectconfig).
Также обратите внимание на bSearchAllInis=true в разделе defaultproperties. Эта переменная является частью системы хранения пользовательского интерфейса. Она определяет, что система хранения должна пройти через все файлы конфигурации, чтобы найти объекты.
Загрузка SapituItems не должна быть сделана на основе ранее упомянутой конструкции new(none,id). Чтобы получить все объявленные SapituItem, Вы должны использовать следующий код:

class'UTUIDataStore_MenuItems'.static.GetAllResourceDataProviders(class'SapituItem', ProviderList);

SapituItems объявляются вручную, путем добавления строки вроде этой:

[Sword1 SapituItem]
DisplayName = Короткий меч // Видимое имя
level=(min=1,max=10) // Уровень
weight=(base=10,levelMult=0.5) // Вес
value=(base=5,levelMult=1) // Значение


См. файл UTGameConfigSapituItemDB.ini для просмотра дополнительных примеров.

Примечания

Отметим также, что сохранение игры происходит в виде простого текста. Позаботьтесь о возможном читерстве. Так что лучше использовать сохранение в бинарный файл (двоичный код). Конечно от «про»  это не спасет, но от лишних глаз будет подальше.

Игра с Sapitu

Чтобы играть с этой системой, просто скомпилируйте исходник и начните игру со следующим параметром:

udk examplemap?game=sapitu.sapitugame

Класс SapituPC определяет команды, вводимые в консоли:

* createChar
* saveChar
* loadChar
* printChars
* showChar
* createRandomItem
* createItem
* pickupItem
* pickupAll
* findItems
* listItemTypes


Заметим, что система, представленная здесь это лишь один из нескольких способов создать систему сохранения игры.
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

#1 написал: FACH
22 Июля 2010 11:25 | ICQ: 562039160 |


Группа: Администраторы
Регистрация: 27.06.2009
С прошлым оформлением лучше и не выкладывать вообще.
Хоть бы Автора перевода узнал и разрешение на копию статьи было получено?


--------------------
Публикаций: 134 | Комментариев: 778      
#2 написал: alexut
22 Июля 2010 14:16 | ICQ: Не Указано |


Группа: Посетители
Регистрация: 12.12.2009
ооо!Я се пол года назад этот скрипт качнул,а чё с ним делать не знал!Спасибо!


--------------------
Публикаций: 0 | Комментариев: 46      
#3 написал: NewGame
22 Июля 2010 17:52 | ICQ: Не Указано |


Группа: Гости
Регистрация: Не Указано
Да этот скрипт фигня, тут другая система нужна...
Публикаций: 0 | Комментариев: 0      
#4 написал: Deadly-man
23 Июля 2010 12:47 | ICQ: Не Указано |


Группа: Посетители
Регистрация: 20.07.2010
Можно вопрос - как это интегрировать в проект?


--------------------
Публикаций: 0 | Комментариев: 7      
#5 написал: IVAN
23 Июля 2010 18:58 | ICQ: 459674072 |


Группа: Посетители
Регистрация: 26.03.2010
udk examplemap?game=sapitu.sapitugame как запустить с таким параметром?
Публикаций: 0 | Комментариев: 2      
#6 написал: eXsisteNz
25 Июля 2010 20:10 | ICQ: 616837370 |


Группа: Посетители
Регистрация: 17.11.2009
IVAN нужно открыть Unreal Frontend и в Map to Play вставить этот параметр
Публикаций: 0 | Комментариев: 10      
#7 написал: smitt
9 Августа 2010 03:48 | ICQ: 358667420 |


Группа: Модераторы
Регистрация: 22.12.2009
хе,я кому то скидывал её:)
Публикаций: 0 | Комментариев: 12      
#8 написал: Deadly-man
14 Августа 2010 12:57 | ICQ: Не Указано |


Группа: Посетители
Регистрация: 20.07.2010
Да уж... Эта система - фигня...


--------------------
Публикаций: 0 | Комментариев: 7      
#9 написал: smitt
16 Августа 2010 07:32 | ICQ: 358667420 |


Группа: Модераторы
Регистрация: 22.12.2009
сделай лучше
Публикаций: 0 | Комментариев: 12      
#10 написал: Chris
8 Октября 2010 20:36 | ICQ: Не Указано |


Группа: Посетители
Регистрация: 21.09.2010
а кто знае, как создать сохранялку для шутеров?
Публикаций: 0 | Комментариев: 1      
#11 написал: FACH
8 Октября 2010 21:43 | ICQ: 562039160 |


Группа: Администраторы
Регистрация: 27.06.2009
вообще там уже типа этого есть - быстрая загрузка и сохранение, но полноценную систему, думаю, просто так никто не скажет)


--------------------
Публикаций: 134 | Комментариев: 778      
#12 написал: STALKERADENT
11 Февраля 2012 19:35 | ICQ: Не Указано |


Группа: Посетители
Регистрация: 12.01.2011
ну а как мне скомпилировать чтоб в консоли команды работали типа Save и Load а этот сапиту выдает ошыбку
Публикаций: 0 | Комментариев: 2      
Информация
Посетители, находящиеся в группе Гости, не могут оставлять Комментарии в данной новости...






При копировании материалов, активная ссылка на UNREAL-LEVEL.RU обязательна!
© 2008—2012, UNREAL-LEVEL.RU. Все права защищены.