游戏(例如遗忘)任务是如何建模的? [关闭]

Posted

技术标签:

【中文标题】游戏(例如遗忘)任务是如何建模的? [关闭]【英文标题】:How are game (e.g. Oblivion) quests modeled? [closed] 【发布时间】:2011-11-12 13:53:17 【问题描述】:

几天前我刚刚开始玩上古卷轴IV:遗忘,我不禁想知道的一件事是如何以编程方式处理任务系统?

具体来说,游戏中有数十个(数百个?)任务甚至子任务,所有这些都以多种方式反映在游戏的环境中:从特定时间/地点在游戏中发生的脚本事件特定人之间(假设他们还活着),相关任务项目(其中一些与特定 NPC 和任务状态相关联),与不同 NPC 的不同对话(同样,具有可以通过以下方式更改的复杂树)与其他 NPC 的对话以及任务的一般状态)。

此外,您可以随时在活动/非活动任务之间切换,因此这些从根本上影响您周围环境的复杂动态行为通过完全可互换而更进一步。

这似乎是一场合乎逻辑的噩梦,我很难理解如何以编程方式定义如此深刻和丰富的东西,如此看似完美无缺。

有没有人在这类事情上有经验,可以(广泛地)解释这类系统的内容?

【问题讨论】:

找到答案的一种非常直接的方法是在官方世界编辑器中打开游戏,看看他们如何建模这些数据。编辑器包含在游戏中。 【参考方案1】:

我只是在这里猜测。没有做过这种编程,但我在玩 RuneScape 时想了很多关于他们是如何做到的。

可能有一堆标志和变量与您的帐户相关联,并且随着您完成任务,它们的值会发生变化。起初,角色 X 被标记为活着,在位置 Y。后来,她被标记为在位置 Z。然后,她死了。因此,当您输入位置 Y 时,它会检查变量以查看她是否在那里,并将她的对象放在那里或不放在那里。同时,另一个尚未开始任务的玩家可以在同一区域内看到完全不同的东西。

【讨论】:

如果你看看 Oblivion Scripting 引擎,这实际上就是他们做很多事情的方式。甚至很多任务反应性的东西也只是他们设置的标志。我听说新的 Skyrim 引擎并非如此,它使用了更先进的动态技术。【参考方案2】:

我不是游戏设计师,但我可以在这里看到一些可能在起作用的东西......

Object Oriented Programming 通过将数据和逻辑巧妙地封装在许多对象中来实现这种复杂性和动态性。这些对象可以“口头”交互,使用对象间消息将任务委托给彼此。消息的发送者不需要知道接收者将如何解释消息,而将操作方法​​完全留给接收者。就像在现实世界中一样,委托可以让事情更顺利地进行。

例如,当您从纽约市的 Del Posto 订购蘑菇烩饭时,您是否会通过回到厨房直接与厨师交谈来订购?你穿上围裙自己准备意大利调味饭吗?你开车到最近的蘑菇农场自己采蘑菇吗?不,你没有。您只需将这些任务分别委托给服务员、厨师团队和农产品供应商。要得到你的蘑菇烩饭,你需要做的就是告诉服务员你想要它。其余的通过委托链自动完成。您的游戏中可能存在这种相同类型的委托。

现在,回到对象。一些对象从父对象继承数据和逻辑,这样就可以有很多共同的数据/逻辑;让我们称这些兄弟姐妹。在游戏任务的示例中,每个任务都可能是它自己的“任务对象”,基线数据和逻辑继承自父“任务父级”。通过添加与特定任务相关的额外数据/逻辑,可以将任务兄弟姐妹彼此区分开来。

根据您在游戏中的操作(也许还有您在游戏菜单中的选择),游戏对象可以将一个活动任务对象换成它的同级对象之一。很多时候,这可以通过一个非常简单的命令来完成(在伪代码中,而不是仿照任何特定的编程语言):

gameObject.activeQuest -> getCurrentObject(); 
//returns the object containing all of the data/logic of the current active quest:
Gibbons_GoldenArtifacts
//Let's say the quest description is "Scour the Catacombs of Gibbon for a 
mysterious treasure"

gameObject.activeQuest -> setCurrentObject(Gibbon_DefeatGhost)
//sets the activeQuest object (note that QUEST OBJECT contains baseline data/logic)
//assuming, say, Gibbon_DefeatGhost is an object like so:

Gibbon_DefeatGhost=QUEST OBJECT;
Gibbon_DefeatGhost.extend(
    description="Defeat Gibbon's ghost to retrieve his golden artifacts";
    objective="Defeat Gibbon's ghost";
    questNPC="Gibbon's ghost";
    questLocation="Gibbon's Inner Sanctum"
    questTriggers[1]="When PLAYER enters Gibbon's Inner Sanction: Release Gibbon's ghost"; 
    questTriggers[2]="When Gibbon is slain: Drop Gibbon's golden artifacts"
)

从那时起,游戏对象本身可能会像往常一样与活动任务对象进行交互,但活动任务对象可能会以不同于同级任务对象的方式感知这些交互,从而导致在不同的游戏体验中。

希望我不会在这个问题上完全捏造小丑......

【讨论】:

仅供参考,这个网站上有很多关于 OOP 的信息。【参考方案3】:

A finite-state machine (FSM) or finite-state automaton (plural: automata), or simply a state machine, is a behavioral model used to design computer programs. It is composed of a finite number of states associated to transitions. A transition is a set of actions that starts from one state and ends in another (or the same) state. A transition is started by a trigger, and a trigger can be an event or a condition.

【讨论】:

以上是关于游戏(例如遗忘)任务是如何建模的? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何创建 x 数量的任务,例如 list.Count 的依赖? [关闭]

如何利用UML建模来编写软件任务书?

什么算作 CPU 密集型任务(例如排序、搜索等?)[关闭]

从任务管理器中隐藏进程

Java并发编程学习14-任务关闭(上)

在 Angular 中打开和关闭后台任务