Jump to content
模组网
icedream

【Creation Kit 学习指南 21】包

Recommended Posts

前言
本教程将会展示如何为角色配置他的行为包(控制角色行为) , 使其遍步世界 .
读者将会了解以下知识点:

  • 角色行为表的运作方式
  • 怎样为NPC设置简单的日程表
  • 怎样建立一个新 行为包

行为包 以及 角色行为表
"行为包" - 是 在 CreationKit 里 指示角色执行行为的模块 .
同一时间 , 每个角色仅能执行一项行为包 (..如 睡觉、吃饭、闲逛、巡逻、打铁冶炼 等等...)
但角色何时该执行哪个行为呢 ? 这便有了 "角色行为表" . 原则上 , 每个角色都有个 表示 待执行 的 行为表 . 游戏会定时检查表中列出的行为包 . 先从表首开始 , 逐个校验行为包是否有效 . 满足以下两个条件的行为包,为有效行为包 :

  • 该包可被执行的先决条件为真值
  • 当前时间满足了 该包的执行时间表

之后 , 角色便执行 排在最前面的 被确认为有效的行为包.
另: 玩家附近的角色会频繁的刷新他们的行为表 ; 而卸载了地图信息区域的角色则几乎不刷新...
一份简单的时间表
让我们试着给我们的老伙计 Bendu Olo 设置一个时间表,看看会发生些什么.(在继续往下看前,建议先了解一下教程:"创造一名参与者".)
打开 GSQBenduOlo 并翻到 AI Packages(AI行为包)标签 , 如下图:
gallery_1_72_95942.jpg
当前 , 他的 AI Package List (AI行为包列表) 里没有任何行为包 , 所以只能整天在原地站着发呆 . 我们得让他干点什么 , 让他看起来更像个人.
为角色(AI行为包列表)添加行为包, 右键点击该列表 并在弹出菜单里选择“Add(添加)” 或直接把 ObjectWindow 里的行为包给拽过来。我们用上面第二种的方案操作 -- 先在 (Object Window的)“Object List”里“Character” 标题内找到 “Package”标题。将“Package”对应的列表拖动直到看到名称类似"Default..."的(如下)(我们约定这种命名法表示行为包不专用于任何特定场合,可以适用于任何角色)
gallery_1_72_169439.jpg
我们可以用这些预设的行为包为老 Bendu Olo 打造一份简单的时间表...比如:他在家里吃早/晚餐,晚上就睡觉,其它时候就在家里随便逛逛..
就吃而言 , 先找找默认的 "eat(吃)"行为包 ,我们选用了 DefaultEatEditorLoc8x1 (早餐) 和 DefaultEatEditorLoc18x1 (晚餐) (注:这里命名采用 开始时间x持续 格式 来说明行为包的时间) 所以"8x1"就是说行为包开始与早上8点,持续1小时;"18x1"则是说开始于下午的六点,同样也是持续1小时.但名字可以与实际设定无关,所以我们得检查一下这些行为包的设置,确保没错..
打开这两个行为包,并检查它们的"Schedule(时间表)"标签,如下图
gallery_1_72_78559.jpg
嗯,它们的名字与时间表时间相符.好,这就把它们拖入BenduOlo的package list(AI行为包表)里,如下图:
gallery_1_72_83912.jpg
如前所述, 行为包的先后顺序在行为包表里的重要作用是:角色只会执行表里最靠前的有效行为包. 但就这两个行为包而言,并没受到作用的影响. 因为两者执行时间表并无冲突: 上午8点到9点之间, "DefaultEatEditorLoc8x1"生效;下午6点到7点之间, "DefaultEatEditorLoc18x1"生效;其它时间两者均不生效.所以此处改变行为包的顺序也不会出现问题. 但接下来 我们将要加入Bendu Olo的下一个行为包,顺序就为成为时间表正常运作的关键.
前面提到过我们得安排他在晚上睡觉 , 于是我们在行为包对象列表 里找到了默认的睡眠行为包 DefaultSleepEditorLoc1x8 , 这个或许并非最好的选择 , 但却可以让我们了解 顺序 在行为包堆栈表里的重要性.
如果你够仔细 , 就会发觉这个睡眠行为包的有效时间在 凌晨1点到上午9点之间..与Bandu的早餐(DefaultEatEditorLoc8x1)时间重叠在 上午8点到9点的时间段处.. 这里便出现了顺序导致的问题..
设 : 我们将该睡眠包作为 Bandu 行为表的 首项 如下:
gallery_1_72_73125.jpg
由最高的有效行为包"胜利"的规则可知, 上午8点的时候 Bendu 会继续睡 并继续持续到9点..而吃 被放在了稍低的位置而完全没有执行 ,即使它也符合时间条件.
如果要使他工作 , 只需要在Bandu的行为库序列里 将睡眠包移动到早餐行为包之下,如下:
gallery_1_72_36216.jpg
现在 , 一到凌晨1点 , 他就会开始睡眠 (执行"DefaultSleepEditorLoc1x8") , 在那段时间里唯一有效的行为包 . 一到上午8点 , Bendu 就会去吃早餐 (执行"DefaultEatEditorLoc8x1") , 因为这个时候 早餐 成为了最高的行为包 - 所以Bendu只睡了 7小时 (而不是行为包里的8小时) ..但却没有错过他的早餐..
这样我们的时间表就很好的架起了Bendu的一天 - 他用2小时吃东西 ,用7小时睡觉 ... 嗯.. 还可以继续在他的日程表里添加更多的日常行为包.. 但现在而言 , 最好做法法是给他安排一个 "应变"的 行为包 来对应时间表以外的行为.. 这个行为包不能有条件和时间限制 ...就是:总是有效的.. 所以,得放在他行为表的末尾..
通常用沙盒行为包 达到这个目的.. :这玩意会让NPC 在附近(相对)区域,随机的做一些事情.. 所以很适合在不知道让NPC干什么,却又希望他做些平常事 时的情况
于是我们选用 DefaultSandboxHomeowner 行为包. 并看看它里面有什么..
gallery_1_72_66306.jpg

  • "Location(位置)" 区设置是 "Near editor location, radius 1500"- 意思是他将随机在本身所处位置半径1500单位(大概可以覆盖一个小型室内型建筑的面积)内. 仔细的你还可以发现 其他 "default-"前缀的行为包 都在用"Near editor location" - 因为没有指定绝对的位置 , 因此可适用于任何角色.
  • 另外一个有用的特点是 "Unlock On Arrival = True". 意思是只要一到该 行为包 的执行时间段 , Bendu 就会开启他家门的锁 - 当他是一位任务委托人时 ..这非常有用 - 我们可不希望他躲在锁住的门后面..
  • 你可以翻开它的 Conditions(条件) 和 Schedule(时间表) 标签 确认没有条件和时间限制 - 总是有效 (这正是我们想要的).

于是,我们把这个行为包放在了Bendu的行为表最后. 他现在终于有了一个又完整又简单的时间表 :
gallery_1_72_19120.jpg
如果你想看看他在做什么 , 载入游戏 并 移动到他身边

coc MixwaterMillWorkersHouse

想看看他不同时间的行为 , 你可以这么修改游戏的时间:

set gamehour to 2

于是 , 他便能在家里做一些简单的行为了. 如 吃/睡/闲逛 等.
新建一个包
既然了解了如何用 "默认"系列的packages 去构建时间表. 试着为Bendu 量身定做一个 Package 如何? 比如我们可以设想 他将在白天特定的时间里到屋外的院子里活动一下..
首先,建立一个新package只需要右键点击 Package List( 需定位) 并选择"New". 得到如图所示的空白 package.
gallery_1_72_28157.jpg
默认状态下,(定位:模板值) Travel template 是被预设的 -但我们需要做的是 Patrol ,所以在那个下拉式列表里选 "Patrol" (模板) ..留意 Package Data 列表的改变 - Patrol template(package Template,行为包模板)需求的参数与Travel 模板不同.. 在我们手里的是一个 原始 的 Patrol package, 我们设定其参数为Bendu打造一个合身的 package
gallery_1_72_2487.jpg
现在,我们只需要为此 package 设定:

  • 巡游起点 - Bendu 在哪里开始他的巡游?
  • 时间表 - 此package 将在何时(日)执行?

另外,还忘了给Bendu设置巡游的路线. 于是,我们载入室外的地图,为他设计一个简单的..(如果你早些时候打开了内部空间(Bendu的家(室内)),只需要双击黄色的 门标记 ,便可以简洁的到达室外地图位置 ,或 双击 cell List 中, Tamriel worldspace 里的 MixwaterMillExterior .
我们马上得建立一条3个转折点的巡游路线:

  • 将一个 XMarkerHeading 放置到 render(渲染?观景 观察 ..窗口) window.
  • 按CTRL-D将它复制 2 次
  • 用3个 markers (记号)组成一条美观的路线(3角形..何其美观)..并 通过 每个 实例(标记)窗口中的 Linked Ref 标签 将它们link(连接/双端串)起来..

You should end up with something looking like this (the exact locations of the patrol markers doesn't matter): 完成后,看起来应该是这个样子..
gallery_1_72_571.jpg
回到package window, 选中 Patrol Start 并点击右面的按钮 (按钮名会变(它原来应该是叫"Linked Ref")). 现在你可以设置Patrol Start 的参数了 - 确认 "Specific Reference" 单选项 并选择你那新建路线的其中一个标记(选哪个标记无所谓,因为你已经把3个点炼成环了...)
gallery_1_72_19627.jpg
接下来我们得将Bendu巡游的时间给定下来 (否则,他就只会干"巡游"这事..(因为这事没有时间约束,又占据package stack的高位)..).. 翻到 Schedule 标签页(package window 里), 我们设置 他在外活动的时间是 上午的 10点 到 12点:
gallery_1_72_37898.jpg
最后我们将给这个package 命名 - "GSQBenduPatrol10x2" - 使用了标准命名法 - 按下 "OK" ,便做成了一个新 package .
现在我们把做好的新 package 放到 Bendu 的 package list 里 ,看看是否Bendu 会否有所改变. 在 Object window 里的 Package 节 找到我们的新 package. 把它拖到 Bendu(角色实例)的AI Package List 里, 新包会先默认放到 原有角色 package 列表的底部,而我们需要将这个package置于列表首项(或至少比DefaultSandboxHomeowner package要高 - 否则新 package 将被DefaultSandboxHomeowner package 褫夺所有执行的机会..). 用 << 箭头按钮来改变新package 在Bendu 的 AIpackageList 中的位置(..stack..):
gallery_1_72_60237.jpg
按 OK 完成对 Bendu 的角色窗口的操作,并保存你的 小插件. 打开游戏看看Bendu怎么跑他的新圈..

coc MixwaterMillExterior
set gamehour to 10

就这样..你了解了通过预设或新建packages 的方式 设置角色packages的做法.. 预设的模板可以满足你多数情况下的 package应用需求.如果你需要更多特定行为..你也可以通过新建Package模板,来创建你自己的 package模板.

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...