这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录前一修订版后一修订版 | 前一修订版 | ||
extend:prop [2023/09/14 13:02] – bibiboxs | extend:prop [2024/09/05 12:46] (当前版本) – bibiboxs | ||
---|---|---|---|
行 1: | 行 1: | ||
< | < | ||
# 游戏道具扩展 | # 游戏道具扩展 | ||
- | 在《沙盘引擎》世界框架中,**游戏道具**是极为重要的存在,任何基于角色手持物品的逻辑都属于游戏道具范畴。 | + | 在《沙盘引擎》世界框架中,**游戏道具**是极为重要的存在,==**任何角色可手持的物品都属于游戏道具范畴**==。 |
- | 无论何种类型的游戏玩法,角色手中的物品都能起到大作用,无论是显示作用还是实际使用,亦或是【背包系统】等扩展操作,游戏道具系统都可以便捷实现。 | + | 无论何种类型的游戏玩法,角色手中的物品通常都能起到很大作用。 |
+ | |||
+ | 有些只是显示作用、有些可能有实际使用功能,也可能搭配【Prop背包系统(抽象功能)】进行扩展操作。 | ||
+ | |||
+ | **此系统的扩展性很高,几乎可以实现绝大多数【游戏物品、武器、道具】相关需求。** | ||
行 9: | 行 13: | ||
## 游戏道具简介 | ## 游戏道具简介 | ||
- | 在默认情况下,沙盘引擎内所有的【游戏道具\物品】均**没有任何作用**,**它们只是看起来像XXX的一个模型**,必须由开发者根据实际游戏玩法,具体设定它们应该有何实际操作。 | + | 在沙盘引擎世界中,所有的【游戏道具\物品】全部基于抽象的概念,**实际上并没有任何默认作用**,**它们只是看起来像XXX的一个模型,通过API方式放到了角色手上**,开发者可根据实际游戏玩法需要,自行通过【自定义游戏道具+代码编写道具功能】设定它们应该有何实际操作。 |
- | 这需要开发者在`模组目录\Data\Prop\XXX.json`文件修改扩展有关【游戏道具】的Json配置文件,这其中可能包括`ID、模型、Flag、叠加数量、伤害、延迟时间、动画组`等数值设定,这将**直接影响到游戏道具的实际展现形式**。 | + | 想要将一个普通模型注册为**游戏道具**,需要开发者==找到`LocalMod\Store\Data\Prop`目录==,**新建或修改**有关【游戏道具】的Json配置文件,这其中可能包括==ID、模型、Flag、叠加数量、伤害、延迟时间、动画组==等数值设定,这将**直接影响到游戏道具的实际展现形式**。 |
- | ### 文件命名规范 | + | > **注意:动物等特殊类型角色不会有任何道具拾取功能及效果,==道具功能主要用于人形角色(包括僵尸)==。** |
+ | |||
+ | |||
+ | |||
+ | ## 配置文件规范 | ||
想要进行游戏道具的扩展维护,必须对文件使用特定的命名规范,否则引擎可能无法识别配置文件。 | 想要进行游戏道具的扩展维护,必须对文件使用特定的命名规范,否则引擎可能无法识别配置文件。 | ||
- | 命名规范:`ID_Name.json` | + | **命名规范:`GroupID_Name.json`** |
- | 例如:`10000_Base.json`(自定义ID从10000开始) | + | **例如:`10000_Base.json`(自定义ID从10000开始)** |
- | 这里需要注意,因为有些大型玩法模组可能会有【物品分类】等需求,所以游戏道具的配置文件**允许由多个Json(数组)文件组合而成**,如果游戏玩法相对简单,那么也可以只自定义一个json文件即可。 | + | ==**注意,自定义游戏道具的配置文件默认是以`Group组.json`的形式存在,也就是说,单个json文件内允许由多个配置项(数组)组合而成**。== |
+ | |||
+ | 因此,如果游戏玩法相对简单(或没有分类需求),那么可以只自定义一个json文件即可,不建议给每个道具都单独分配一个json。 | ||
> 举例:游戏只有少数20个道具,并且基本没有什么分类需求,那么可以只建立一个如`10000_GameItems.json`,只在此文件内配置全部道具即可。 | > 举例:游戏只有少数20个道具,并且基本没有什么分类需求,那么可以只建立一个如`10000_GameItems.json`,只在此文件内配置全部道具即可。 | ||
行 27: | 行 37: | ||
> 举例2:例如《我的世界》游戏,道具有方块、食物、工具等等很多内容,那么为了规范分类考虑,可以分别建立`10000_Cube.json | 10001_Food.json | 10002_Tool.json`多个文件,并将不同的物品配置编写在指定的分类json下。 | > 举例2:例如《我的世界》游戏,道具有方块、食物、工具等等很多内容,那么为了规范分类考虑,可以分别建立`10000_Cube.json | 10001_Food.json | 10002_Tool.json`多个文件,并将不同的物品配置编写在指定的分类json下。 | ||
- | *引擎API可能会**额外提供**一些根据物品分类筛选列表的功能,所以对于物品较多的游戏,分类是有必要的**(沙盘引擎的默认物品均进行了分类)**。* | + | ==*引擎API可能会**额外提供**一些根据物品分类筛选列表的功能,所以对于物品较多的游戏,分类编写物品可能是有必要的**。*== |
- | ## 道具配置设定 | + | ## 道具Json配置示例 |
+ | |||
+ | > 物品的组成是非常抽象且具有扩展性的,一个物品由多个不同属性组合而成,最终实现的效果、属性、动作、声音也都不相同。 | ||
+ | > | ||
+ | > 根据Key值顾名思义,不同的属性在不同特性(`Flags`)下可能有不同含义,对于部分基础属性(例如`Pos\Scale\Flags\Speed...`等属性),可以考虑省略部分配置(忽略则使用引擎提供的默认值)。 | ||
+ | > | ||
+ | > **例如:`ID`固然是不能省略的,但`Speed`默认值是`1.0`,所以如果没有`Speed`需求,即使不填写也不会出错。** | ||
+ | > | ||
+ | > **==注意:自定义道具与其他自定义操作一样,有关`ID`部分必须从`10000`开始。==** | ||
```javascript | ```javascript | ||
- | // | ||
[ | [ | ||
{ | { | ||
- | " | + | "ID": 10000, |
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | }, | ||
+ | { // | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | ] | ||
+ | ``` | ||
+ | |||
+ | | 属性Key | ||
+ | | ------------------- | ------------------------------------------------------------ | ---------------------------------------- | | ||
+ | | ID | 道具ID | ||
+ | | Model | 物品展示(拿在手中)的模型ID,基于模型管理机制 | ||
+ | | Pos | 模型本地坐标偏移(可空,默认中心) | ||
+ | | Angle | 模型本地角度偏移(可空,默认无旋转) | ||
+ | | Scale | 模型本地缩放偏移(可空,默认`1`) | ||
+ | | Color | 颜色属性(并非修改模型颜色,主要用于弹道、投掷弹道等颜色) | ||
+ | | Flags | **Flag特性类型,这将直接改变此物体的关键属性、效果、方式**< | ||
+ | | Multiple | ||
+ | | Damage | ||
+ | | DamageRange | ||
+ | | DamageShake | ||
+ | | Distance | ||
+ | | Direction | ||
+ | | Enum | 通用枚举\数值\索引属性 | ||
+ | | PreloadTime | ||
+ | | Speed | **物品每次Action时的动画速度,直接影响Action时间间隔(例如:枪械射速)**< | ||
+ | | MoveSpeedMultiplier | 手持物品时影响角色的移动速度(倍数) | ||
+ | | Audios[] | ||
+ | | Animations[] | ||
+ | |||
+ | |||
+ | | 特性Flag | 说明 | ||
+ | | -------- | ------------------------------------------------------------ | | ||
+ | | 0 | 默认(Normal) | ||
+ | | 1 | 不可攻击(Unavailable) | ||
+ | | 2 | 盾牌抵挡效果(Shield)< | ||
+ | | 4 | 连续使用效果(Continue),否则是单次触发 | ||
+ | | 8 | 散射范围,目前主要用于表示**散弹类枪械**< | ||
+ | | 16 | 三连发模式(Burst)< | ||
+ | | 64 | 行为时生成[Effect](scripting/ | ||
+ | | 128 | 预制类型:枪械类 | ||
+ | | 256 | 预制类型:投掷类(扔出XXX、投掷光线、弓、RPG、手榴弹等) | ||
+ | | 512 | 投掷后爆炸效果(必须同时搭配`256`使用) | ||
+ | | 1024 | 投掷后产生伤害(必须同时搭配`256`使用),伤害值与`Damage`有关 | | ||
+ | | 2048 | 投掷后产生烟雾(必须同时搭配`256`使用) | ||
+ | | 4096 | 投掷后产生闪光(必须同时搭配`256`使用) | ||
+ | | 8192 | 投掷后产生燃烧组(必须同时搭配`256`使用) | ||
+ | |||
+ | | Direction | 说明 | ||
+ | | --------- | -------------------------------------------------- | | ||
+ | | 0(默认) | ||
+ | | 1 | 角色正前方 | ||
+ | | 2 | 闲置时手持方向[0],行为时正前方[1] | ||
+ | | 3 | 闲置时正前方[1],行为时手持方向[0] | ||
+ | |||
+ | |||
+ | |||
+ | ## 自定义动作列表 | ||
+ | |||
+ | > **注意:此处内容仅用于【自定义道具——Animations】相关使用。** | ||
+ | > | ||
+ | > 道具手持动作是专门的动作池ID,无法与【角色自定义动作ID】相同使用。 | ||
+ | |||
+ | 道具动作主要支持`Idle|Focus|Action`三个状态(闲置、焦点、行为),具体动作ID参考[《世界资源实例汇总——道具绑定动作》](reference/ | ||
+ | |||
+ | 在以上三个状态之中,焦点(Focus)是可省略的动作,如果不填写`Focus`则默认设为-1,且与`Idle`状态同步。 | ||
+ | |||
+ | |||
+ | |||
+ | ## 使用道具及扩展 | ||
+ | |||
+ | > 当通过上述操作**成功注册\绑定**道具后,开发者可能希望在**游戏内使用新的道具**,或者给**不同的道具实现不同的功能**,请参考此部分操作。 | ||
+ | |||
+ | 1. 编写World脚本代码,建立相关角色,并使用`chara.SetProp()`功能【给予】角色一个道具到背包(注意道具ID要填写正确) | ||
+ | 2. 进入游戏内测试,如果没有报错的情况下,角色应该已经成功**手持(指定)新道具**(确保`chara.PropSlot`正确) | ||
+ | 3. 此时可能发现道具因模型尺寸、位置不同,导致拿在手里的样式等不太正确,这需要根据上方的Json示例调整几次,直到满意为止 | ||
+ | 4. 如果希望给道具绑定一些功能(例如:手持XXX,触发`Action`行为时做些什么,或者能否触发的前提条件),参考[《OnCharacterPropActionBefore及OnCharacterPropAction》](scripting/ | ||
+ | |||
+ | |||
+ | |||
+ | ## 实际使用示例 | ||
+ | |||
+ | > 根据上述介绍内容,这里以“如何自定义一个枪类武器”来解释。 | ||
+ | |||
+ | ```json | ||
+ | [ | ||
+ | { // | ||
+ | " | ||
" | " | ||
- | " | + | " |
- | " | + | " |
- | " | + | " |
" | " | ||
- | " | + | " |
- | " | + | " |
- | "Shake": 1.0, //每次触发使用时物品抖动范围(枪械类则为后坐力) | + | "DamageShake": 1.0, //射击的后坐力偏移(如果为0则没有后坐力) |
- | " | + | " |
- | " | + | " |
- | " | + | " |
- | " | + | " |
" | " | ||
" | " | ||
行 64: | 行 195: | ||
``` | ``` | ||
- | | Flag | 说明 | + | 在设定好道具的Json配置内容后,开发者便可以继续在**World脚本相关Action事件**实现对应的逻辑。 |
- | | ---- | ---------------------------------------- | + | |
- | | 0 | + | ```javascript |
- | | 1 | 不可攻击(Unavailable) | + | function OnCharacterPropActionBefore(character, |
- | | 2 | 盾牌抵挡效果(Shield) | + | { |
- | | 4 | 连续使用效果(Continue),否则是单次触发 | | + | // |
- | | 128 | 预制效果:枪类 | + | if(prop.ID == 10000) |
+ | { | ||
+ | // | ||
+ | if(prop.Data.Bullet == null || prop.Data.Bullet <= 0) | ||
+ | { | ||
+ | //返回0表示阻止使用(子弹不足) | ||
+ | return 0; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | //默认返回1(可省略填写) | ||
+ | return | ||
+ | } | ||
+ | |||
+ | function OnCharacterPropAction(character, | ||
+ | { | ||
+ | | ||
+ | if(prop.ID == 10000) | ||
+ | { | ||
+ | if(prop.Data.Bullet == null) prop.Data.Bullet = 100; // | ||
+ | if(prop.Data.Bullet > 0) | ||
+ | { | ||
+ | prop.Data.Bullet --; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | ``` | ||
+ | |||
+ | **补充:对于一些运行时动态调整属性(例如:`Damage\Speed...`等)修改需求,可参考[《World/ | ||
+ | |||
+ | |||
+ | |||
+ | ## 总结 | ||
+ | |||
+ | 针对游戏道具扩展部分的内容,经过沙盘引擎开发组的自我评估,**几乎很多扩展功能都可以通过上述内容实现**,具体取决于开发者**如何合理控制Json以及API的行为事件交互**。 | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
- | | Direction | ||
- | | --------------- | -------------------------------------------------- | | ||
- | | 0 | 手肘正前方向(因动作不同,可能并不是角色的正前方) | | ||
- | | 1(默认,常用) | 角色正前方 | ||
- | | 2 | 闲置时手持方向[0],行为时正前方[1] | ||
- | | 3 | 闲置时正前方[1],行为时手持方向[0] | ||
- | | Key | 说明 | ||
- | | ---------- | ------------------------------------------------------------ | | ||
- | | Animations | 包含关键动作组`Idle|Focus|Action`,采用`int`指向动作组ID(0=无动作)< | ||