Jump to content
模组网
icedream

【Creation Kit 学习指南 18】编写任务脚本

Recommended Posts

概述

本教程将展示如何使用脚本提升依靠玩家行为的任务线。我们先前展示过如何给对话编写脚本,但是这里将展示如何将按照意愿编写的脚本与角色和游戏目标关联。

你将学到:

  • 脚本链接目标的基本构架
  • 如何在新的脚本语言中响应事件

(对于脚本的简单介绍,请参阅"Hello, World" 教程

Papyrus

Creation Kit使用的脚本语言被称为Papyrus,Papyrus脚本是一个普通的文本文件,编译成字节码后在游戏运行时执行。

新的系统和旧的TESScript很相似,但是思路上要略微改变。你不再可以熟练地控制目标;在脚本编写过程中可能因为困难而中断;你必须有耐心面对一系列括号。简而言之,它更像LuaPython之类的真正程序语言。如果你很熟悉TESScript,你可以参阅过渡教程

首先我们要添加关于一个贼被杀死的脚本,任务适当地更新。

添加脚本

打开我们之前创建的GSQThief角色。我们将关注"Papyrus 脚本"区域。

gallery_1_72_7854.png

点击“添加”按钮,打开我们可以对这个角色添加的脚本的列表。我们新建一个,在列表顶部双击"[新建脚本]"。

gallery_1_72_6007.png

这将会弹出另一个窗口,你可以在这里对脚本命名。输入名称"GSQThiefScript"并点击确认。

gallery_1_72_13940.png

现在你已对角色添加脚本。但是你会发现这里没有任何东西。

gallery_1_72_5264.png

属性

双击脚本名称打开属性窗口。然而,脚本不知道游戏中的目标及其链接的对象。我们用属性将目标勾在一起并使之影响其它。在此案例中,我们设置GSQ01为阶段20即盗贼被杀之时。所以我们应该对此设计脚本。

gallery_1_72_7982.png

点击窗口左下角的“添加属性”按钮。这是我们要创建属性的地方。在输入区域,从下拉选项中选择“任务”,或直接输入“任务”,名称区域输入"TutorialQuest",其余区域空白。

gallery_1_72_11586.png

现在我们告诉脚本我们关心的是"TutorialQuest",但是脚本不知道那个任务是什么。点击刚才的那个属性,,并点击窗口右侧的“数值编辑”。一个新的显示所有任务的下拉目录将出现,选择"GSQ01",并点击确定。

gallery_1_72_16959.png

编写脚本

现在我们需要添加属性,我们必须添加真正意义上的脚本!邮寄脚本名称并选择“资源编辑”从而打开脚本编辑器

gallery_1_72_7119.png

最上方一行(Scriptname GSQThiefScript extends ObjectReference)是我们创建脚本时编辑器提供的模板文件,下面的一些段落是我们制作的属性的版本号。

在文本底部,输入:

Event OnDeath(Actor killer)
    TutorialQuest.SetStage(20)
EndEvent

如果你对程序设计或脚本编写了如指掌,你将会很容易看懂这些内容,因此你可以选修“编写道具脚本”。但对于大多数人来说,我们应该按部就班地学习。

  • Event OnDeath(Actor killer)
    • 这一行表示角色死后脚本的反应。当指定角色死后,游戏将从这里执行代码。游戏将对杀死角色的那个人赋予变量"killer"
  • TutorialQuest.SetStage(20)
    • 如同在对话教程中我们对存在的任务命名SetStage一样,这将会设定阶段20
    • 缩进可以使之易读
  • EndEvent
    • 这个标志事件的终结

从文件目录选择“保存”(或按Ctrl+S),编辑器将自动编译脚本。输出窗口将弹出。如果哦脚本语法正确,将如下图所示:

gallery_1_72_9133.png

如果你在这里看到其它东西,那么脚本肯定错误。重新检查并编写!

一切完成,关闭脚本窗口和角色窗口,并保存插件。现在是对道具编写脚本的时候了。

编写道具脚本

打开上一章我们编写的GSQAmulet项目。脚本编写区域在护甲窗口的右边。

gallery_1_72_25233.png

按照先前的方法创造一个新脚本,并命名为GSQAmuletScript。添加一个任务属性,将"TutorialQuest"改为"GSQ01"。

gallery_1_72_33083.png

它将自动给属性赋值,由于你给属性一个按照存在ID命名的名称。如果你声明很多属性,这种方法将会节约很多时间。

打开脚本,我们将在此添加一个事件。护身符当然不能死亡,但是我们必须知道什么时候玩家捡起它。事件脚本将如下所示:

Event OnContainerChanged(ObjectReference newContainer, ObjectReference oldContainer)
    if (newContainer == Game.GetPlayer())
        GSQ01.SetStage(30)
    endif
EndEvent

编写脚本时有以下注意事项:

  • 声明的参数(newContainer和oldContainer) 将会在脚本处理事件时自动被游戏填写。
  • 因为无论何时这个目标被转手,OnContainerChanged事件都将激发。我们必须确保在玩家谈论它时我们只设定此阶段,因此锁住if/endif
  • Game.GetPlayer()是一个不设定属性而获取玩家的引用的方法,当激发事件时newContainer自动被程序填写,因此我们在第2行做一个比较,从而确定项目被移给玩家。
  • 当编写脚本时,SetStage必定在玩家捡起护身符时被调用。这并不会影响其它游戏内容,因为每个人物阶段只会发生一次,调用SetStage(30)只会在第一次起作用。

这个脚本以后依然可以继续。关闭脚本和护甲窗口并保存插件。

你现在能从头到尾运行这个任务,用控制台输入SQV检查阶段的改变。

虽然玩家不能对此使用控制台,但我们将在下章讲到如何给任务反馈信息。

在将脚本编译为字节码之前脚本将以文本文件的形式存在于data文件夹内。这意味着如果你用合适的编辑器,你能更改这些脚本。我们可以安装Sublime TextNotepad++,它们能将语法高亮、基本内容自动完成、简便编辑。如果你要大量编辑脚本,这些工具将会使其更为简单。

注意

输入错误的代码后,Papyrus 框可能会变得不稳定。窗口中选择OK,尝试重启CK应该能解决问题。

从 Papyrus 框中移除保存的脚本并不会自动删除游戏目录中的文件,这会对游戏测试产生影响。

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...