*一、 设计目的*

· 定义通用的交互物系统,支持游戏内交互相关的功能。

· 方便后续对不同类型的交互物进行扩展。

*二、 应用分类*

image-20230811104434548

*三、 应用举例*

交互物类型示例

*四、 流程图*

image-20230811104452451

*五、 功能概述*

· 交互物是可以与玩家进行简单互动的静态(一般不会移动)物体,比如花、草、宝箱、门等常用物品,暂时不涉及能因形态变化而带来功能变化的交互物(这类复杂交互物,届时单独定义功能)。

· 另外,这里提到的交互物都是客户端的交互物,即玩家之间不共享。举例说明,城门口有一个宝箱,如果玩家A去交互后,那么对于玩家B来说,在我们的实现方案里,玩家B也是可以在同样的位置与同一个宝箱(玩家A交互过的城门口的那个宝箱)交互的。

· 交互物系统由三部分构成:交互物基本信息、交互过程、交互后的触发。

· 如上图,交互物的基本信息由:交互物的外观配置、交互限制、交互范围组成。

· 交互过程由:交互列表和交互过程的变化组成。

· 交互后的触发就涉及较多了,比如触发发奖、自己是否消失、对话、获得任务、刷新怪物等功能。

*六、 功能详述*

· 首先,交互物需要有自己独立的ID段,这部分和程序确认后再定。

· 另外,这部分功能暂时不涉及在场景中生成交互物。本文最后会提到一些调试命令,用以对相关功能进行测试。

· 下面就按功能概述中的分类来详细说明交互物的功能。

*1. 交互物基本信息*

· 交互物基本信息分为:

 o 外观

 o 限制

 o 交互范围

 o 可见范围

*1.1 外观*

· 交互物的外观分为:

 o 名字,暂定限制为20个汉字。默认值为“可交互的物品”。如下图红框部分:

image-20230811104459258

 o 模型,指决定交互物外观的配置(需要支持配置空模型,比如配置一些特殊操作),具体如下图红框:

img

 o 初始待机动作,类似花、草这类有一定飘动的交互物就需要配置初始待机动作(需要支持配置空动作,比如宝箱)。如下GIF:

 o img

 o 提示特效,用于提醒玩家,这个物品可交互(需要支持空特效,比如宝箱),提示特效如下GIF中,闪耀的白光(可能还会用到2D的图标以替代这里的特效,但暂不需求):

 o img

*1.2 限制*

· 这里的限制需要按照模板项的构成方式来运行,即任中一项的限制不满足,则都不能交互,即不出现交互列表。

· 涉及前置条件类的限制暂时不处理,后续考虑引入一套通用的前置条件判断来处理。所以当前只处理最基础的等级判断。

· 交互物的交互次数与交互物的次数在玩家之间共享的问题也有考虑,暂不处理。

· 交互物的限制分为:

 o 等级,达到XX等级才可以交互。如果玩家等级没达到就来交互,则在交互后提示“请XX等级后,再来探索吧!”默认值为0(暂无提示系统,确定如何测).形式如下图:

 o img

 o 默认可交互的次数为1次,不用配置。

 o 战斗状态可否交互,默认值为否,这里不可交互,指的是连后文提到的交互列表都不出现。

 o 交互所需物品,即当玩家拥有(背包)需求的某物品时,才能和交互物交互成功。且在交互完成后,需要扣除这个物品。比如一个上锁的门,就需要玩家拥有钥匙的时候,才能打开。如果玩家没有需求的物品,则需要弹出适当的提示。

*1.3 交互范围*

· 交互范围是交互物与玩家的距离、朝向满足条件后,可以将交互物显示在交互列表(见下文)上的范围。需满足的条件有:

 o 玩家的交互范围,这是一个设定好的范围。要让交互物出现在玩家的交互列表上,首先要满足交互物出现在玩家的交互范围内。这部分应由别的系统配置(讨论下怎么配置,现状为没有)。如下图:

image-20230811104642089

 o 交互物的交互范围,具体分为:

§ 朝向,这里指的是交互物的正面的方向。这个朝向具体在后续的布置部分处理。

§ 角度,这里的角度是以交互物正面为基准,左右分别二分之一的角度。需要配置一个度数,默认值为180度,即交互物的正面都可以交互。这个字段需要程序用360取余数,如果取余后的最终配置为0,则认为是360度。

§ 半径,决定玩家离交互物多远就可以交互了(交互物出现在交互列表上),需要配置一个米数,默认值为2米。

§ 交互范围示意如下图:

image-20230811104648349

其中,中间的箭头X就是上述的朝向,角度是a+b的角度之和。另外半径=M=N 。

红线范围为不可交互范围。

*1.4 可见范围*

· 即玩家离交互物多远就能看到交互物。

*2. 交互过程*

· 交互过程分为交互列表与交互过程的变化。

*2.1 交互列表*

· 交互列表由多个交互物的交互选项构成,但是后续还需要支持掉落物也能通用在这个列表上,这里提一下仅为程序在实现上,可能需要考虑后续的这种扩充需求。

· 交互选项如img,是交互列表中的一个交互物的索引。

· 按当前的现状,交互列表也需要增加和NPC的交互部分,即交互物、NPC、掉落物,只要满足各自的限制与范围,就能同时出现在交互列表上,只不过在交互列表中选择了NPC后,会走向NPC自己的后续交互、触发逻辑,比如对话等。包含多类型的交互列表如下:

image-20230811104605896

· 当玩家靠近交互物,且满足上述限制时,会在界面上弹出交互列表,如下图:

image-20230811104615588

· 多个交互物可同时出现在交互列表上,玩家通过鼠标滚轮来切换当前选择的交互物,并用按键F完成交互。如果是在手机上,则直接通过点击列表里面的项来直接与交互物交互。需要注意的是,这里暂时不涉及其他的交互方式,比如长按、连点、组合键等操作。

· 最多可显示5个交互物,默认选择第一个进入交互列表的交互物。

· 当周围的交互物超过5个时,则按就近原则优先显示靠玩家较近的5个交互物。其余的交互物显示则藏在滚轮可以滑动到的位置。若玩家移动了,则以实时的玩家与交互物的位置关系来显示交互列表。

· 每一个交互物都可以配置一个交互列表图标,默认为某个通用的图标。如下图红框:

· img

*2.2 交互过程的变化*

· 交互动作的起始距离,是在玩家点击交互列表里面的选项后,当玩家的距离满足这个交互动作的起始距离且面向交互物时,才会开始播放玩家的交互动作。与交互半径不同的是:

 o 玩家在上述交互半径的范围内可以点击交互列表里面的选项来开启交互。但是,此时,开启交互的点不一定是一个适合播放交互动作的点。

 o 所以需要配置一个交互动作的起始距离,即玩家在点击交互列表里的选项后,还要移动(程序控制)到距离交互物正面(还有转向处理)X厘米的地点才能开始播放后续的交互动作。

 o 默认的X米为0厘米,即玩家点击交互列表里的选项后,就直接开启后面的交互过程。

 o 注意,这里的配置单位是厘米,即支持粒度更小的调试配置。

 o 交互物动作的起始距离如下示意图:

image-20230811104624981

· 如上图,红线之间的范围即“交互动作的起始距离”的配置范围,需要限制,交互动作的起始距离小于等于交互半径,但大于等于

· 玩家动作,这里只需要配置一个动作名字或ID,当玩家在交互列表中确认选择一个项目后,程序判断上述的“交互动作的起始距离”这个配置,如果满足,最后再播放这个动作。默认值为空动作。

· 交互物动作,与上述的玩家动作同时开始,且也是配置一个动作名字或ID。默认值也为空动作。

· 交互时交互物动作延迟播放秒数,在实际的应用中,交互物的动作是相对于玩家动作要慢一点的,为了灵活应对这种情况,增加一个延迟播放的时间配置,单位是毫秒。

*3. 交互后的触发*

· 在玩家与交互物完成交互后,即上文提到的流程(比如完成了交互过程)都结束后,还有可能会触发一些后续的事件,具体为:

 o 外观变化

§ 交互后待机动作,配置一个动作名或ID,默认值为空动作。举例:一个宝箱初始的待机动作为关着的,在交互过程中,播放了交互动作。但是在播放结束后,还需要一个持续循环着的开着的动作。

§ 交互后待机特效,同上,部分情况可能还需要加一个特效。

 o 发奖

§ 普通奖励,对应现状的drop ID,但是这里的奖励主要是对应直接进背包的奖励,不涉及场景表现。

§ 掉落奖励,后续会做,留个配置口子,对应比如怪物死亡后,散落在场景内的奖励,如装备等物品。

 o 消失

§ 是否消失,如果配置“是”,则程序不用记录这个交互物的状态,在交互完成后,将交互物摧毁即可。后两项配置只有在此字段配置为“是”时,才会生效。如果为“否”,则交互物不消失,且消失时间为多久,那么程序就需要记录这个被交互玩的状态多久。比如一个苹果,玩家交互后,这个苹果就直接被摧毁了(有作为物品的苹果进玩家包)。再比如一个一次性门,玩家开了门,那么只要这个门的消失时间没到,则这个门对于玩家来说,就一直是开着的。当消失时间到了后,这个门被摧毁。一个BOOL配置,默认为会消失。

§ 消失特效,消失需要一个表现,这里配置特效名字或ID。默认值为空特效。

§ 消失时间,也即交互物交互后多久会消失。默认值为1秒。

 o 对话

§ 普通对话,即交互物在交互后会触发一个对话,比如2D头像带文字的普通喊话类对话。

§ AVG,交互后触发一段演出。

§ CG,交互后触发一段CG。

§ 原则上,这里的对话形式只能出现一种,如果出现并行的情况,则播放优先级为CG覆盖AVG,AVG覆盖普通对话。

 o 获得任务,配置一个任务ID,默认值为0,即不触发任务。当配置了任务ID后,当玩家与交互物交互完成后,则直接将这个ID的任务发放到玩家身上(玩家接到任务的表现由任务系统处理)。

 o 召唤怪物,当玩家与交互物交互完成后,在这个交互物X米的范围内,随机刷出Y个怪物,生存时间为Z秒。这里默认值是怪物ID=0,X=4,Y=1,Z=1800。只有当怪物的ID配置了,后面的怪物数量、生存时间才会生效。先实现这种基础的功能,也可能不用。

 o 召唤NPC,功能同上。

 o 召唤交互物,功能同上。

 o 这里也需要提到一点,就是后续交互物完成交互后,可能还需要触发类似关卡脚本事件的功能,这部分还得看后续确定方案如何。

*七、 调试命令*

create interact 交互物ID

在玩家朝向的1米处创建一个交互物。

也可简写为 ci 交互物ID。

show interact all 米数

在控制台显示以玩家为中心,半径为“米数”参数范围内的所有交互物的信息。信息的组织方式为 “交互物ID 交互物名字 交互物模型”

也可简写为 sia 米数

*八、 配置项*

· 此配置表为程序与策划的参考表,实际以功能验收部分的PPT为准,模板项的形式和配置方法不唯一。

模板项 模板数据
交互物ID INT型
备注 STRING型
交互物名字 STRING型
模型 STRING/INT型(看配置名字还是路径相关的ID)
初始待动作 STRING/INT型
提示特效 STRING/INT型
等级 INT型
战斗状态可否交互 BOOL型
交互所需物品ID INT型
交互所需物品数量 INT型
交互所需物品不足提示 STRING型
交互角度 INT型
交互半径 INT型
交互物多远可见 INT型
交互物图标 STRING/INT型
交互动作的起始距离 INT型
交互时的玩家动作 STRING/INT型
交互时的交互物动作 STRING/INT型
交互时交互物动作延迟播放秒数 INT型
交互后的待机动作 STRING/INT型
交互后的特效 STRING/INT型
交互后发放普通奖励 INT型
交互后发放掉落奖励 INT型
交互后是否消失 BOOL型
交互后的消失特效 STRING/INT型
交互后的消失时间 INT型
交互后发放普通对话 INT型
交互后发放AVG INT型
交互后发放sequence INT型
交互后发放任务 INT型
交互后召唤怪物的ID INT型
交互后召唤怪物的刷新半径 INT型
交互后召唤怪物的生存时间 INT型
交互后召唤怪物的数量 INT型
交互后召唤NPC的ID INT型
交互后召唤NPC的刷新半径 INT型
交互后召唤NPC的生存时间 INT型
交互后召唤NPC的数量 INT型
交互后召唤交互物的ID INT型
交互后召唤交互物的刷新半径 INT型
交互后召唤交互物的生存时间 INT型
交互后召唤交互物的数量 INT型