跳转到内容
模组网
icedream

【Creation Kit 学习指南 21】包

被推荐的帖子

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

  • 角色行为表的运作方式
  • 怎样为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模板.

分享此帖子


帖子链接
分享到其他网站

创建账户或者登录再讨论

您需要成为会员才能留下讨论

创建账户

在本社区注册新账户。很简单的!

注册为新账户

登录

已有账户?这边登录

马上登录

×