UDN
Search public documentation:

ConfigSavegameSystemCH
English Translation
日本語訳
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 主页 > 输入 / 输出 > 使用配置系统保存游戏

使用配置系统保存游戏


_文档概述:本文档解释了如何使用标准的配置系统来创建一个保存游戏系统。

概述


虚幻引擎的配置系统是非常强大的,它的应用不仅仅是保存各种设置。本文档展现了它为 RPG 的游戏创建保存游戏系统的方法。

通过灵活地应用 UI 数据仓库系统和 PerObjectConfig 命令可以获得保存游戏系统。

在您开始学习这篇文档之前,请阅读 ConfigurationFiles(配置文档)页面来了解配置文件在虚幻引擎中的工作原理。

Sapitu


Sapitu(它是 Savegames Are Possible In The UDK(在 UDK 中保存游戏是可能的)的简称)为 RPG 游戏实现了一个简单的保存游戏系统。它具有存储人物及其它的武器的能力。

您可以从这里下载这个实例的完整源代码

Sapitu 被分为 4 个类。下载资料同时包含了 2 个额外的类: SapituGameSapituPC ,这些类仅用于从游戏中使用 Sapitu 系统。

Sapitu 的 4 个类如下所示:

  • Sapitu : 这是一个主要类,用于管理保存游戏系统的各种资源。
  • SapituCharacter : 这个类存储了人物信息。
  • SapituInventory : 这个类是可以属于一个 SapituCharacter 的武器项。
  • SapituItem : 这个类被用作为数据库目录,用于创建 SapituInevntory 项。这个类的实例在系统中是只读的。

Sapitu

这个类定义了一些方法来管理新的人物的创建及加载。它也包含了创建新的武器项的方法,并且它保留一个到项数据库的引用。

项数据库

方法 loadItemDB 初始化了 SapituItem 实例的数据库。它要求所有的 SapituItem 定义都在配置文件中。这是虚幻引擎中的 UI 数据仓库系统的一部分。这个系统在 UT3 也用于查找关于游戏类型、地图以及武器的信息。

getItem 方法提供了一种在当前数据库中查找指定的对象名称的实际 SapituItem 实例的方法。这个名称(或者标识符)是一个内部名称。在您的最终游戏中,或许永远都不会把这个名称显示给玩家。

武器系统使用项数据库来查找武器项的静态定义。并且也需要引用该数据库来创建新的武器项。

人物

Sapitu 类也是加载和创建 SapituCharacter 实例的入口点。人物系统使用正常的配置系统和 PerObjectConfig 类命令。

getCharacters 方法返回所有注册的人物的 ID 的列表。与数据库中的项的标示符一样,这是指向 Object.name 的属性。它不是一个用户优化的名称,但是它是一个内部的标示符。在加载及创建人物的过程中需要这个标识符。由于使用名称的使用的方法决定,名称有一个重要的限制。名称中不应该包含空格及各种其它的非字母字符。最好遵守只为 id 使用字母字符的原则。

人物的加载和创建实际上是类似的。这两个操作都是使用以下代码完成的:

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

New 操作符中的第二个参数是很重要的。这个参数决定了要创建的对象的名称。因为 SapituCharacter 被定义为 PerObjectConfig ,所以它将加载具有那个给定名称的对象的配置。

因为我们想对在 Sapitu 中加载和创建新的任务之间加以区别,所以我们首先将会检测给定的标示符是否存在,然后在决定接受或拒绝加载或创建操作。

人物的加载是通过创建合适的实例来完成的。我们也需要初始化它的武器。=SapituCharacter= 存储了一系列的 SapityInventory 项的标示符 ( SapituCharacter.inventoryRecord )。通过使用类似的方式创建这些选项并将其添加到武器项 实例 SapituCharacter.inventory 的列表中。请参照 loadCharacter 方法获得具体实现。

武器项创建

武器项需要以特殊的方式进行创建。一个武器项是基于 特定的 SapituItem 实例的。 createInventory 方法将会基于给定的 SapituItem 创建新的武器。它为武器实例构建一个唯一的标示符,然后执行专用的 new(none, inventoryId) class'SapituInventory' 构造函数来创建武器项。进行这项操作后,它将会初始化 SapituItem 实例中松散定义的各种变量,比如关卡、权重及值。

创建的武器项不属于任何任务,事实上,它没有被保存到 save 文件中。所以,当您退出游戏时,这个实例也将消失。当人物的武器项在它的 inventory(武器库)中时,这些项将由任务实例来保存。

SapituCharacter

这个类的定义如下

class SapituCharacter extends Object config(Sapitu) perobjectconfig;

这意味着在类中的某些变量将会被保存在配置文件 UDKSapitu.ini 中,并且会为每个对象创建一个独立的部分。后面是 perobjectconfig 类命令的结果。当保存实例时,对象的名称是很重要的,因为它定义了部分名称的一部分。

这个类为人物名称(它是用户友好的名称)、生命值等定义了各种配置变量。人物的武器库可以按照不同的方式来存储。因为对象变量不能是一个配置变量,我们将会记录所有武器项(它们是字符串)的标识符。然后保存那个列表。这意味着需要额外的管理来管理这些武器库。

必须使用 addInventoryremoveInventory 方法来添加和删除武器项。这些方法既更新 inventory 也更新 inventoryRecords 数组。不能直接修改 inventory 数组。=Sapitu= 在加载过程中执行了这个操作,但这是特殊情况。

另外,必须以一种可替换的方法来保存人物。您不能直接地调用 SaveConfig ,因为那不能正确地保存武器。=save= 方法将会迭代整个武器数组,同时在每项上调用 SaveConfig 函数,然后在它们的本身上调用 SaveConfig 。这种方式将可以正确地保存属于这个人物的所有东西。

注意: SapituCharacterSapituInventory 实例都不能保存在 Sapitu 系统中的其它任何地方。

SapituInventory

这个类是武器项的一个真正实例。它是基于 SapituItem 类的特定实例的。这个类的声明方法和 SapituCharacter 一样。

因为这个实例是基于 SapituItem 的,所以关于重新创建适当的引用时需要特别地小心。它可以通过前面提到的 Sapitu 类来完成。

SapituItem

这个类定义了从中创建武器项的项类型。这个类应该被认为是一个随机的数据库入口。

SapituCharacterSapituInventory 类不一样,这个类是 UDKUIResourceDataProvider 的子类。没有把它声明为 config ,因为父类已经定义为 config 类。它被声明为 PerObjectconfig

和其它的类一样,这也定义了一组 config 变量。这些变量用于创建一个项定义。

同时注意,在 defaultproperties 部分中的 bSearchAllInis=true 入口。这个变量是 UI 数据库 系统的一部分。它定义了数据库系统将会仔细检查所有配置文件来找到这项的对象。

SapituItems 的加载不能通过之前提到的 new(none,id) 构造器来完成。要想获得声明的 SapituItem,您可以使用以下代码:

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

(请参照 Sapitu.loadItemDB 方法)

SapituItems 是通过手动定义的。在运行时,它将永远不会改变。要想声明一个项,只要简单地创建一个配置文件。然后像这样添加项即可:

[sword1 SapituItem]
DisplayName=Short sword
level=(min=1,max=10)
weight=(base=10,levelMult=0.5)
value=(base=5,levelMult=1)

请参阅源代码中的 UDKGame\Config\SapituItemDB.ini 文件获取更多示例。

保存游戏存储


人物和武器项保存在文件 UDKGame\Config\UDKSapitu.ini 中。请参照下载资料中的文件来查看一个现有的“savegame(保存游戏)”。注意,所有的人物和武器都保存在同一个文件中。

同时要注意保存为纯文本。您可能担心潜在的欺骗。但是对于离线的单玩家游戏来说,您可以总是通过修改 save game(保存游戏)来进行欺骗。这个 save game(保存游戏)是纯文本还是二进制文件无关紧要。

使用 Sapitu


要使用这个系统玩游戏,简单地编译源代码并运行游戏即可,如下所示是:

udk examplemap?game=sapitu.sapitugame

SapituPC 类定义了一些您在使用这个系统时可以使用的一组控制台命令:

  • createChar name
  • saveChar
  • loadChar charId
  • printChars
  • showChar
  • createRandomItem
  • createItem baseItem
  • pickupItem itemId
  • pickupAll
  • findItems
  • listItemTypes

下载